SpingBoot的5个扩展点
1、初始化器ApplicationContextInitializer
new SpringApplication(SpringbootExtensionPointApplication.class).run(args);
老的只是包装了一个静态方法,实际底层就是实例化一个SpringApplication对象,然后调用它的run方法。ApplicationContextInitializer
也已经注册上来了,变成8个了。ApplicationContextInitializer
run()
方法中的prepareContext()
方法中的applyInitializers()
方法,在这个方法中for循环的调用各个初始化器的initialize()
方法,从而我们就能看到把Jack的ApplicationContextInitializer
这句话给打印出来了。2、监听器ApplicationListener
ApplicationEventMulticaster
发布事件,各个Listener监听事件。JackStartingApplicationListener
打个断点,然后看下堆栈信息SpringApplication run()
方法的listeners.starting()
开始进去发送ApplicationStartingEvent
广播事件,最后发布出去,由我们自己编写的事件监听器接收到。ApplicationStartedEvent
事件也是一样的道理,通过打断点的方式来找到它的调用方,最后我们再来看下此时的扩展点图3、Runner
listeners.started()
后面有个callRunnersApplicationRunner
,还有一种是CommandLineRunner
,然后for循环的对它们进行调用,那么其实这个也是一个扩展点4、BeanFactoryPostProcessor
refreshContext()
方法refresh()
方法,这个方法里面就会做对容器的初始化。红框里的invokeBeanFactoryPostProcessors()
方法,这里也有一个扩展点,就是BeanFactoryPostProcessor
,执行对BeanFactory的后置处理。Spring Boot解析配置成BeanDefinition
的操作也是在此方法中。BeanFactoryPostProcessor
,这个方法里面可以修改beanFactory的属性,beanfactory里面有BeanDefinition
,可以修改BeanDefinition
里面的值。BeanDefinition
是一个bean的元数据的信息,有多少个bean就有多少个BeanDefinition
。5、BeanPostProcessor
BeanPostProcessor
,它在通过反射构造函数进行bean实例化之后执行,那么红框里面标出来的registerBeanPostProcessors()
方法就是向BeanFactory
中注册beanpostprocessor
,用于后续bean创建的拦截操作。BeanPostProcessor
,一共有两个方法,postProcessBeforeInitialization
和postProcessAfterInitialization
,不过我们一般用postProcessAfterInitialization
,在bean调用反射构造函数实例化之后执行。著名的应用场景AOP底层就是通过BeanPostProcessor
来实现的。postProcessAfterInitialization
上打个断点,看下堆栈信息是在哪里调用的finishBeanFactoryInitialization()
方法处调用的后记
微信赞赏支付宝扫码领红包
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。侵权投诉:375170667@qq.com