溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Bean的優先加載方法怎么實現

發布時間:2021-12-23 11:31:18 來源:億速云 閱讀:680 作者:iii 欄目:大數據

這篇文章主要介紹“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方式

借助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的優先加載方法怎么實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女