AspectJ的注解方式实现AOP
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