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

詳解Spring?延遲初始化遇到的問題

 更新時(shí)間:2023年05月15日 08:34:50   作者:不一樣的科技宅  
這篇文章主要介紹了我們?cè)谑褂肧pring延遲初始化容易遇到的問題,文中有詳細(xì)的代碼示例,具有一定的參考價(jià)值,需要的可以借鑒一下

List<坑> 坑列表 = new ArrayList<>(2);

首先,讓我們回顧一下 Spring 延遲初始化的概念。在 Spring 中,延遲初始化指的是將 Bean 的實(shí)例化推遲到第一次被使用時(shí),而不是在應(yīng)用程序啟動(dòng)時(shí)就立即創(chuàng)建所有的 Bean。這種延遲加載的機(jī)制可以提高應(yīng)用程序的性能和資源利用率。

坑 1. 延遲加載失效,被非延遲初始化的 Bean 注入了。

代碼演示:

@Lazy
@Component
public class MyBean {

    public MyBean() {
        System.out.println("My bean init success.");
    }

}

1、 使用構(gòu)造函數(shù)注入

@Service
public class MyService {

    private MyBean myBean;

    public MyService(MyBean myBean) {
        this.myBean = myBean;
    }

    public void exec() {
        System.out.println("exec suc");
    }

}

2、 @Resource 注入

@Service
public class MyService {

    @Resource
    private MyBean myBean;

    public void exec() {
        System.out.println("exec suc");
    }

}

3、 @Autowired 注入

@Service
public class MyService {

    private MyBean myBean;

    @Autowired
    public void setMyBean(MyBean myBean) {
        this.myBean = myBean;
    }

    public void exec() {
        myBean.exec();
    }

}

測(cè)試結(jié)果

失效原因

這個(gè)非常好理解,myService 并沒有配置@Lazy,所以在啟動(dòng)的時(shí)候會(huì)被初始化。由于 myService 依賴 myBean,myBean 就會(huì)被注入。所以這意味著 myBean 要能正常被注入,就得被初始化,如果不初始化就會(huì)啟動(dòng)失敗。這也就是造成 myBean 延遲初始化失效的原因。

解決方法

解決方法很簡(jiǎn)單,在依賴到的地方都配置上@Lazy,避免出現(xiàn)被非延遲初始化的 Bean 注入了。

坑 2. 延遲加載失效:Bean 的作用域錯(cuò)誤配置

@Lazy 注解只對(duì)單例(Singleton)作用域的 Bean 有效。默認(rèn)情況下,Spring 的 Bean 作用域是單例,如果將 Bean 的作用域設(shè)置為其他作用域(如原型、請(qǐng)求、會(huì)話等)的是不起作用的。

代碼演示:

  • 默認(rèn)不做任何配置。
@Component
public class MyBean {

    public MyBean() {
        System.out.println("My bean init success.");
    }

    public void exec() {
        System.out.println("exec suc");
    }

}

啟動(dòng)結(jié)果:

通過觀察啟動(dòng)結(jié)果,可以看到 myBean 在啟動(dòng)的時(shí)候被初始化了。

  • 加上@Lazy
@Lazy
@Component
public class MyBean {

    public MyBean() {
        System.out.println("My bean init success.");
    }

    public void exec() {
        System.out.println("exec suc");
    }

}

啟動(dòng)結(jié)果:

通過觀察啟動(dòng)結(jié)果,可以看到 myBean 并沒有初始化,說(shuō)明@Lazy生效了。

  • 設(shè)置 scope
@Lazy
@Component
@Scope("prototype")
public class MyBean {

    public MyBean() {
        System.out.println("My bean init success.");
    }

    public void exec() {
        System.out.println("exec suc");
    }

}

啟動(dòng)結(jié)果:

這個(gè)時(shí)候你會(huì)發(fā)現(xiàn),貌似這個(gè)結(jié)果不對(duì)呀。上面提到,@Lazy 注解只對(duì)單例(Singleton)作用域的 Bean 有效。但是我已經(jīng)將 Scope 改為 prototype。 按理來(lái)應(yīng)該是這樣:

控制臺(tái)會(huì)輸出My bean init success.,然而事實(shí)就是沒有。那么這是為什么呢?

原因分析

由于是增加了@Scope("prototype"),發(fā)現(xiàn)結(jié)果不符合預(yù)期,那我們就從它入手。我們先回顧一下 Spring Bean 的作用域相關(guān)的知識(shí)。當(dāng) Spring Bean 作用域?yàn)?prototype時(shí),每次獲取 Bean 時(shí)都會(huì)重新創(chuàng)建一個(gè)實(shí)例。

換句話說(shuō),也就意味著,當(dāng)?shù)?Bean 作用域?yàn)?prototype 時(shí),Bean 在被使用的才會(huì)被初始化,并且每個(gè) Bean 都是全新的。

誒,在使用的時(shí)候被初始化,這不就是延遲初始化嗎。改下代碼測(cè)試一下:

去掉@Lazy

@Component
@Scope("prototype")
public class MyBean {

    public MyBean() {
        System.out.println("My bean init success.");
    }

    public void exec() {
        System.out.println("exec suc");
    }

}

啟動(dòng)結(jié)果:

發(fā)現(xiàn)和單獨(dú)配置@Lazy的效果是一樣,并沒有被初始化。

結(jié)論

當(dāng) bean 作用域是 prototype 時(shí),這些 bean 每次在需要時(shí),都會(huì)按需實(shí)例化和初始化,因此它們本質(zhì)上是延遲始化的。所以給他們配置@Lazy是沒有意義的。

