首页 > 技术文章 > AspectJ的注解方式实现AOP

shibit 2017-07-02 12:10 原文

1.引入spring基础包
2.引入aspectJ的jar包
  com.springsource.org.aopalliance-*.jar
  com.springsource.org.aspectj.weaver-*.jar

3.spring.xml加入相关配置

    <!-- 设置使用注解的类所在的包 -->
    <context:component-scan base-package="net.shibit.*"/>
    <!-- 使AspectJ注解起作用:自动为匹配的类生产代理对象 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

4.实现目标类

public class AServiceImpl implements AService {  
  
    public void barA() {  
        System.out.println("...");  
    }  
}

5.定义切面类

@Order(1)
@Aspect
@Component
public class LoggingAspect {

    private final Logger logger = Logger.getLogger(LoggingAspect.class);
    
    @Before("execution(* net.shibit.service.*.*(..))")
    public void serviceBeforeMethod(JoinPoint joinPoint) {
        **
        logger.info(..);
    }
}

@Aspect 定义切面类
@Componet 将这个类加入Spring的IOC容器;
@Order(1) 指定切面的优先级,数值越小优先级越高

切入点表达式execution(* net.shibit.service.*.*(..))
  第一个*号:表示返回类型,*号表示所有的类型。
  第二个*号:表示类名
  括号里面表示方法的参数,两个句点表示任何参数。
通知类型
  @Before 前置通知,在方法执行之前执行
  @After 后置通知,在方法执行之后执行
  @AfterRunning 返回通知,在方法返回结果之后执行
  @AfterThrowing 异常通知,在方法抛出异常之后执行
  @Around 环绕通知,围绕着方法执行

实现AOP,目标(target)类就需生成动态代理。注意
  1、目标类如果实现了某一个接口,那么Spring就会利用JDK类库生成动态代理。
  2、目标类没有实现某一个接口,那么Spring就会利用CGLIB类库直接修改二进制码来生成动态代理,需要引用CGLIB类库
参考
  http://shamrock.blog.51cto.com/2079212/1557639
  http://www.cnblogs.com/yeming/p/5444959.html
  http://zhuchengzzcc.iteye.com/blog/1504014
  http://blog.csdn.net/wangpeng047/article/details/8560694

 

推荐阅读