Spring AOP & IOC 源码解析

2019-06-04  本文已影响0人  可可西里的星星

AOP
aop 分为基于接口的动态代理jdk和基于类的cglib

简单IOC流程:
1、Spring Boot
(1)SpringApplication public ConfigurableApplicationContext run(String... args) 方法的refreshContext(context);到了AbstractApplicationContext的refresh() 方法(spring mvc和boot通用)
1)通过DefaultListableBeanfactory初始化BeanDefinition,放在private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256)

2)判断是否是lazy-init:
finishBeanFactoryInitialization(beanFactory)里头有个初始化non-lazy-init bean的函数 preInstantiateSingletons()

3)在getBean()的时候实例化bean,在AbstractAutoProxyCreator的postProcessAfterInitialization wrapIfNecessary 判断当前方法是否符合pointcutexception,如果符合就是被代理类,根据是接口还是类,分别初始化为JDKAopProxy或者CglibProxy
2、Spring MVC 直接走AbstractApplicationContext的refresh() 方法其后同Spring boot
3、调用目标方法,实际是走的代理类的invoke或者intercept方法,这两个方法都去获取了interceptchain,就是该方法的所有advice,然后走到invocation.proceed,先去判断有没有前置advice,有就调用前置advice的方法,然后调用被代理方法,最后调用所有的后置advice的方法。

上一篇下一篇

猜你喜欢

热点阅读