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

Springboot加載所有Bean之后運行方式

 更新時間:2024年07月18日 11:25:34   作者:ldy夏沫  
這篇文章主要介紹了Springboot加載所有Bean之后運行方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

Springboot加載所有Bean之后運行方式

Springboot啟動后,需要加載一些配置文件至內存中

方法

編寫普通類,繼承ApplicationListener,重寫onApplicationEvent方法

@Component
@Slf4j
public class InitTaskListener implements ApplicationListener<ContextRefreshedEvent> {

@SneakyThrows
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.println("所有bean加載完之后開始執(zhí)行....");
    }

}

Springboot中Bean的加載順序

一、為什么要控制

當你在項目啟動時需要提前做一個業(yè)務的初始化工作時,或者你正在開發(fā)某個中間件需要完成自動裝配時。

你會聲明自己的Configuration類,但是可能你面對的是好幾個有互相依賴的Bean。

如果不加以控制,這時候可能會報找不到依賴的錯誤,這個時候需要通過一些手段來控制springboot中的bean加載順序。

二、怎么控制

@DependsOn

@DependsOn注解可以用來控制bean的創(chuàng)建順序,該注解用于聲明當前bean依賴于另外一個bean。所依賴的bean會被容器確保在當前bean實例化之前被實例化。

與@Component或@Bean配合使用 

demo

@Slf4j
@Configuration
@ConfigurationProperties(prefix = "dict")
public class SpringConfig {
    @Component(value = "EventSource")
    public class EventSource {
        public EventSource(){
            System.out.println("事件源創(chuàng)建");
        }
    }
    /**
     * 監(jiān)聽類
     */
    @Component
    @DependsOn(value = {"EventSource"})
    public class EventTListener {

        public EventTListener(){
            System.out.println("監(jiān)聽器創(chuàng)建");
        }
    }
}

參數(shù)注入

package com.sinosoft.springbootplus.test.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;

/**
 * @author lsh
 * @date 2022/2/25
 */
@Slf4j
@Configuration
@ConfigurationProperties(prefix = "dict")
public class SpringConfig {
    @Component
    public class Event{
        public Event(){
            System.out.println("事件事件");
        }
    }
    
    @Component
    public class EventSource{
        public EventSource(Event e){
            System.out.println("事件源創(chuàng)建");
        }
    }


    @Component
    public class EventTListener {

        public EventTListener(){
            System.out.println("監(jiān)聽器創(chuàng)建");
        }
    }
}

利用bean的生命周期中的擴展點

@AutoConfigureOrder

@AutoConfigureOrder只能改變外部依賴的@Configuration的順序。

這是不對的用法

@Slf4j
@Configuration
@ConfigurationProperties(prefix = "dict")
public class SpringConfig {
    @Component
    @AutoConfigureOrder(1)
    public class Event{
        public Event(){
            System.out.println("事件事件");
        }
    }

    @Component
    @AutoConfigureOrder(2)
    public class EventSource{
        public EventSource(Event e){
            System.out.println("事件源創(chuàng)建");
        }
    }


    @Component
    @AutoConfigureOrder(3)
    public class EventTListener {

        public EventTListener(){
            System.out.println("監(jiān)聽器創(chuàng)建");
        }
    }
}

以上內容發(fā)現(xiàn),在config里配置是不起作用的。

這是正確的用法

創(chuàng)建兩個配置類

@Slf4j
@Configuration
@AutoConfigureOrder(1)
public class SpringConfig {
    @Component
    public class Event{
        public Event(){
            System.out.println("首先在SpringConfig");
        }
    }

}


@Slf4j
@Configuration
@AutoConfigureOrder(2)
public class NewConfig {
    @Component
    public class Event{
        public Event(){
            System.out.println("然后在NewConfig");
        }
    }
}

測試

發(fā)現(xiàn)結果是不正確的,注解還是沒有生效。

當前工程里增加配置 META-INF/spring.factories,內容為項目中的配置類

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.sinosoft.springbootplus.common.config.NewConfig,com.sinosoft.springbootplus.common.config.SpringConfig

測試結果如圖(正確)

三、遇到的問題

1、需要根據(jù)配置決定生成哪個實現(xiàn)類。

