'10個Spring&SpringBoot高階用法,你是否都知道?'
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
此外可以通過類似於BeanNameAware的獲取到bean的名稱信息等
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
此外可以通過類似於BeanNameAware的獲取到bean的名稱信息等
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
此外可以通過類似於BeanNameAware的獲取到bean的名稱信息等
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
利用BeanFactoryPostProcessor的postProcessBeanFactory方法,獲得當前的IOC容器,然後遍歷即可。
提問:BeanFactoryPostProcessor 和 BeanPostProcessor的區別在哪裡,一般各自有什麼用途?
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
此外可以通過類似於BeanNameAware的獲取到bean的名稱信息等
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
利用BeanFactoryPostProcessor的postProcessBeanFactory方法,獲得當前的IOC容器,然後遍歷即可。
提問:BeanFactoryPostProcessor 和 BeanPostProcessor的區別在哪裡,一般各自有什麼用途?
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
使用了條件註解功能,獲取當前運行的SpringBoot版本進行判斷,類似於系統自帶的條件註解,如下圖
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
此外可以通過類似於BeanNameAware的獲取到bean的名稱信息等
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
利用BeanFactoryPostProcessor的postProcessBeanFactory方法,獲得當前的IOC容器,然後遍歷即可。
提問:BeanFactoryPostProcessor 和 BeanPostProcessor的區別在哪裡,一般各自有什麼用途?
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
使用了條件註解功能,獲取當前運行的SpringBoot版本進行判斷,類似於系統自帶的條件註解,如下圖
主要實現原理得看OnClassCondition類,是不是感覺和@Import類似呢?
拓展:是否清楚Spring 版本升級導致的WebMvcConfigurerAdapter不兼容問題,那麼這個基於當前版本的條件註解功能就能很好的兼容WebMvcConfigurerAdapter問題了。
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
此外可以通過類似於BeanNameAware的獲取到bean的名稱信息等
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
利用BeanFactoryPostProcessor的postProcessBeanFactory方法,獲得當前的IOC容器,然後遍歷即可。
提問:BeanFactoryPostProcessor 和 BeanPostProcessor的區別在哪裡,一般各自有什麼用途?
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
使用了條件註解功能,獲取當前運行的SpringBoot版本進行判斷,類似於系統自帶的條件註解,如下圖
主要實現原理得看OnClassCondition類,是不是感覺和@Import類似呢?
拓展:是否清楚Spring 版本升級導致的WebMvcConfigurerAdapter不兼容問題,那麼這個基於當前版本的條件註解功能就能很好的兼容WebMvcConfigurerAdapter問題了。
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
繼承了AbstractFactoryBean抽象類,createInstance是由afterPropertiesSet方法或者getObject方法調用,想獲取具體的Student對象,則需要&區分工廠bean還是包裝bean,具體看下面的圖就應該很清楚了。
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
此外可以通過類似於BeanNameAware的獲取到bean的名稱信息等
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
利用BeanFactoryPostProcessor的postProcessBeanFactory方法,獲得當前的IOC容器,然後遍歷即可。
提問:BeanFactoryPostProcessor 和 BeanPostProcessor的區別在哪裡,一般各自有什麼用途?
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
使用了條件註解功能,獲取當前運行的SpringBoot版本進行判斷,類似於系統自帶的條件註解,如下圖
主要實現原理得看OnClassCondition類,是不是感覺和@Import類似呢?
拓展:是否清楚Spring 版本升級導致的WebMvcConfigurerAdapter不兼容問題,那麼這個基於當前版本的條件註解功能就能很好的兼容WebMvcConfigurerAdapter問題了。
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
繼承了AbstractFactoryBean抽象類,createInstance是由afterPropertiesSet方法或者getObject方法調用,想獲取具體的Student對象,則需要&區分工廠bean還是包裝bean,具體看下面的圖就應該很清楚了。
此外關於afterPropertiesSet方法是InitializingBean類唯一一個方法,一般用來實例化bean之後的自定義修正或者處理初始化後的其他事情。如需對Spring有更深入的理解,下面這個Spring Bean生命週期的流程圖就必須清楚。
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
此外可以通過類似於BeanNameAware的獲取到bean的名稱信息等
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
利用BeanFactoryPostProcessor的postProcessBeanFactory方法,獲得當前的IOC容器,然後遍歷即可。
提問:BeanFactoryPostProcessor 和 BeanPostProcessor的區別在哪裡,一般各自有什麼用途?
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
使用了條件註解功能,獲取當前運行的SpringBoot版本進行判斷,類似於系統自帶的條件註解,如下圖
主要實現原理得看OnClassCondition類,是不是感覺和@Import類似呢?
拓展:是否清楚Spring 版本升級導致的WebMvcConfigurerAdapter不兼容問題,那麼這個基於當前版本的條件註解功能就能很好的兼容WebMvcConfigurerAdapter問題了。
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
繼承了AbstractFactoryBean抽象類,createInstance是由afterPropertiesSet方法或者getObject方法調用,想獲取具體的Student對象,則需要&區分工廠bean還是包裝bean,具體看下面的圖就應該很清楚了。
此外關於afterPropertiesSet方法是InitializingBean類唯一一個方法,一般用來實例化bean之後的自定義修正或者處理初始化後的其他事情。如需對Spring有更深入的理解,下面這個Spring Bean生命週期的流程圖就必須清楚。
7、Spring MVC 輸出所有的URL信息(Spring MVC)
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
此外可以通過類似於BeanNameAware的獲取到bean的名稱信息等
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
利用BeanFactoryPostProcessor的postProcessBeanFactory方法,獲得當前的IOC容器,然後遍歷即可。
提問:BeanFactoryPostProcessor 和 BeanPostProcessor的區別在哪裡,一般各自有什麼用途?
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
使用了條件註解功能,獲取當前運行的SpringBoot版本進行判斷,類似於系統自帶的條件註解,如下圖
主要實現原理得看OnClassCondition類,是不是感覺和@Import類似呢?
拓展:是否清楚Spring 版本升級導致的WebMvcConfigurerAdapter不兼容問題,那麼這個基於當前版本的條件註解功能就能很好的兼容WebMvcConfigurerAdapter問題了。
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
繼承了AbstractFactoryBean抽象類,createInstance是由afterPropertiesSet方法或者getObject方法調用,想獲取具體的Student對象,則需要&區分工廠bean還是包裝bean,具體看下面的圖就應該很清楚了。
此外關於afterPropertiesSet方法是InitializingBean類唯一一個方法,一般用來實例化bean之後的自定義修正或者處理初始化後的其他事情。如需對Spring有更深入的理解,下面這個Spring Bean生命週期的流程圖就必須清楚。
7、Spring MVC 輸出所有的URL信息(Spring MVC)
關鍵思想是獲取DispatcherServlet類中的handlerMappings數據,而其數據由主要是從SpringIOC容器中的HandlerMapping類bean,然後分別處理,如圖中圈出來的只有RequestMappingHandlerMapping和BeanNameUrlHandlerMapping,這是不完整的,在Spring 3.2以前是DefaultAnnotationHandlerMapping類,但是已經被廢棄了,這裡就沒有補充,大家在使用的時候需要知道自己Spring的版本。
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
此外可以通過類似於BeanNameAware的獲取到bean的名稱信息等
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
利用BeanFactoryPostProcessor的postProcessBeanFactory方法,獲得當前的IOC容器,然後遍歷即可。
提問:BeanFactoryPostProcessor 和 BeanPostProcessor的區別在哪裡,一般各自有什麼用途?
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
使用了條件註解功能,獲取當前運行的SpringBoot版本進行判斷,類似於系統自帶的條件註解,如下圖
主要實現原理得看OnClassCondition類,是不是感覺和@Import類似呢?
拓展:是否清楚Spring 版本升級導致的WebMvcConfigurerAdapter不兼容問題,那麼這個基於當前版本的條件註解功能就能很好的兼容WebMvcConfigurerAdapter問題了。
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
繼承了AbstractFactoryBean抽象類,createInstance是由afterPropertiesSet方法或者getObject方法調用,想獲取具體的Student對象,則需要&區分工廠bean還是包裝bean,具體看下面的圖就應該很清楚了。
此外關於afterPropertiesSet方法是InitializingBean類唯一一個方法,一般用來實例化bean之後的自定義修正或者處理初始化後的其他事情。如需對Spring有更深入的理解,下面這個Spring Bean生命週期的流程圖就必須清楚。
7、Spring MVC 輸出所有的URL信息(Spring MVC)
關鍵思想是獲取DispatcherServlet類中的handlerMappings數據,而其數據由主要是從SpringIOC容器中的HandlerMapping類bean,然後分別處理,如圖中圈出來的只有RequestMappingHandlerMapping和BeanNameUrlHandlerMapping,這是不完整的,在Spring 3.2以前是DefaultAnnotationHandlerMapping類,但是已經被廢棄了,這裡就沒有補充,大家在使用的時候需要知道自己Spring的版本。
如上圖運行結果,可以看到出來,除了業務的url信息,還包含了actuator端點信息以及swagger的url信息。
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
此外可以通過類似於BeanNameAware的獲取到bean的名稱信息等
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
利用BeanFactoryPostProcessor的postProcessBeanFactory方法,獲得當前的IOC容器,然後遍歷即可。
提問:BeanFactoryPostProcessor 和 BeanPostProcessor的區別在哪裡,一般各自有什麼用途?
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
使用了條件註解功能,獲取當前運行的SpringBoot版本進行判斷,類似於系統自帶的條件註解,如下圖
主要實現原理得看OnClassCondition類,是不是感覺和@Import類似呢?
拓展:是否清楚Spring 版本升級導致的WebMvcConfigurerAdapter不兼容問題,那麼這個基於當前版本的條件註解功能就能很好的兼容WebMvcConfigurerAdapter問題了。
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
繼承了AbstractFactoryBean抽象類,createInstance是由afterPropertiesSet方法或者getObject方法調用,想獲取具體的Student對象,則需要&區分工廠bean還是包裝bean,具體看下面的圖就應該很清楚了。
此外關於afterPropertiesSet方法是InitializingBean類唯一一個方法,一般用來實例化bean之後的自定義修正或者處理初始化後的其他事情。如需對Spring有更深入的理解,下面這個Spring Bean生命週期的流程圖就必須清楚。
7、Spring MVC 輸出所有的URL信息(Spring MVC)
關鍵思想是獲取DispatcherServlet類中的handlerMappings數據,而其數據由主要是從SpringIOC容器中的HandlerMapping類bean,然後分別處理,如圖中圈出來的只有RequestMappingHandlerMapping和BeanNameUrlHandlerMapping,這是不完整的,在Spring 3.2以前是DefaultAnnotationHandlerMapping類,但是已經被廢棄了,這裡就沒有補充,大家在使用的時候需要知道自己Spring的版本。
如上圖運行結果,可以看到出來,除了業務的url信息,還包含了actuator端點信息以及swagger的url信息。
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
使用了Spring 監聽機制去監聽ContextRefreshedEvent這類Spring IOC容器刷新完成之後的事件觸發,本demo並沒有做什麼事情,但是結合具體業務可以做很多想做的事情,可以看看Dubbo的服務暴露接口繼承關係,如下圖。
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
此外可以通過類似於BeanNameAware的獲取到bean的名稱信息等
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
利用BeanFactoryPostProcessor的postProcessBeanFactory方法,獲得當前的IOC容器,然後遍歷即可。
提問:BeanFactoryPostProcessor 和 BeanPostProcessor的區別在哪裡,一般各自有什麼用途?
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
使用了條件註解功能,獲取當前運行的SpringBoot版本進行判斷,類似於系統自帶的條件註解,如下圖
主要實現原理得看OnClassCondition類,是不是感覺和@Import類似呢?
拓展:是否清楚Spring 版本升級導致的WebMvcConfigurerAdapter不兼容問題,那麼這個基於當前版本的條件註解功能就能很好的兼容WebMvcConfigurerAdapter問題了。
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
繼承了AbstractFactoryBean抽象類,createInstance是由afterPropertiesSet方法或者getObject方法調用,想獲取具體的Student對象,則需要&區分工廠bean還是包裝bean,具體看下面的圖就應該很清楚了。
此外關於afterPropertiesSet方法是InitializingBean類唯一一個方法,一般用來實例化bean之後的自定義修正或者處理初始化後的其他事情。如需對Spring有更深入的理解,下面這個Spring Bean生命週期的流程圖就必須清楚。
7、Spring MVC 輸出所有的URL信息(Spring MVC)
關鍵思想是獲取DispatcherServlet類中的handlerMappings數據,而其數據由主要是從SpringIOC容器中的HandlerMapping類bean,然後分別處理,如圖中圈出來的只有RequestMappingHandlerMapping和BeanNameUrlHandlerMapping,這是不完整的,在Spring 3.2以前是DefaultAnnotationHandlerMapping類,但是已經被廢棄了,這裡就沒有補充,大家在使用的時候需要知道自己Spring的版本。
如上圖運行結果,可以看到出來,除了業務的url信息,還包含了actuator端點信息以及swagger的url信息。
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
使用了Spring 監聽機制去監聽ContextRefreshedEvent這類Spring IOC容器刷新完成之後的事件觸發,本demo並沒有做什麼事情,但是結合具體業務可以做很多想做的事情,可以看看Dubbo的服務暴露接口繼承關係,如下圖。
本圖來自本人簡書文章截圖:https://www.jianshu.com/p/507d51bf14ce如下圖是dubbo的源碼,充分利用了監聽機制,監聽ContextRefreshedEvent事件,最後調用export方法完成服務暴露操作。
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
此外可以通過類似於BeanNameAware的獲取到bean的名稱信息等
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
利用BeanFactoryPostProcessor的postProcessBeanFactory方法,獲得當前的IOC容器,然後遍歷即可。
提問:BeanFactoryPostProcessor 和 BeanPostProcessor的區別在哪裡,一般各自有什麼用途?
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
使用了條件註解功能,獲取當前運行的SpringBoot版本進行判斷,類似於系統自帶的條件註解,如下圖
主要實現原理得看OnClassCondition類,是不是感覺和@Import類似呢?
拓展:是否清楚Spring 版本升級導致的WebMvcConfigurerAdapter不兼容問題,那麼這個基於當前版本的條件註解功能就能很好的兼容WebMvcConfigurerAdapter問題了。
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
繼承了AbstractFactoryBean抽象類,createInstance是由afterPropertiesSet方法或者getObject方法調用,想獲取具體的Student對象,則需要&區分工廠bean還是包裝bean,具體看下面的圖就應該很清楚了。
此外關於afterPropertiesSet方法是InitializingBean類唯一一個方法,一般用來實例化bean之後的自定義修正或者處理初始化後的其他事情。如需對Spring有更深入的理解,下面這個Spring Bean生命週期的流程圖就必須清楚。
7、Spring MVC 輸出所有的URL信息(Spring MVC)
關鍵思想是獲取DispatcherServlet類中的handlerMappings數據,而其數據由主要是從SpringIOC容器中的HandlerMapping類bean,然後分別處理,如圖中圈出來的只有RequestMappingHandlerMapping和BeanNameUrlHandlerMapping,這是不完整的,在Spring 3.2以前是DefaultAnnotationHandlerMapping類,但是已經被廢棄了,這裡就沒有補充,大家在使用的時候需要知道自己Spring的版本。
如上圖運行結果,可以看到出來,除了業務的url信息,還包含了actuator端點信息以及swagger的url信息。
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
使用了Spring 監聽機制去監聽ContextRefreshedEvent這類Spring IOC容器刷新完成之後的事件觸發,本demo並沒有做什麼事情,但是結合具體業務可以做很多想做的事情,可以看看Dubbo的服務暴露接口繼承關係,如下圖。
本圖來自本人簡書文章截圖:https://www.jianshu.com/p/507d51bf14ce如下圖是dubbo的源碼,充分利用了監聽機制,監聽ContextRefreshedEvent事件,最後調用export方法完成服務暴露操作。
如果去了解Swagger的工作原理會發現也是類似
拓展:RPC服務結合Spring中,服務暴露大體上都是依靠事件監聽機制完成的
9、通過Spring事件機制獲取HTTP請求調用詳情
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
此外可以通過類似於BeanNameAware的獲取到bean的名稱信息等
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
利用BeanFactoryPostProcessor的postProcessBeanFactory方法,獲得當前的IOC容器,然後遍歷即可。
提問:BeanFactoryPostProcessor 和 BeanPostProcessor的區別在哪裡,一般各自有什麼用途?
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
使用了條件註解功能,獲取當前運行的SpringBoot版本進行判斷,類似於系統自帶的條件註解,如下圖
主要實現原理得看OnClassCondition類,是不是感覺和@Import類似呢?
拓展:是否清楚Spring 版本升級導致的WebMvcConfigurerAdapter不兼容問題,那麼這個基於當前版本的條件註解功能就能很好的兼容WebMvcConfigurerAdapter問題了。
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
繼承了AbstractFactoryBean抽象類,createInstance是由afterPropertiesSet方法或者getObject方法調用,想獲取具體的Student對象,則需要&區分工廠bean還是包裝bean,具體看下面的圖就應該很清楚了。
此外關於afterPropertiesSet方法是InitializingBean類唯一一個方法,一般用來實例化bean之後的自定義修正或者處理初始化後的其他事情。如需對Spring有更深入的理解,下面這個Spring Bean生命週期的流程圖就必須清楚。
7、Spring MVC 輸出所有的URL信息(Spring MVC)
關鍵思想是獲取DispatcherServlet類中的handlerMappings數據,而其數據由主要是從SpringIOC容器中的HandlerMapping類bean,然後分別處理,如圖中圈出來的只有RequestMappingHandlerMapping和BeanNameUrlHandlerMapping,這是不完整的,在Spring 3.2以前是DefaultAnnotationHandlerMapping類,但是已經被廢棄了,這裡就沒有補充,大家在使用的時候需要知道自己Spring的版本。
如上圖運行結果,可以看到出來,除了業務的url信息,還包含了actuator端點信息以及swagger的url信息。
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
使用了Spring 監聽機制去監聽ContextRefreshedEvent這類Spring IOC容器刷新完成之後的事件觸發,本demo並沒有做什麼事情,但是結合具體業務可以做很多想做的事情,可以看看Dubbo的服務暴露接口繼承關係,如下圖。
本圖來自本人簡書文章截圖:https://www.jianshu.com/p/507d51bf14ce如下圖是dubbo的源碼,充分利用了監聽機制,監聽ContextRefreshedEvent事件,最後調用export方法完成服務暴露操作。
如果去了解Swagger的工作原理會發現也是類似
拓展:RPC服務結合Spring中,服務暴露大體上都是依靠事件監聽機制完成的
9、通過Spring事件機制獲取HTTP請求調用詳情
在本地測試統計http服務調用統計情況,還是很方便的,依靠的是ServletRequestHandledEvent事件,默認這個事件是開啟的,如果未開啟該事件,就會導致事件監聽無效。
10、服務啟動後的初始化任務CommandLineRunner
這個就不再介紹了,相信大家也按照上述的原理分析和學習這個工具的使用。整體的思路也是類似的。
總結
上面幾個功能點說來說去就是Aware、BeanPostProcessor、BeanFactoryPostProcessor、Event,而且大家如果仔細分析springboot的源碼會發現,其實整體的Spring框架並沒有太多的改進,而是依賴上述的幾種鉤子延伸和拓展,單獨一個BeanPostProcessor就延伸出了多少種子類,再加上Order排序,就可以非常方便的拓展功能。
問題:如何實現動態路由註冊(沒有明確的Controller層定義)
最後分享一張網上看到的Spring的執行流程圖解,寫的確實很詳細,如果希望對Spring源碼有更多深入的瞭解,可以好好思考和學習~
分享自己在Java方面的所思所想,希望你看完之後能有更多更深入的瞭解
本人微信公眾號(jwfy的學習分享),歡迎關注~
目錄
1、獲取Spring IOC容器(Aware)
2、動態註冊bean信息(BeanFactoryPostProcessor)
3、動態修改bean信息(BeanFactoryPostProcessor)
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
7、Spring MVC 輸出所有的URL信息(Spring MVC)
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
9、通過Spring事件機制獲取HTTP請求調用詳情
10、服務啟動後的初始化任務CommandLineRunner
最後有相關知識點的詳細說明推薦~
1、獲取Spring IOC容器(Aware)
通過ApplicationContextAware實現,在bean實例化後,經過Aware掃描時,發現實現了ApplicationContextAware接口,就會調用setApplicationContext方法注入ApplicationContext對象,這也是非常經典的一種獲取上下文的方法。
2、動態註冊bean信息(BeanFactoryPostProcessor)
通過實現BeanDefinitionRegistryPostProcessor接口完成bean的動態注入,而且圖中的動態生成還相比一般的註冊更加複雜,往其中添加了類似於@Value一般的屬性值,儘管我們後續無任何操作,Spring在進行數據填充的時候還是成功的從Properties文件中獲取到了有效數據,這主要依靠的是PropertyPlaceHolderConfigure。
也有更簡單的方法實現bean的動態註冊,例如
((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("school1", beanDefinition)
其實動態註冊bean非常簡單,只需要獲取到當前的IOC容器,然後調用registerBeanDefinition即可,至於獲取當前IOC容器就可以使用Aware、BeanFactoryPostProcessor等方案。
3、動態修改bean信息(BeanFactoryPostProcessor)
上面的例子2就很好的說明了修改bean的信息,在postProcessBeanDefinitionRegistry方法中實現了註冊操作,在postProcessBeanFactory實現了修改bean信息的操作,再例如下面這個例子。
此外可以通過類似於BeanNameAware的獲取到bean的名稱信息等
4、獲取Spring IOC容器所有bean信息(BeanFactoryPostProcessor)
利用BeanFactoryPostProcessor的postProcessBeanFactory方法,獲得當前的IOC容器,然後遍歷即可。
提問:BeanFactoryPostProcessor 和 BeanPostProcessor的區別在哪裡,一般各自有什麼用途?
5、為兼容不同SpringBoot 版本,以實現選擇性加載bean(條件註解)
使用了條件註解功能,獲取當前運行的SpringBoot版本進行判斷,類似於系統自帶的條件註解,如下圖
主要實現原理得看OnClassCondition類,是不是感覺和@Import類似呢?
拓展:是否清楚Spring 版本升級導致的WebMvcConfigurerAdapter不兼容問題,那麼這個基於當前版本的條件註解功能就能很好的兼容WebMvcConfigurerAdapter問題了。
6、自定義工廠bean實例化(工廠Bean、AbstractFactoryBean)
繼承了AbstractFactoryBean抽象類,createInstance是由afterPropertiesSet方法或者getObject方法調用,想獲取具體的Student對象,則需要&區分工廠bean還是包裝bean,具體看下面的圖就應該很清楚了。
此外關於afterPropertiesSet方法是InitializingBean類唯一一個方法,一般用來實例化bean之後的自定義修正或者處理初始化後的其他事情。如需對Spring有更深入的理解,下面這個Spring Bean生命週期的流程圖就必須清楚。
7、Spring MVC 輸出所有的URL信息(Spring MVC)
關鍵思想是獲取DispatcherServlet類中的handlerMappings數據,而其數據由主要是從SpringIOC容器中的HandlerMapping類bean,然後分別處理,如圖中圈出來的只有RequestMappingHandlerMapping和BeanNameUrlHandlerMapping,這是不完整的,在Spring 3.2以前是DefaultAnnotationHandlerMapping類,但是已經被廢棄了,這裡就沒有補充,大家在使用的時候需要知道自己Spring的版本。
如上圖運行結果,可以看到出來,除了業務的url信息,還包含了actuator端點信息以及swagger的url信息。
8、通過Spring事件機制完成服務啟動後的信息整理(類似於Dubbo的服務暴露機制)
使用了Spring 監聽機制去監聽ContextRefreshedEvent這類Spring IOC容器刷新完成之後的事件觸發,本demo並沒有做什麼事情,但是結合具體業務可以做很多想做的事情,可以看看Dubbo的服務暴露接口繼承關係,如下圖。
本圖來自本人簡書文章截圖:https://www.jianshu.com/p/507d51bf14ce如下圖是dubbo的源碼,充分利用了監聽機制,監聽ContextRefreshedEvent事件,最後調用export方法完成服務暴露操作。
如果去了解Swagger的工作原理會發現也是類似
拓展:RPC服務結合Spring中,服務暴露大體上都是依靠事件監聽機制完成的
9、通過Spring事件機制獲取HTTP請求調用詳情
在本地測試統計http服務調用統計情況,還是很方便的,依靠的是ServletRequestHandledEvent事件,默認這個事件是開啟的,如果未開啟該事件,就會導致事件監聽無效。
10、服務啟動後的初始化任務CommandLineRunner
這個就不再介紹了,相信大家也按照上述的原理分析和學習這個工具的使用。整體的思路也是類似的。
總結
上面幾個功能點說來說去就是Aware、BeanPostProcessor、BeanFactoryPostProcessor、Event,而且大家如果仔細分析springboot的源碼會發現,其實整體的Spring框架並沒有太多的改進,而是依賴上述的幾種鉤子延伸和拓展,單獨一個BeanPostProcessor就延伸出了多少種子類,再加上Order排序,就可以非常方便的拓展功能。
問題:如何實現動態路由註冊(沒有明確的Controller層定義)
最後分享一張網上看到的Spring的執行流程圖解,寫的確實很詳細,如果希望對Spring源碼有更多深入的瞭解,可以好好思考和學習~
原創推薦
「系列教程」手寫RPC框架(1),看看100個線程同時調用情況如何
「面試」new String("abc")和"abc"有什麼區別?反編譯看看原理吧
面試:你是否瞭解Spring BeanPostProcessor的原理和具體使用場景