在上面的案例,出現(xiàn)這樣的情況是因?yàn)?,在啟?dòng)的時(shí)候 myBean 并沒有,被其他 Bean 依賴和使用。所以表現(xiàn)出和@Lazy一樣的效果。誤以為當(dāng) Bean 作用域是 prototype 時(shí),@Lazy可以生效。

總結(jié)

由于 spring bean 的默認(rèn)作用域是:singleton。所以在啟動(dòng)的時(shí)候 bean 會(huì)被初始化,如果被標(biāo)記了@Lazy,會(huì)延遲初始化,但是如果被非懶加載的 Bean 注入了,@Lazy會(huì)失效。并且@Lazy注解只對(duì)單例 singleton 作用域的 Bean 有效。

結(jié)尾

如果覺得對(duì)你有幫助,可以多多評(píng)論,多多點(diǎn)贊哦,也可以到我的主頁(yè)看看,說(shuō)不定有你喜歡的文章,也可以隨手點(diǎn)個(gè)關(guān)注哦,謝謝。

以上就是詳解Spring 延遲初始化遇到的問題的詳細(xì)內(nèi)容,更多關(guān)于Spring 延遲初始化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java 中String.equals和==的比較

    java 中String.equals和==的比較

    這篇文章主要介紹了java 中String.equals和==的比較的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • common-upload上傳文件功能封裝類分享

    common-upload上傳文件功能封裝類分享

    本文介紹一個(gè)common-upload上傳封裝類,為了更方便的上傳文件,對(duì)common-upload進(jìn)行了一個(gè)簡(jiǎn)單的封裝,大家參考使用吧
    2014-01-01
  • SpringBoot如何使用注解進(jìn)行XSS防御

    SpringBoot如何使用注解進(jìn)行XSS防御

    在SpringBoot中,可以通過自定義@XSS注解和實(shí)現(xiàn)XSSValidator類來(lái)防御XSS攻擊,此方法適用于GET和POST請(qǐng)求,通過在方法參數(shù)或?qū)嶓w類屬性上添加@XSS注解,并結(jié)合@Valid或@Validated注解使用,有效攔截潛在的XSS腳本,保障應(yīng)用安全
    2024-11-11
  • java字符串反轉(zhuǎn)示例分享

    java字符串反轉(zhuǎn)示例分享

    這篇文章主要介紹了將一個(gè)字符串進(jìn)行反轉(zhuǎn)或者字符串中指定部分進(jìn)行反轉(zhuǎn)的方法,大家參考使用吧
    2014-01-01
  • Java基礎(chǔ)篇之反射機(jī)制示例詳解

    Java基礎(chǔ)篇之反射機(jī)制示例詳解

    反射是Java可以提供的一個(gè)靈活又強(qiáng)大的功能,使用Java反射,您可以知道這個(gè)類在運(yùn)行時(shí)具有什么屬性和方法,也可以修改屬性,調(diào)用方法,創(chuàng)建類的實(shí)例,這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)篇之反射機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • SpringSecurity整合jwt權(quán)限認(rèn)證的全流程講解

    SpringSecurity整合jwt權(quán)限認(rèn)證的全流程講解

    這篇文章主要介紹了SpringSecurity整合jwt權(quán)限認(rèn)證的全流程講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • IDEA實(shí)用好用插件推薦及使用方法教程詳解(必看)

    IDEA實(shí)用好用插件推薦及使用方法教程詳解(必看)

    這篇文章主要介紹了IDEA實(shí)用好用插件推薦及使用方法教程,本文通過實(shí)例截圖相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java怎么獲取多網(wǎng)卡本地ip

    Java怎么獲取多網(wǎng)卡本地ip

    java獲取本地ip,獲取多網(wǎng)卡本地ip在項(xiàng)目中經(jīng)常會(huì)用到,下面小編把代碼分享到腳本之家平臺(tái),供大家參考
    2016-03-03
  • Springboot實(shí)現(xiàn)Excel批量導(dǎo)入數(shù)據(jù)并保存到本地

    Springboot實(shí)現(xiàn)Excel批量導(dǎo)入數(shù)據(jù)并保存到本地

    這篇文章主要為大家詳細(xì)介紹了Springboot實(shí)現(xiàn)Excel批量導(dǎo)入數(shù)據(jù)并將文件保存到本地效果的方法,文中的示例代講解詳細(xì),需要的可以參考一下
    2022-09-09
  • 關(guān)于RabbitMQ的Channel默認(rèn)線程

    關(guān)于RabbitMQ的Channel默認(rèn)線程

    這篇文章主要介紹了關(guān)于RabbitMQ的Channel默認(rèn)線程,通過jvm工具觀察rabbitmq的線程使用情況,發(fā)現(xiàn)生產(chǎn)者每發(fā)一條消息,消費(fèi)者這邊就會(huì)創(chuàng)建一條線程,言下之意,一個(gè)channel當(dāng)消息來(lái)到時(shí)就會(huì)異步處理這些消息,需要的朋友可以參考下
    2023-09-09

最新評(píng)論

清徐县| 青川县| 万安县| 景东| 大安市| 临沂市| 晋江市| 廉江市| 柘城县| 玉环县| 昌平区| 宁城县| 榆林市| 乡城县| 临清市| 象山县| 桦川县| 奇台县| 永顺县| 二连浩特市| 吴忠市| 安阳县| 沿河| 宁远县| 冀州市| 泸州市| 英超| 德保县| 外汇| 南雄市| 通辽市| 威海市| 博客| 滨州市| 赫章县| 杭锦旗| 保康县| 昭觉县| 甘肃省| 大丰市| 安庆市|