最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Spring @DependsOn控制bean加載順序的實(shí)例

 更新時(shí)間:2021年07月22日 15:12:13   作者:夢(mèng)想畫家  
這篇文章主要介紹了使用Spring @DependsOn控制bean加載順序的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

spring容器載入bean順序是不確定的,spring框架沒有約定特定順序邏輯規(guī)范。但spring保證如果A依賴B(如beanA中有@Autowired B的變量),那么B將先于A被加載。但如果beanA不直接依賴B,我們?nèi)绾巫孊仍先加載呢?

控制bean初始化順序

可能有些場(chǎng)景中,bean A 間接依賴 bean B。如Bean B應(yīng)該需要更新一些全局緩存,可能通過單例模式實(shí)現(xiàn)且沒有在spring容器注冊(cè),bean A需要使用該緩存;因此,如果bean B沒有準(zhǔn)備好,bean A無(wú)法訪問。

另一個(gè)場(chǎng)景中,bean A是事件發(fā)布者(或JMS發(fā)布者),bean B (或一些) 負(fù)責(zé)監(jiān)聽這些事件,典型的如觀察者模式。我們不想B 錯(cuò)過任何事件,那么B需要首先被初始化。

簡(jiǎn)言之,有很多場(chǎng)景需要bean B應(yīng)該被先于bean A被初始化,從而避免各種負(fù)面影響。我們可以在bean A上使用@DependsOn注解,告訴容器bean B應(yīng)該先被初始化。下面通過示例來(lái)說明。

示例說明

示例通過事件機(jī)制說明,發(fā)布者和監(jiān)聽者,然后通過spring配置運(yùn)行。為了方便說明,示例進(jìn)行了簡(jiǎn)化。

EventManager.java

事件管理類,維護(hù)監(jiān)聽器列表,通過單例方法獲取事件管理器,可以增加監(jiān)聽器或發(fā)布事件。

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class EventManager {
    private final List<Consumer<String>> listeners = new ArrayList<>();
    private EventManager() {
    }
    private static class SingletonHolder {
        private static final EventManager INSTANCE = new EventManager();
    }
    public static EventManager getInstance() {
        return SingletonHolder.INSTANCE;
    }
    public void publish(final String message) {
        listeners.forEach(l -> l.accept(message));
    }
    public void addListener(Consumer<String> eventConsumer) {
        listeners.add(eventConsumer);
    }
}

EventPublisherBean.java

事件發(fā)布類,通過EventManager類發(fā)布事件。

import com.logicbig.example.EventManager;
public class EventPublisherBean {
    public void initialize() {
        System.out.println("EventPublisherBean initializing");
        EventManager.getInstance().publish("event published from EventPublisherBean");
    }
}

EventListenerBean.java

事件監(jiān)聽者,可以增加監(jiān)聽器。

import com.logicbig.example.EventManager;
public class EventListenerBean {
    private void initialize() {
        EventManager.getInstance().
                addListener(s ->
                        System.out.println("event received in EventListenerBean : " + s));
    }
}

AppConfig.java

配置運(yùn)行類。

@Configuration
@ComponentScan("com.logicbig.example")
public class AppConfig {
    @Bean(initMethod = "initialize")
    @DependsOn("eventListener")
    public EventPublisherBean eventPublisherBean () {
        return new EventPublisherBean();
    }
    @Bean(name = "eventListener", initMethod = "initialize")
    // @Lazy
    public EventListenerBean eventListenerBean () {
        return new EventListenerBean();
    }
    public static void main (String... strings) {
        new AnnotationConfigApplicationContext(AppConfig.class);
    }
}

運(yùn)行AppConfig的main方法,輸出結(jié)果為:

EventListenerBean initializing

EventPublisherBean initializing

event received in EventListenerBean : event published from EventPublisherBean

總結(jié)

如果我們注釋掉@DependsOn("eventListener"),我們可能不確定獲得相同結(jié)果。嘗試多次運(yùn)行main方法,偶爾我們將看到EventListenerBean 沒有收到事件。為什么是偶爾呢?因?yàn)槿萜鲉?dòng)過程中,spring按任意順序加載bean。

那么當(dāng)不使用@DependsOn可以讓其100%確定嗎?可以使用@Lazy注解放在eventListenerBean ()上。因?yàn)镋ventListenerBean在啟動(dòng)階段不加載,當(dāng)其他bean需要其時(shí)才加載。這次我們僅EventListenerBean被初始化。

EventPublisherBean initializing

