這篇文章主要介紹“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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。