欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中選擇性加載Bean的幾種方式小結(jié)

 更新時間:2025年01月24日 10:00:56   作者:何中應(yīng)  
自動配置是springboot技術(shù)非常好用的核心因素,前面學(xué)習(xí)了這么多種技術(shù)的整合,每一個都離不開自動配置,不過在學(xué)習(xí)自動配置的時候,需要你對spring容器如何進行bean管理的過程非常熟悉才行,本文給大家介紹了SpringBoot中選擇性加載Bean的幾種方式,需要的朋友可以參考下

@ConditionalOnProperty

@ConditionalOnProperty,根據(jù)配置文件中指定的值決定是否加載,如下:

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;

/**
 * 根據(jù)配置文件中指定的值決定是否加載;
 */
@Component
@ConditionalOnProperty(name = "dev.name", havingValue = "hezy", matchIfMissing = true)
public class OnProperty {
}

參數(shù),其中:

  • name/value:配置項名稱;
  • havingValue:配置值;
  • matchIfMissing:表示不存在該配置項時,是否加載Bean,默認(rèn)false,需要注意,這里說的是沒有該配置項,而不是配置值對應(yīng)不上;

如上面的代碼,表示配置文件中存在dev.name配置項,且值為hezy時加載Bean,沒有配置項的話加載;

application.yml,如下:

server:
  port: 7084

dev:
  name: "dev"

啟動項目,不加載該Bean,因為配置項的值對不上

在這里插入圖片描述

@ConditionalOnJava

@ConditionalOnJava,根據(jù)Java版本決定是否加載,如下:

import org.springframework.boot.autoconfigure.condition.ConditionalOnJava;
import org.springframework.boot.system.JavaVersion;
import org.springframework.stereotype.Component;

/**
 * 根據(jù)Java版本決定是否加載
 */
@Component
@ConditionalOnJava(JavaVersion.SEVENTEEN)
public class OnJava {
}

注解的參數(shù)只有一個,即Java版本,如我IDEA中加載的JDK11,填JavaVersion.SEVENTEEN,Java17,不會加載該Bean。但是如果設(shè)置的是JavaVersion.EIGHT,則會加載Bean,也就說這里向下兼容了。

(Java11)

在這里插入圖片描述

(代碼設(shè)置的Java8)

import org.springframework.boot.autoconfigure.condition.ConditionalOnJava;
import org.springframework.boot.system.JavaVersion;
import org.springframework.stereotype.Component;

/**
 * 根據(jù)Java版本決定是否加載
 */
@Component
@ConditionalOnJava(JavaVersion.EIGHT)
public class OnJava {
}

啟動項目,加載了Bean

在這里插入圖片描述

@ConditionalOnBean

@ConditionalOnBean,根據(jù)Spring容器中是否存在指定的Bean決定是否加載。有以下三種配置:

  • 指定類:@ConditionalOnBean(OnJava.class)
  • 指定Bean:@ConditionalOnBean(name = “onProperty”)
  • 指定多個類:@ConditionalOnBean({OnProperty.class, OnJava.class})

如下,表示只有容器中存在OnJava.class的Bean時才加載

import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.stereotype.Component;

/**
 * 根據(jù)Spring容器中是否存在指定的Bean決定是否加載
 */
@Component
@ConditionalOnBean(OnJava.class)
public class OnBean {
}

因為容器中有OnJava,所以O(shè)nBean也加載了;

在這里插入圖片描述

@ConditionalOnMissingBean

@ConditionalOnMissingBean,根據(jù)Spring容器中是否不存在指定的Bean決定是否加載,與@ConditionalOnBean相反。也有以下三種配置方式:

  • 指定類:@ConditionalOnMissingBean(OnJava.class)
  • 指定Bean:@ConditionalOnMissingBean(name = “onProperty”)
  • 指定多個類:@ConditionalOnMissingBean({OnProperty.class, OnJava.class})

如下,表示容器中OnJava、OnClass都不存在時才加載。注意如果指定多個類,它們的條件是 And 的關(guān)系,@ConditionalOnBean 也一樣。

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.stereotype.Component;

/**
 * 根據(jù)Spring容器中是否不存在指定的Bean決定是否加載
 */
@Component
@ConditionalOnMissingBean({OnJava.class, OnProperty.class})
public class OnMissingBean {
}

如下,容器中沒有OnProperty,但是OnJava有,所以O(shè)nMissingBean也不加載,需要都不存在才加載

在這里插入圖片描述

@ConditionalOnClass

@ConditionalOnClass,根據(jù)類是否存在指定的類來決定是否加載,有以下三種配置:

  • 指定類:@ConditionalOnClass(OnJava.class);
  • 指定類的全限定類名:@ConditionalOnClass(name = “com.hezy.bean.OnJava”)
  • 指定多個類:@ConditionalOnClass({OnJava.class, OnClass.class})