現(xiàn)在從新增加@DependsOn,也不刪除@Lazy注解,輸出結(jié)果和第一次一致,雖然我們使用了@Lazy注解,eventListenerBean在啟動(dòng)時(shí)仍然被加載,因?yàn)锧DependsOn表明需要EventListenerBean。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JAVA中String介紹及常見面試題小結(jié)

    JAVA中String介紹及常見面試題小結(jié)

    這篇文章主要介紹了JAVA中String介紹及常見面試題,在java面試中經(jīng)常會(huì)被面試官問到,小編通過實(shí)例代碼相結(jié)合給大家詳細(xì)介紹,需要的朋友可以參考下
    2020-02-02
  • 一篇文章帶你深入理解JVM虛擬機(jī)讀書筆記--鎖優(yōu)化

    一篇文章帶你深入理解JVM虛擬機(jī)讀書筆記--鎖優(yōu)化

    這篇文章深入介紹了JVM虛擬機(jī)的鎖優(yōu)化,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2021-09-09
  • 淺談SpringSecurity基本原理

    淺談SpringSecurity基本原理

    今天帶大家了解一下SpringSecurity的基本原理,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Java實(shí)現(xiàn)圖片拼接

    Java實(shí)現(xiàn)圖片拼接

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖片拼接的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Java中MyBatis Plus知識(shí)點(diǎn)總結(jié)

    Java中MyBatis Plus知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家整理一篇關(guān)于Java中MyBatis Plus知識(shí)點(diǎn)總結(jié),需要的朋友們參考下。
    2019-10-10
  • Java在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置的方法詳解

    Java在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置的方法詳解

    相信大家在操作Java的時(shí)候經(jīng)常會(huì)要在一個(gè)數(shù)組(無(wú)序)中查找元素的第一個(gè)和最后一個(gè)位置,下面這篇文章主要給大家介紹了關(guān)于Java在排序數(shù)組中查找元素的第一個(gè)和最后一個(gè)位置的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • SpringBoot整合iText7導(dǎo)出PDF及性能優(yōu)化方式

    SpringBoot整合iText7導(dǎo)出PDF及性能優(yōu)化方式

    在SpringBoot項(xiàng)目中整合iText7庫(kù)以導(dǎo)出PDF文件,不僅能夠滿足報(bào)告生成需求,而且可以處理復(fù)雜的文檔布局與樣式,整合步驟包括添加Maven依賴、編寫PDF生成代碼,性能優(yōu)化方面,建議使用流式處理、緩存樣式與字體、優(yōu)化HTML/CSS結(jié)構(gòu)、采用異步處理
    2024-09-09
  • java中VO PO DTO POJO BO DO對(duì)象的應(yīng)用場(chǎng)景及使用方式

    java中VO PO DTO POJO BO DO對(duì)象的應(yīng)用場(chǎng)景及使用

    文章介紹了Java開發(fā)中常用的幾種對(duì)象類型及其應(yīng)用場(chǎng)景,包括VO、PO、DTO、POJO、BO和DO等,并通過示例說明了它們?cè)诓煌瑘?chǎng)景下的應(yīng)用
    2025-01-01
  • SpringMVC適配器模式作用范圍介紹

    SpringMVC適配器模式作用范圍介紹

    適配器這個(gè)詞我們應(yīng)該很熟悉,天天都在使用,手機(jī)充電時(shí),電源線頭頭就叫電源適配器,干什么用的呢?把220V電壓轉(zhuǎn)換成手機(jī)充電時(shí)使用的電壓,那么適配器是不是很好理解了,下面看一下
    2023-04-04
  • Java數(shù)據(jù)類型Integer與int的區(qū)別詳細(xì)解析

    Java數(shù)據(jù)類型Integer與int的區(qū)別詳細(xì)解析

    這篇文章主要介紹了Java數(shù)據(jù)類型Integer與int的區(qū)別詳細(xì)解析,Ingeter是int的包裝類,int的初值為0,Ingeter的初值為null,int和integer(無(wú)論new否)比,都為true,因?yàn)闀?huì)把Integer自動(dòng)拆箱為int再去比,需要的朋友可以參考下
    2023-12-12

最新評(píng)論

芷江| 三亚市| 玉环县| 芮城县| 罗山县| 筠连县| 万荣县| 临朐县| 区。| 桓仁| 安康市| 息烽县| 遵义市| 绥芬河市| 夏河县| 全椒县| 上饶市| 青龙| 太白县| 东方市| 抚松县| 鸡泽县| 长丰县| 荥阳市| 绥宁县| 大洼县| 惠州市| 宁国市| 北辰区| 洪洞县| 保德县| 阜新| 金堂县| 玉溪市| 宜春市| 邹平县| 莆田市| 紫云| 东山县| 镇宁| 新民市|