面向切面程序设计分析:Spring AOP框架中代理的选择和使用
作者:
攻城狮Chova | 来源:发表于
2021-08-31 23:22 被阅读0次
-
AOP类型的选择:
-
AspectJ框架
-
Spring AOP框架
- 两种AOP类型分为基于XML配置文件的风格和基于 @AspectJ注解的风格
-
AspectJ和Spring AOP比较:
-
AspectJ:
-
AspectJ在功能完善度方法更具有优势
-
AspectJ使用静态织入的方式实现AOP
- 依赖于特定的编译器ajc
-
Spring AOP:
-
Spring AOP中并没有提供完整的AOP功能,更加注重的是和IOC容器的结合来解决横切业务问题
-
Spring AOP使用动态代理构建内部机制的动态织入的方式实现AOP
-
Spring AOP只是使用了和AspectJ相同的注解,但是底层是通过动态代理技术实现AOP
- 不依赖于AspectJ特定的编译器ajc
-
基于XML配置文件的风格个基于@AspectJ注解的风格比较:
-
基于XML配置文件的风格:
-
aop:config
-
proxy-target-class : 是否作为代理的目标类,默认为false
-
expose-proxy : 是否暴露代理的Bean. 如果暴露,就可以通过Spring AopContext获取到代理的Bean. 默认为不暴露
-
aop:pointcut
-
pointcut的解析是生成一个BeanDefinition, 并将配置的id,expression等属性保存到BeanDefinition中
-
BeanDefinition的ID来自配置的id属性,如果没有配置就自动生成ID
-
BeanDefinition的class就是AspectJExpressionPointcut
-
BeanDefinition的scope为prototype
-
aop:advisor
-
advice-ref : 必须的属性.这里的advice必须实现org.aopalliance.aopAdvice的子接口
-
pointcut-ref : 构建一个RuntimeBeanReference对象指向员pointcut的引用
-
aop:aspect
-
ref: 必须的属性. 用来指定AOP中的标签是哪一个bean, 类和对象的方法
- aop:declare-parents
-
优点:
- 基于XML配置文件由POJO支持,可以从配置文件中清楚地看出系统存在哪些方面Aspect
-
缺点:
- 基于XML配置文件没有完全封装在一个地方,需求点Joinpoint分为支持Bean类的声明和配置文件中的XML
- 基于XML配置文件只支持单例的实例化切入点Pointcut模型,不能组合XML中声明命名的切入点
-
基于@AspectJ注解的风格:
- 基于 @AspectJ的注解支持额外的实例化模型和丰富的切入点组合
- 基于 @AspectJ的注解可以将所有信息封装在一个模块Aspect中,将Aspect保持为模块化单元的优点
- 基于 @AspectJ的注解可以很方便地迁移到AspectJ框架中
-
Spring AOP中代理的选择:
-
Spring AOP中的代理机制没有默认使用的代理 : (SpringBoot中默认开启了proxyTargetClass,默认都是使用CGLIB代理)
- 如果代理的是实现接口的类,则使用JDK动态代理. 只要代理的类实现了至少一个接口,那么目标类型实现的接口都将会使用JDK动态代理
- 如果代理的是子类,没有实现任何接口,则使用CGLIB代理
- 也可以对实现接口的类强制使用CGLIB代理,需要满足以下条件:
- 不能对final修饰的方法添加通知Advice, 因为final修饰的方法无法被覆盖
-
CGLIB代理中为了获取对目标类的引用,代理类必须要继承目标类,并且代理类会覆写所有public和protected方法,在内部将调用委托给目标类
-
Spring 3.2之后不需要将CGLIB添加到项目类路径中,因为CGLIB已经包含在jar包spring-core中
-
Spring 4.0之后,因为CGLIB代理实例通过Objenesis创建,所以代理对象的构造函数不会被调用两次 ,CGLIB代理类不会初始化构造代理类自身继承的任何成员变量.想要访问只能通过getter和setter方法. 只有当JVM不允许时,才会有SpringAOP支持的双重调用
- 使用CGLIB代理时,需要将 <aop:config /> 的proxy-target-class属性设置为true
- 如果使用 @AspectJ自动代理时需要强制使用CGLIB, 需要将 <aop:aspectj-autoproxy /> 的proxy-target-class属性设置为true
本文标题:面向切面程序设计分析:Spring AOP框架中代理的选择和使用
本文链接:https://www.haomeiwen.com/subject/yxbtwltx.html
网友评论