spring的AOP基础、前置通知与后置通知

来源:互联网 发布:过期未注册域名查询 编辑:程序博客网 时间:2024/04/30 21:03
AOP(Aspect-Oriented Programming,面向切面编程)是一种新的方法论,是对传统OOP(Object-Oriented Programming,面向对象编程)的补充
AOP的主要编程对象是切面(aspect),而切面模块化横切关注点
在应用AOP编程时,仍然需要定义公众功能,并且不必修改受影响的类,这样一来横切关注点就被模块化到特殊的对象(切面)里
AOP的好处
每个事物逻辑位于一个位置,代码不分散,便于维护和升级

业务模块更简洁,值包含核心业务代码

AOP的相关术语

切面(Aspect):横切关注点(跨越应用程序多个模块的功能)被模块化的特殊对象
通知(Advice):切面必须要完成的工作
目标(Target):被通知的对象
代理(Proxy):想目标对象应用通知之后创建的对象
连接点(Joinpoint):程序执行的某个特定位置:如类某个方法调用前、调用后、方法抛出异常后等。连接点由两个信息确定:方法表示的程序执行点;相对点表示的方位。例如ArithmethicCalculator#add()方法执行前的连接点,执行点为ArithmethicCalculator#add();方位为该方法执行前的位置
切点(point):每个类都拥有多个连接点:例如ArithmethicCalculator的所有方法实际上都是连接点,即连接点时程序类中客观存在的事物。AOP通过切点定位到特定
的连接点。类比:连接点相当于数据库中的记录,切点相当于查询条件。切点和连接点不是一对一的关系,一个切点匹配多个连接点,切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条件

AspectJ:java社区里最完整最流行的AOP框架,在Spring2.0以上版本中,可以使用基于AspectJ注解或基于XML配置的AOP。

在Spring中启用AspectJ注解支持
1 要在Spring应用中使用AspectJ注解,必须在classpath下包含AspectJ类库:aopalliance.jar、aspectj.weaver.jar和spring-aspects.jar
2 将aop Schema添加到<beans>根元素中
3 要在SpringIOC容器中启用AspectJ注解支持,只要在bean配置文件中定义一个空的xml元素:<aop:aspectj-autoproxy>
4 当SpringIOC容器侦测到bean配置文件中的<aop:aspectj-autoproxy>元素时,会自动为与AspectJ切面匹配的bean创建代理

用AspectJ注解声明切面
要在Spring中声明AspectJ切面,只需要在IOC容器中将切面声明为bean实例,当在

SpringIOC容器中初始化AspectJ切面之后,SpringIOC容器就会为那些与AspectJ切

面相匹配的bean创建代理在AspectJ注解中,切面只是一个带有@Aspect注解的Java类
通知是标注有某种注解的简单的java方法
AspectJ支持5中类型的通知注解
 @Before:前置通知,在方法执行之前执行
 @After:后置通知,在方法执行之后执行
 @AfterRunning:返回通知,在方法返回结果之后执行
 @AfterThrowing:异常通知,在方法抛出异常之后执行
 @Around:环绕通知,围绕着方法执行

利用方法签名编写AspectJ切入点表达式
最典型的切入点表达式是根据方法的签名来匹配各种方法:
1,execution * com.test.ceshi.beans.ArithmeticCalculator.*(..):匹配ArithmeticCalculator中声明的所有方法,第一个*代表任意修饰符及任意返回值,第二个*代表任意方法。..匹配任意数量的参数.若目标类与接口与该切面在同一个包中,可以省略包名

2,execution public * ArithmeticCalculator.*(..):匹配ArithmeticCalculator接口的所有公有方法.
3,execution public double ArithmeticCalculator.*(..):匹配ArithmeticCalculator中返回double类型数值的方法
4,execution public double ArithmeticCalculator.*(double,..):匹配第一个参数为double类型的方法,..匹配任意数量任意类型的参数
5,execution public double ArithmeticCalculator.*(double,double):匹配参数类型为double,double类型的方法。

步骤
1 加入jar包


2 在配置文件中加入aop的命名空间
3 基于注解的方式
  1 在配置文件中加入如下配置
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

  2 把横切关注点的代码抽象到切面的类中.
   切面首先是一个IOC钟的bean,即加入@Component
   切面还需要加入 @Aspect注解
   在类中声明具体通知
   声明一个方法
   在方法前加入@Before注解
可以在通知方法中声明一个类型为JoinPoint的参数,然后就能访问链接细节,如方法名称和参数值

前置通知


后置通知
 后置通知实在连接点完成之后执行的,即连接点返回结果或者抛出异常的时候,下面的后置通知记录了方法的终止
一个切面可以包括一个或者多个通知。

知识点讲完了,下面看示例,我一般喜欢贴示例,运行下就明白了。

相关类:



0 0
原创粉丝点击