第27集、手写实现AOP
【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】
1、手写实现AOP的缺点有哪些?
-
增加额外功能时,会对所有的方法 都加入对应的功能
问题 不灵活 (事务 CUD 加入 R 不应该加入) -
额外功能添加的位置 僵化(固定)
2、增加额外功能,会对所有的方法都加入对应的功能,问题不灵活(事务CRUD加R不应该加入)如何解决呢?
手工配置的想灵活配置只能通过切入点进行控制。
2.1、如何在BeanPostProcessor中拿到切入点呢?
- 1、直接new【耦合】
2、由Spring生产,那么BeanPostProcessor如何获得呢?- 2.1、使用@Autowired,让AutowireAnnotationBeanPostProcessor为另外一个BeanPostProcessor显然是有问题的。
- 2.2、使用Aware,但是不推荐使用ApplicationContextAware,为什么?
- 因为ApplicationContextAware处理靠的是ApplicationContextAwareProcessor,不能让BeanPostProcessor处理BeanPostProcessor
- 解决:通过BeanFactoryAware
3、额外功能位置僵化,代码写死了怎么解决?
通过BeanFactoryAware获取beanFactory然后获取额外功能,通过接口来解决代码写死功能位置僵化等问题。
4、切面的概念是切入点+额外功能他们如何做的更加优雅呢?
- 参考源码封装成PonitCutAdvisor
- 为什么切点可以直接new PonitCut?
- 因为有n多个子类
- 为什么不new反而需要advice注入一下?
- 因为advice是功能增强,全局一个就可以了,源码里面也是这么写
- 参考自己写的
5、为什么PointCut可以new呢?
因为已经限定类型了,形成了单一职责
6、如果我不仅有Before还有After切入点怎么办?
目前只能使一个
现在的话就可以做一个切面的链条,参考springAOP源码