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

springboot中bean的加載順序問題

 更新時間:2023年05月31日 15:06:00   作者:華妃  
這篇文章主要介紹了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)建");
        }
    }
}

以上內(nèi)容發(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)結(jié)果是不正確的,注解還是沒有生效。

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

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

測試結(jié)果如圖(正確)

三、遇到的問題

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

當在配置文件中配置的dict.cacheType的值是local時,初始化LocalISysDictRepository交給spring容器管理;

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

但是我又在這兩個實現(xiàn)類上加了@Repository注解

也要交給Spring管理,這個時候項目啟動就報錯了。(通俗的來說一個類只能一次交給Spring管理)

總結(jié)

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

相關文章

最新評論

汶上县| 天台县| 桦南县| 环江| 敦化市| 乳源| 南平市| 临武县| 乌兰浩特市| 宁都县| 四平市| 独山县| 青阳县| 汾西县| 乌恰县| 宁阳县| 务川| 上蔡县| 台东县| 璧山县| 康平县| 美姑县| 嫩江县| 息烽县| 博湖县| 枣强县| 全椒县| 汉沽区| 连江县| 汽车| 和林格尔县| 黑水县| 蓝田县| 漠河县| 准格尔旗| 蒙阴县| 高密市| 永州市| 黔江区| 蓬安县| 合阳县|