您好,登錄后才能下訂單哦!
這篇文章主要介紹“Spring Bean的優先加載方法怎么實現”,在日常操作中,相信很多人在Spring Bean的優先加載方法怎么實現問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Spring Bean的優先加載方法怎么實現”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在日常的業務開發中,絕大多數我們都是不關注 bean 的加載順序,然而如果在某些場景下,當我們希望某個 bean 優于其他的 bean 被實例化時,往往并沒有我們想象中的那么簡單。
在實際的 SpringBoot 開發中,我們知道都會有一個啟動類,如果希望某個類被優先加載,一個成本最低的簡單實現,就是在啟動類里添加上依賴
@SpringBootApplication publicclass Application { // 使用構造方法的方式來優先加載DemoBean public Application(DemoBean demoBean) { demoBean.print(); } public static void main(String[] args) { SpringApplication.run(Application.class); } } 請注意上面的構造方法,如果我們希望在應用啟動之前,demoBean就已經被加載了,那就讓 Application 強制依賴它,所以再 Application 的 bean 初始化之前,肯定會優先實例化demoBean
借助InstantiationAwareBeanPostProcessorAdapter來實現在 bean 實例化之前優先加載目標 bean。
publicclass ClientBeanProcessor extends InstantiationAwareBeanPostProcessorAdapter implements BeanFactoryAware { private ConfigurableListableBeanFactory beanFactory; @Override public void setBeanFactory(BeanFactory beanFactory) { if (!(beanFactory instanceof ConfigurableListableBeanFactory)) { thrownew IllegalArgumentException( "AutowiredAnnotationBeanPostProcessor requires a ConfigurableListableBeanFactory: ">
上面的實現比較簡單,借助beanFactory#getBean
來手動觸發 bean 的實例,通過實現BeanFactoryAware
接口來獲取BeanFactory
,因為實現InstantiationAwareBeanPostProcessor
接口的類會優先于 Bean 被實例,以此來間接的達到我們的目的
接下來的問題就是如何讓它生效了,我們這里使用 Import 注解來實現
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import({ClientAutoConfiguration.class, ClientBeanProcessor.class}) public@interface EnableOrderClient { }
package com.spring.master.spring.bean.initbean; import lombok.Getter; import org.springframework.core.env.Environment; import javax.annotation.PostConstruct; /** * @author Huan Lee * @version 1.0 * @date 2020-09-25 11:58 * @describtion 業精于勤,荒于嬉;行成于思,毀于隨。 */ public class DatasourceLoader { @Getter private String mode; public DatasourceLoader(Environment environment) { this.mode = environment.getProperty("config.save.mode"); System.out.println("init DatasourceLoader for:" + mode); } @PostConstruct public void loadResourcres() { System.out.println("開始初始化資源"); } } package com.spring.master.spring.bean.initbean; import org.springframework.stereotype.Component; /** * @author Huan Lee * @version 1.0 * @date 2020-09-25 12:01 * @describtion 業精于勤,荒于嬉;行成于思,毀于隨。 */ @Component public class DemoBean { public DemoBean() { System.out.println("demo bean init!"); } public void print() { System.out.println("print demo bean "); } }
package com.spring.master.spring.bean.initbean; import org.springframework.context.annotation.Import; import java.lang.annotation.*; /** * @author Huan Lee * @version 1.0 * @date 2020-09-25 11:59 * @describtion 業精于勤,荒于嬉;行成于思,毀于隨。 */ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import({ClientAutoConfiguration.class, ClientBeanProcessor.class}) public @interface EnableOrderClient { }
package com.spring.master; import com.spring.master.spring.bean.initbean.DemoBean; import com.spring.master.spring.bean.initbean.EnableOrderClient; import com.spring.master.spring.bean.lifecycle.Person; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; @EnableOrderClient @SpringBootApplication public class SpringMasterApplication { public SpringMasterApplication(DemoBean demoBean) { demoBean.print(); } public static void main(String[] args) { SpringApplication.run(SpringMasterApplication.class, args); } } 啟動服務輸出: init DatasourceLoader for:null 開始初始化資源 com.spring.master.spring.bean.initbean.DatasourceLoader@458342d3 demo bean init! print demo bean
到此,關于“Spring Bean的優先加載方法怎么實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。