小程序三方平台开发: 解析小程序开发的未来趋势和机遇
780
2022-11-05
spring中AutowiredAnnotationBeanPostProcessor的注册时机
AutowiredAnnotationBeanPostProcessor是实现@Autowired的关键,它本身是在何时添加到sping容器中的?
xml方式
在使用xml方式开发的过程中,我们程序入口一般是ClassPathXmlApplicationContext
@Test public void test() throws Exception{ ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-test.xml"); Student student = (Student)applicationContext.getBean("student"); System.out.println(student.getUsername()+" "+student.getPassword()); }
创建ClassPathXmlApplicationContext时,会调用this构造函数
在构造函数中调用父类构造函数,完成一些属性的加载,以及配置文件路径的解析工作,然后进入正题——refresh()
在核心的refresh()方法中,有一个步骤是创建BeanFactory
创建BeanFactory后,它顺带把我们的xml配置文件也给解析了
loadBeanDefinitions的过程比较复杂,有兴趣的可以去逐行degbug源码,这里就贴几个关键步骤
几个相同名称的loadBeanDefinitions调来调去,最好调到了真正干活的doLoadBeanDefinitions
loadBeanDefinitions并不是这次关注的焦点,doLoadBeanDefinitions的细节也就不用深究了,重要的是在doLoadBeanDefinitions完成后,还只是得到了一个Document得对象,还不是我们要的bean定义信息,即BeanDefinition,所以继续进行了一个叫registerBeanDefinitions的步骤
在这个registerBeanDefinitions的过程中,九曲十八弯
开始解析前面的Document了
解析的标签分两种类型,一种是DefaultElement,一种是CustomElement
扯个题外话,什么是DefaultElement,这四个就是了,分别是import、alias、bean、beans,换句话说,除了这四个,其他的都是CustomElement
在我的测试环境中,第一个标签是context,自然就是走parseCustomElement
那就继续解析吧
调到NamespaceHandlerSupport的parse方法
再往下走的又是ComponentScanBeanDefinitionParser的parse方法,终于到头了,把标签解析并封装成了BeanDefinitionHolder,而后又有一个动作registerComponents
就是这个不起眼的小动作,registerComponents,里面蕴含玄机
在这里面执行了一个AnnotationConfigUtils.registerAnnotationConfigProcessors,就是在这里完成了AutowiredAnnotationBeanPostProcessor的注册
总而言之,简而言之,就是在创建容器后,loadBeanDefinitions时注册的。
注解方式
同样整一个测试方法,即这次new的是AnnotationConfigApplicationContext 而不是上面的ClassPathXmlApplicationContext
@Test public void test() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext("com.zubus.bean"); BeforeInstantiation bean = ac.getBean(BeforeInstantiation.class); bean.doSomeThing(); }
走的是不同的路线,进this()
里面会new一个AnnotatedBeanDefinitionReader
new AnnotatedBeanDefinitionReader()的过程中有个熟悉的身影
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
是不是和上面的xml解析后的registerComponents里的一模一样
没错,正是在下
至此,两种开发模式下的AutowiredAnnotationBeanPostProcessor注册时机我们已经掌握了
这里仅仅是注册,后续就是再分析它是在哪没创建成对象的
再后续就是分析它是在哪里被调用执行了
请看下回分解~
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~