既然是最后一天摸鱼,那就来个技术帖吧
java吧
全部回复
仅看楼主
level 13
[滑稽]二楼开整
2021年02月09日 02点02分 1
level 13
起源是之前有人问了我一个aop失效的问题:
2021年02月09日 02点02分 2
level 13
当注解标记到类上面,Aspect使用@annotation去拦截时,会失效
2021年02月09日 02点02分 3
level 13
标记到方法上即可被拦截
2021年02月09日 02点02分 4
level 13
我的第一反应:wtf?
不可能吧,事务没用过吗?写到类上不说常见,但是一定见过吧
2021年02月09日 02点02分 5
level 13
既然这样,咱们就扣一下,容器启动中是怎么去生成拦截链的[滑稽]
2021年02月09日 02点02分 6
level 13
我们都知道 spring给我们预留了两个炒鸡强大的扩展点:
BeanPostProcessor和BeanFactoryPostProcessor,咱们就来说说我们我们的重头戏InfrastructureAdvisorAutoProxyCreator
2021年02月09日 02点02分 7
level 13
2021年02月09日 02点02分 8
level 13
InfrastructureAdvisorAutoProxyCreator实现了BeanPostProcessor.postProcessAfterInitialization,我们看看他到底做了什么
2021年02月09日 02点02分 9
level 13
2021年02月09日 02点02分 10
level 13
然后一路小跑进入到wrapIfNecessary方法,里面最最核心的就是getAdvicesAndAdvisorsForBean方法了;这里将直接获取到拦截链,也就是根据Aspect注解标记的类,根据匹配规则,获取最终匹配的类[滑稽]
2021年02月09日 02点02分 11
level 13
也是一路小跑,发现这个类最终走到了org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator#findEligibleAdvisors方法,
List<Advisor> candidateAdvisors = findCandidateAdvisors();
List<Advisor> eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName);
第一条简单来说就是查询我们所有的aop拦截链,第二条就是规则匹配,这里的eligibleAdvisors,也就是我们最终需要的结果了
2021年02月09日 02点02分 12
level 13
最终规则匹配,走到了AopUtil.canApply,我们基本上的写法都是@Pointcut,所以 走到了if这里
2021年02月09日 02点02分 13
level 13
然后是一路小跑
2021年02月09日 02点02分 14
level 13
@Pointcut("@annotation(com.boot.aspect.Log)")这种拦截时,if里面走到了introductionAwareMethodMatcher.matches(method, targetClass, hasIntroductions) 方法
2021年02月09日 02点02分 15
1 2 3 尾页