需要和上面的指定OnBean區(qū)分開,指定Bean是需要類加載到容器里,即類上要打@Component、@Service、@Controller等這樣的注解,而OnClass就不用,只要你存在這樣的類文件即可。

如下,表示存在OnJava類加載

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.stereotype.Component;

/**
 * 根據(jù)類是否存在指定的類來決定是否加載
 */
@Component
@ConditionalOnClass(name = "com.hezy.bean.OnJava")
public class OnClass {
}

把OnJava類上的@Component注解去掉,啟動項目

import org.springframework.boot.autoconfigure.condition.ConditionalOnJava;
import org.springframework.boot.system.JavaVersion;

/**
 * 根據(jù)Java版本決定是否加載
 */
@ConditionalOnJava(JavaVersion.EIGHT)
public class OnJava {
}

可以看到,容器里沒有OnJava的Bean,但是OnClass加載了

在這里插入圖片描述

@ConditionalOnMissingClass

@ConditionalOnMissingClass,根據(jù)類路徑中是否不存在指定的類來決定是否加載,與@ConditionalOnClass相反,配置方式有兩種:

  • 指定類的全限定類名:@ConditionalOnMissingClass(“com.hezy.bean.OnJava”)
  • 指定多個類:@ConditionalOnMissingClass({“com.hezy.bean.OnJava1”, “com.hezy.bean.OnJava2”})

為什么少了指定類,因為這里配置的是不存在的類,不存在的類,怎么寫 類名.class (笑)

如下,表示不存在對應(yīng)路徑的OnJava1、OnJava2時才加載,配置多個類,是And的關(guān)系,即需要都不存在才加載;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.stereotype.Component;

/**
 * 根據(jù)類路徑中是否不存在指定的類來決定是否加載
 */
@Component
@ConditionalOnMissingClass({"com.hezy.bean.OnJava1", "com.hezy.bean.OnJava2"})
public class OnMissingClass {
}

因為配置的類都不存在,所以加載了OnMissingClass

在這里插入圖片描述

總結(jié)

本文介紹了Spring Boot中六種選擇性加載Bean的方式,按照配置文件加載Bean的方式用的最多。除此六種,Spring還支持其他方式,可在Spring Boot框架中用 @Conditional 為前綴搜索,如下:

在這里插入圖片描述

以上就是SpringBoot中選擇性加載Bean的幾種方式小結(jié)的詳細內(nèi)容,更多關(guān)于SpringBoot選擇性加載Bean的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java8時間 yyyyMMddHHmmss格式轉(zhuǎn)為日期的代碼

    java8時間 yyyyMMddHHmmss格式轉(zhuǎn)為日期的代碼

    這篇文章主要介紹了java8時間 yyyyMMddHHmmss格式轉(zhuǎn)為日期的代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • springboot項目攔截器重定向循環(huán)問題的解決

    springboot項目攔截器重定向循環(huán)問題的解決

    這篇文章主要介紹了springboot項目攔截器重定向循環(huán)問題的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java接口防重提交的處理方法

    java接口防重提交的處理方法

    本文主要介紹了java接口防重提交的處理方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 詳解Spring cloud使用Ribbon進行Restful請求

    詳解Spring cloud使用Ribbon進行Restful請求

    這篇文章主要介紹了詳解Spring cloud使用Ribbon進行Restful請求,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用

    Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用

    這篇文章主要介紹了Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • java 算法 6種排序小結(jié)

    java 算法 6種排序小結(jié)

    這篇文章主要介紹了java 算法 6種排序,排序原理及實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • Java面向?qū)ο蠡A(chǔ)知識之枚舉

    Java面向?qū)ο蠡A(chǔ)知識之枚舉

    這篇文章主要介紹了Java面向?qū)ο蟮闹杜e,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-11-11
  • JavaSE基礎(chǔ)之反射機制(反射Class)詳解

    JavaSE基礎(chǔ)之反射機制(反射Class)詳解

    反射機制有什么用?通過java語言中的反射機制可以操作字節(jié)碼文件,可以讀和修改字節(jié)碼文件。所以本文將為大家講講反射機制的使用,需要的可以參考一下
    2022-09-09
  • RocketMQ生產(chǎn)者一個應(yīng)用不能發(fā)送多個NameServer消息解決

    RocketMQ生產(chǎn)者一個應(yīng)用不能發(fā)送多個NameServer消息解決

    這篇文章主要為大家介紹了RocketMQ生產(chǎn)者一個應(yīng)用不能發(fā)送多個NameServer消息原因及解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • java.lang.Runtime.exec的左膀右臂:流輸入和流讀取詳解

    java.lang.Runtime.exec的左膀右臂:流輸入和流讀取詳解

    這篇文章主要介紹了java.lang.Runtime.exec的左膀右臂:流輸入和流讀取詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論