SpringBoot選擇自有bean優(yōu)先加載實現(xiàn)方法
背景介紹
在一些需求中,可能存在某些場景,比如先加載自己的bean,然后自己的bean做一些DB操作,初始化配置問題,然后后面的bean基于這個配置文件,繼續(xù)做其他的業(yè)務邏輯。因此有了本文的這個題目。
實現(xiàn)方法
DependsOn注解
這個@DependsOn網(wǎng)上實現(xiàn)方法很多,依賴的bean數(shù)目較少的話,比較好弄,但數(shù)目變多后,就比較麻煩了,每個類都需要重新寫一遍,因此推薦第二種方法。
ApplicationContextInitializer
通過注冊 ApplicationContextInitializer 后,就可以注冊 BeanDefinitionRegistryPostProcessor 到 Spring里面。最后實現(xiàn) BeanDefinitionRegistryPostProcessor ,注冊目標 bean。
class DemoApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext applicationContext) { applicationContext.addBeanFactoryPostProcessor(new DemoBeanDefinitionRegistryPostProcessor()); } }
實現(xiàn) BeanDefinitionRegistryPostProcessor:
public class DemoBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered { // from BeanDefinitionRegistryPostProcessor interface @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException { // 重點在這里,這里可以把自己的 想要提起 實現(xiàn)的 或者初始化的 bean 加到這里 beanDefinitionRegistry.registerBeanDefinition("DemoService",new RootBeanDefinition(DemoService.class)); } // from BeanDefinitionRegistryPostProcessor interface @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { } // from PriorityOrdered interface @Override public int getOrder() { // 排在 ConfigurationClassPostProcessor 之前即可 return Ordered.LOWEST_PRECEDENCE - 1; } }
這里需要注意的是,不能使用 @Componet 或者其他的注解進行注冊 BeanDefinitionRegistryPostProcessor。
因為@Componet 注解方式能注冊的前提是 被 ConfigurationClassPostProcessor 掃描到,而現(xiàn)在,我們需要考慮我們的bean注冊,要在這些bean之前,所以一定不能被“它-ConfigurationClassPostProcessor”管理 。 換一個角度思考,如果被 “它” 管理類 注冊出來的bean 一定不可能排在 ConfigurationClassPostProcessor 的前面。
注意:@Order 這個只能控制 spring 自身 bean的順序,對于 @Service @Component 、@Repository這些注解是不能控制的。
簡單Demo
需求:筆者想讓TestService 提前被注冊,并且執(zhí)行后,其他bean 才能被注冊。
public class TestService { // 存放系統(tǒng)配置 private static Map<String, String> GLOBAL_CONF = new HashMap<>(); @PostConstruct public void init() { // 先做初始化 GLOBAL_CONF 或者其他 IO操作 // GLOBAL_CONF.put(key, value); } //其他 bean 通過這個方法獲得系統(tǒng)配置 public static String getGlobalConfig(String key) { return GLOBAL_CONF.get(key); } }
實現(xiàn):(為了簡單,直接實現(xiàn)上述的3個接口)
public class DemoBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered, ApplicationContextInitializer<ConfigurableApplicationContext> { /** * 第二步: 注冊 自己的 bean * * @param beanDefinitionRegistry */ // from BeanDefinitionRegistryPostProcessor interface @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException { beanDefinitionRegistry.registerBeanDefinition("TestService",new RootBeanDefinition(TestService.class)); } // from BeanDefinitionRegistryPostProcessor interface @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { } // from PriorityOrdered interface @Override public int getOrder() { return Ordered.LOWEST_PRECEDENCE - 1; } /** * 第一步 先注冊 到 configurableApplicationContext 中 * * @param configurableApplicationContext */ // from ApplicationContextInitializer interface @Override public void initialize(ConfigurableApplicationContext configurableApplicationContext) { configurableApplicationContext.addBeanFactoryPostProcessor(new DemoBeanDefinitionRegistryPostProcessor()); } }
思考: 那如何得到 或者 看到 spring bean 加載的順序呢?
見下一篇。
到此這篇關(guān)于SpringBoot選擇自有bean優(yōu)先加載實現(xiàn)方法的文章就介紹到這了,更多相關(guān)SpringBoot bean優(yōu)先加載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 中 String,StringBuffer 和 StringBuilder 的區(qū)別及用法
這篇文章主要介紹了Java 中 String,StringBuffer 和 StringBuilder 的區(qū)別及用法的相關(guān)資料,需要的朋友可以參考下2017-03-03java Gui實現(xiàn)肯德基點餐收銀系統(tǒng)
這篇文章主要為大家詳細介紹了java Gui實現(xiàn)肯德基點餐收銀系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01springboot整合mongodb并實現(xiàn)crud步驟詳解
這篇文章主要介紹了springboot整合mongodb并實現(xiàn)crud,本文分步驟通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08mybatis?plus?MetaObjectHandler?不生效的解決
今天使用mybatis-plus自動為更新和插入操作插入更新時間和插入時間,配置了MetaObjectHandler不生效,本文就來解決一下,具有一定的 參考價值,感興趣的可以了解一下2023-10-10Tk.mybatis零sql語句實現(xiàn)動態(tài)sql查詢的方法(4種)
有時候,查詢數(shù)據(jù)需要根據(jù)條件使用動態(tài)查詢,這時候需要使用動態(tài)sql,本文主要介紹了Tk.mybatis零sql語句實現(xiàn)動態(tài)sql查詢的方法,感興趣的可以了解一下2021-12-12