孙哥Spring源码第27集

第27集、手写实现AOP

【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】

1、手写实现AOP的缺点有哪些?

  1. 增加额外功能时,会对所有的方法 都加入对应的功能
    问题 不灵活 (事务 CUD 加入 R 不应该加入)

  2. 额外功能添加的位置 僵化(固定)

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
      • 孙哥Spring源码第27集_第1张图片

3、额外功能位置僵化,代码写死了怎么解决?

通过BeanFactoryAware获取beanFactory然后获取额外功能,通过接口来解决代码写死功能位置僵化等问题。

孙哥Spring源码第27集_第2张图片 孙哥Spring源码第27集_第3张图片

4、切面的概念是切入点+额外功能他们如何做的更加优雅呢?

  • 参考源码封装成PonitCutAdvisor
  • 为什么切点可以直接new PonitCut?
    • 因为有n多个子类
  • 为什么不new反而需要advice注入一下?
    • 因为advice是功能增强,全局一个就可以了,源码里面也是这么写
    • 参考自己写的
      • 孙哥Spring源码第27集_第4张图片

5、为什么PointCut可以new呢?

因为已经限定类型了,形成了单一职责

孙哥Spring源码第27集_第5张图片 孙哥Spring源码第27集_第6张图片

6、如果我不仅有Before还有After切入点怎么办?

目前只能使一个

现在的话就可以做一个切面的链条,参考springAOP源码

孙哥Spring源码第27集_第7张图片

7、解决自己给自己做代理

孙哥Spring源码第27集_第8张图片

8、多次调用问题

你可能感兴趣的:(spring,java,数据库)