Spring AOP目标
- 将分散在程序各处的横切关注点剥离出来,并以集中的方式进行表达
- 使得开发人员能够专注于业务逻辑的实现,而非繁杂的非功能代码,简化了程序编写与单元测试.
AOP vs 继承(inheritance)
- AOP重点考虑的事程序的横切逻辑
-
继承重点考虑的事纵向的职责分派
AOP核心概念
- Advice(通知) : 定义在连接点处的行为,围绕方法调用而进行注入
- Pointcut(切点) : 确定在那些连接点处应用通知
- Advisor(通知器) : 组合Advice与Pointcut
Spring AOP实现 :
ProxyFactoryBean
- FactoryBean implementation that builds an AOP proxy based on beans in spring BeanFactory(FactoryBean实现了基于spring BeanFactory中的bean构建一个AOP代理)
- Spring AOP 的底层实现与源头
ProxyFactoryBean的构成
- target :目标对象,需要对其进行切面增强
- proxyInterfaces :代理类对象所实现的接口
- interceptorNames:通知器(advisor)列表,通知器中包含了通知(Advice)与切点(Pointcut)
ProxyFactoryBean的总结:
- 针对目标对象来创建代理对象
- 将目标对象方法的调用转到对响应代理对象方法的调用
- 可以在 代理对象方法调用前后执行与之匹配的各个通知器中定义好的方法.
ProxyfactoryBean的作用
-
未使用AOP的情形
-
使用AOP的情形
前后都有切点和通知
目标代理对象的创建: Spring通过两种方式
JDK动态代理
-
CGLIB
如果目标对象 实现了接口,那么Spring就会通过JDK动态代理为目标对象生成代理对象
代理模式
作用
- 为其他对象提供一种代理以控制对这个对象的访问
- 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用.
角色
- 抽象角色:声明真实对象和代理对象的共同接口
- 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象.
- 代理角色:代理对象角色内部含有对真实对象的引用,从而可以 操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真是对象进行封装
真实角色:
代理角色:
调用效果: