Spring学习笔记之四----基于Annotation的Spring AOP编程
2015-09-02 16:01
441 查看
你能使用@Aspect annotation将某个Java类标注为Aspect,这个Aspect类里的所有公有方法都可以成为一个Advice,Spring提供了5个Annotation去将某个方法标注为Advice:@Before、@After、@AfterReturning、@AfterThrowing、@Around;为了启用基于annotation的AOP编程,你需要在Application Context文件中插入<aop:aspectj-autoproxy/>标记;
@Before、@After、@AfterReturning、@AfterThrowing、@Around都接受一个expression作为pointcut;
@Before标记的方法可以接受一个JointPoint类型的参数去获取切点的信息;
@After标记的方法可以接受一个JointPoint类型的参数去获取切点的信息;
@AfterReturning标记的方法除开可以接受一个JointPoint类型的参数外,你还可以获取切点的返回值;方式是将@AfterReturning的returning属性设置为Advice方法需要接受的参数名,然后在Advice方法中添加该参数;
@AfterThrowing标记的方法除开可以接受一个JointPoint类型的参数外,你还可以获取切点抛出的异常,方式是将@AfterThrowing的throwing属性设置为Advice方法需要接收的参数名,然后在Advice方法中添加该参数,该参数的类型可以使一个Throwable类型,也可以是一个具体的异常类型;取决于你想捕获哪些异常;
@Aroung标记的方法可以接受一个ProceedingJointPoint类型的参数;
如果有多个Aspect同时应用到相同的切点,Aspect的优先级是未确定的;你可以通过两种方式来做到:
让Aspect实现Ordered接口;
在Aspect上加上@Order annotation;
注意,无论你使用哪种方式,你都要指定一个数字值代表优先级,这个值也高代表优先级越低;
从上面可以看到,pointcut都是直接定义在advice上的,如果我们想让一个Pointcut定义在多个Advice上,我们可以在Aspect中单独定义一个空方法体的方法,并将其标注上@Pointcut annotation,这个方法的访问修饰符就代表了这个方法的可见性;其他的Advice可以通过这个方法名来引用这个Pointcut;很多标注Advice的Annotation,如@Before、@After、@AfterReturning、@AfterThrowing、@Around都提供了一个pointcut属性来引用这个方法名(如果这个Advice与定义Pointcut的方法不在同一个类里面,还得指明类名,如果不在同一包里面,还得指明包名);
如果想让一个Pointcut被多个Aspect共享,最好是把它放在一个公共的类里面;
@Before、@After、@AfterReturning、@AfterThrowing、@Around都接受一个expression作为pointcut;
注意:标记了@Aspect的类不会被Spring Container识别到,所以你还得在这些类上面标记@Component annotation;
@Before标记的方法可以接受一个JointPoint类型的参数去获取切点的信息;
@After标记的方法可以接受一个JointPoint类型的参数去获取切点的信息;
@AfterReturning标记的方法除开可以接受一个JointPoint类型的参数外,你还可以获取切点的返回值;方式是将@AfterReturning的returning属性设置为Advice方法需要接受的参数名,然后在Advice方法中添加该参数;
@AfterThrowing标记的方法除开可以接受一个JointPoint类型的参数外,你还可以获取切点抛出的异常,方式是将@AfterThrowing的throwing属性设置为Advice方法需要接收的参数名,然后在Advice方法中添加该参数,该参数的类型可以使一个Throwable类型,也可以是一个具体的异常类型;取决于你想捕获哪些异常;
@Aroung标记的方法可以接受一个ProceedingJointPoint类型的参数;
如果有多个Aspect同时应用到相同的切点,Aspect的优先级是未确定的;你可以通过两种方式来做到:
让Aspect实现Ordered接口;
在Aspect上加上@Order annotation;
注意,无论你使用哪种方式,你都要指定一个数字值代表优先级,这个值也高代表优先级越低;
从上面可以看到,pointcut都是直接定义在advice上的,如果我们想让一个Pointcut定义在多个Advice上,我们可以在Aspect中单独定义一个空方法体的方法,并将其标注上@Pointcut annotation,这个方法的访问修饰符就代表了这个方法的可见性;其他的Advice可以通过这个方法名来引用这个Pointcut;很多标注Advice的Annotation,如@Before、@After、@AfterReturning、@AfterThrowing、@Around都提供了一个pointcut属性来引用这个方法名(如果这个Advice与定义Pointcut的方法不在同一个类里面,还得指明类名,如果不在同一包里面,还得指明包名);
如果想让一个Pointcut被多个Aspect共享,最好是把它放在一个公共的类里面;
相关文章推荐
- Spring AOP问题
- log4j2 与 spring mvc整合
- Java____Eclipse下JUnit单元测试(初级)
- struts2配置文件解读
- java 总结(一)
- eclipse中使用git
- 在eclipse中使用Lombok
- Java之——Spring4+Hibernate4+Atomikos3.3多数据源事务管理
- 用Java命令生成jar,war包
- java.lang.IllegalStateException: The specified child already has a parent. You must call removeView(
- Spring Data JPA 进阶
- 详解Java回调机制 (Callback) 讲解+实例
- MyEclipse “Import cannot be resolved” error
- Spring获取bean的步骤
- Spring MVC 中 HandlerInterceptorAdapter的使用
- Spring获取bean的步骤
- Struts2 part 2:Action的编写方式
- SpringMVC拦截配置
- java工厂设计模式
- JAVA操作Excel文件