Spring框架AOP的理解应用

spring三大特点:IOC,DI,AOP。当然DI也属于IOC的操作。

          AOP即 Aspect Oriented Program 面向切面编程。首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 。所谓的周边功能,比如性能统计,日志,事务管理等等。周边功能在Spring的面向切面编程AOP思想里,即被定义为切面 。在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发。然后把切面功能和核心业务功能 "编织" 在一起。

     aop的应用体现在何处呢?

举个例子,写项目的时候,写了几个A,B,C业务功能,过了几天之后,项目经理让你给这几个业务都加个性能测试,然后你就在这三个业务功能上有都写了几行代码,,又过了几天,项目经理又让你给这几个业务都加上日志分析,于是又得在每个业务代码上加上好多代码,经理又说之前的性能不用了,你又得撤掉。。于是我们就需要把这些与业务无关的代码抽离出来,这个相分离的过程即是aop的体现(有点过滤器的味道。。)。

 

     AOP核心概念

1、横切关注点

对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点

2、切面(aspect)

类是对物体特征的抽象,切面就是对横切关注点的抽象。即是切点和增强的组合。

3、连接点(joinpoint)

被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器

4、切入点(pointcut)

对连接点进行拦截的定义

5、通知。也叫增强(advice)

所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类

6、目标对象

代理的目标对象,目标业务

7、织入(weave)

将切面应用到目标对象并导致代理对象创建的过程

8、引入(introduction)

在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段。

实现AOP的方式有通过xml、或者通过注解的形式。

1.通过xml配置。

同时切面类要实现相应的接口。。具体不介绍这种方法。

2.通过注解的形式。

xml中只需要两句话。

开启注解扫描:

 

用动态代理的形式启动对aop的支持。。

同时定义一个切面类,类上方要加入@Compnent和@Aspect。标识这是一个切面类。

 

用AspectJ注解声明切面

[1]@Before:前置增强,在方法执行之前执行

[2]@After:后置增强,在方法执行之后执行

[3]@AfterRunning:返回通知,在方法返回结果之后执行,带有返回值returning

[4]@AfterThrowing:异常通知,在方法抛出异常之后执行

[5]@Around:环绕通知,围绕着方法执行,即方法前后都执行。

这两个要一致,才能返回方法的返回值。

环绕增强:

红线部分不可省略。

 

切入点表达式

作用

通过表达式的方式定位一个或多个具体的连接点。

语法细节

①切入点表达式的语法格式:execution([权限修饰符] [返回值类型] [简单类名/全类名] [方法名]([参数列表]))
②举例说明

表达式 execution(* com.atguigu.spring.ArithmeticCalculator.*(..))
含义 ArithmeticCalculator接口中声明的所有方法;第一个“*”代表任意修饰符及任意返回值;第二个“*”代表任意方法;
“..”匹配任意数量、任意类型的参数;若目标类、接口与该切面类在同一个包中可以省略包名。

 

表达式 execution(public * ArithmeticCalculator.*(..))

含义 ArithmeticCalculator接口的所有公有方法

 

表达式 execution(public double ArithmeticCalculator.*(..))

含义 ArithmeticCalculator接口中返回double类型数值的方法


表达式 execution(public double ArithmeticCalculator.*(double, ..))
含义 第一个参数为double类型的方法;“..” 匹配任意数量、任意类型的参数。


表达式 execution(public double ArithmeticCalculator.*(double, double))
含义 参数类型为double,double类型的方法


③在AspectJ中,切入点表达式可以通过 “&&”、“||”、“!”等操作符结合起来。
表达式 execution (* *.add(int,..)) || execution(* *.sub(int,..))

含义 任意类中第一个参数为int类型的add方法或sub方法。。

 

转载请注明出处。。谢谢。。

 

 

 

 

 

 

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值