當在配置文件中配置的dict.cacheType的值是local時,初始化LocalISysDictRepository交給spring容器管理;當項目依賴了redis并且配置文件中配置的dict.cacheType的值是redis時,初始化RedisISysDictRepository交給spring容器管理。

2、但是我又在這兩個實現(xiàn)類上加了@Repository注解,也要交給Spring管理,這個時候項目啟動就報錯了。(通俗的來說一個類只能一次交給Spring管理)

總結

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

相關文章

  • Java反射概念與使用實例代碼

    Java反射概念與使用實例代碼

    JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法,下面這篇文章主要給大家介紹了關于Java反射概念與使用的相關資料,需要的朋友可以參考下
    2021-11-11
  • IDEA中實體類(POJO)與JSON快速互轉問題

    IDEA中實體類(POJO)與JSON快速互轉問題

    這篇文章主要介紹了IDEA中實體類(POJO)與JSON快速互轉,本文通過圖文實例代碼相結合給大家介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Spring Boot中使用Server-Sent Events (SSE) 實現(xiàn)實時數(shù)據(jù)推送教程

    Spring Boot中使用Server-Sent Events (SSE) 實

    Server-Sent Events (SSE) 是HTML5引入的一種輕量級的服務器向瀏覽器客戶端單向推送實時數(shù)據(jù)的技術,本文主要介紹了Spring Boot中使用Server-Sent Events (SSE) 實現(xiàn)實時數(shù)據(jù)推送教程,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Java中比較運算符compareTo()、equals()與==的區(qū)別及應用總結

    Java中比較運算符compareTo()、equals()與==的區(qū)別及應用總結

    這篇文章主要給大家介紹了關于Java中比較運算符compareTo()、equals()與==的區(qū)別及應用的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-09-09
  • Java字節(jié)碼的增強技術

    Java字節(jié)碼的增強技術

    這篇文章簡單介紹了幾種Java字節(jié)碼的增強技術,如ASM、Javassist、Byte Buddy、JVM-SANDBOX,需要的朋友可以參下面文章
    2021-08-08
  • 使用IDEA搭建一個簡單的SpringBoot項目超詳細過程

    使用IDEA搭建一個簡單的SpringBoot項目超詳細過程

    這篇文章主要介紹了使用IDEA搭建一個簡單的SpringBoot項目超詳細過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Struts2 控制文件上傳下載功能實例代碼

    Struts2 控制文件上傳下載功能實例代碼

    這篇文章主要介紹了Struts2 控制文件上傳下載功能實例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-05-05
  • Java中使用ZXing和QRCode生成二維碼的示例詳解

    Java中使用ZXing和QRCode生成二維碼的示例詳解

    生成二維碼在Java中有多種方法,常用的是通過第三方庫來實現(xiàn),比較流行的庫包括?ZXing?(Zebra?Crossing)?和?QRCode,本文小編就給大家介紹了Java中使用ZXing和QRCode生成二維碼的示例,需要的朋友可以參考下
    2024-09-09
  • java dom4j解析xml用到的幾個方法

    java dom4j解析xml用到的幾個方法

    這篇文章主要介紹了java dom4j解析xml用到的幾個方法,有需要的朋友可以參考一下
    2013-12-12
  • Presto自定義函數(shù)@SqlNullable引發(fā)問題詳解

    Presto自定義函數(shù)@SqlNullable引發(fā)問題詳解

    這篇文章主要為大家介紹了Presto自定義函數(shù)@SqlNullable引發(fā)問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12

最新評論

本溪市| 灵川县| 新沂市| 日照市| 漳平市| 濮阳县| 鄯善县| 奉贤区| 临洮县| 禹州市| 宣城市| 商都县| 麻阳| 灌云县| 依兰县| 扎兰屯市| 正阳县| 桂平市| 施秉县| 闽侯县| 澄城县| 临夏市| 漳平市| 同德县| 新野县| 治多县| 当阳市| 巧家县| 南川市| 建阳市| 小金县| 柏乡县| 余姚市| 丰顺县| 佳木斯市| 文昌市| 全南县| 五莲县| 万州区| 昌都县| 望谟县|