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

SpringBoot Bean被加載時(shí)進(jìn)行控制

 更新時(shí)間:2023年02月10日 09:29:58   作者:零維展開智子  
很多時(shí)候我們需要根據(jù)不同的條件在容器中加載不同的Bean,或者根據(jù)不同的條件來選擇是否在容器中加載某個(gè)Bean,這就是Bean的加載控制,一般我們可以通過編程式或注解式兩種不同的方式來完成Bean的加載控制

序章

簡介:bean的加載控制指根據(jù)特定情況對(duì)bean進(jìn)行選擇性加載以達(dá)到適用項(xiàng)目的目標(biāo)。

根據(jù)之前對(duì)bean加載的八種方式,其中后面四種是可以對(duì)bean被加載時(shí)進(jìn)行控制。

我拿第六種來舉個(gè)例子。

之前也舉過例子,但是實(shí)際開發(fā)呢,一般不會(huì)那么使用。

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        try {
            Class<?> name = Class.forName("yi.beans.kun");
            if (name!=null){
                return new String[]{"yi.beans.Cat"};
            }
        }catch (ClassNotFoundException e){
            return new  String[0];
        }
        return null;
    }
}

通過查看某個(gè)類是否存在來控制是否加載目標(biāo)類。

這個(gè)類我是不存在的。

import org.springframework.context.annotation.Import;
import yi.beans.MyImportSelector;
@Import(MyImportSelector.class)
public class AConfig {
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import yi.config.AConfig;
public class App3 {
    public static void main(String[] args) {
        ApplicationContext context=new AnnotationConfigApplicationContext(AConfig.class);
        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}

所以我是沒有加載這個(gè)bean的,還是老話,前面的那些暫時(shí)不看。

加載控制@Conditional派生注解

到了這里,你的spring項(xiàng)目就該換成springboot項(xiàng)目了,pom.xml中添加坐標(biāo),我就不多說了,這就是springboot的注解,源代碼中大量使用。

這是我未加控制前的代碼

import org.springframework.context.annotation.ComponentScan;
@ComponentScan("yi.beans")
public class AConfig {
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import yi.config.AConfig;
public class App3 {
    public static void main(String[] args) {
        ApplicationContext context=new AnnotationConfigApplicationContext(AConfig.class);
        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
}

有貓,有狗,有老鼠,只不過我給他們都起了名字,你們很容易就會(huì)看出來。

現(xiàn)在我要對(duì)貓這個(gè)bean在創(chuàng)建時(shí)加一控制。

控制后

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWebApplication;
import org.springframework.stereotype.Component;
@ConditionalOnClass(Mouse.class)    //要加載貓,必須要有老鼠這個(gè)bean
@ConditionalOnBean(name = "zhizhi")     //而且這個(gè)老鼠bean的名字必須是“zhizhi”
@ConditionalOnMissingClass("yi.beans.Dog")      //但是不能有狗,貓捉老鼠不想有狗
@ConditionalOnNotWebApplication     //環(huán)境必須為非Web環(huán)境
@Component("miao")  //貓的bean叫“miao”
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Cat {
    String shout;
}

這里我加了幾個(gè)常見的派生注解,其他的代碼都是不用變的,我的bean里賣雖然有一個(gè)叫做“zhizhi”的老鼠,但是有狗,所以貓是加載不出來的。

其中的

@ConditionalOnClass
@ConditionalOnBean

這兩個(gè)注解非常相似,一般就用上面那個(gè)控制類的字節(jié)碼或者路徑。下面那個(gè)獲取bean的名字,搭配使用就好了。

bean依賴的屬性配置

先定義兩個(gè)最基礎(chǔ)的bean

import lombok.Data;
@Data
public class Mouse {
    private String name;
    private int age;
}
import lombok.Data;
@Data
public class Cat {
    private String name;
    private int age;
}

cartoon:
  cat:
    name: "圖多蓋洛"
    age:  5
  mouse:
    name: "泰菲"
    age: 1 

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Data
@ConfigurationProperties(prefix = "cartoon")    
public class CartoonProperties {
    private Cat cat;
    private Mouse mouse;
}
import lombok.Data;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
@Data
@Component
@EnableConfigurationProperties(CartoonProperties.class)
public class CartoonCatAndMouse {
    private Cat cat;
    private Mouse mouse;
    private CartoonProperties cartoonProperties;
    public CartoonCatAndMouse(CartoonProperties cartoonProperties){
        this.cartoonProperties=cartoonProperties;
        this.cat=new Cat();
        this.cat.setName(cartoonProperties.getCat()!=null&& StringUtils.hasText(cartoonProperties.getCat().getName())?
                cartoonProperties.getCat().getName():"Tom");
        this.cat.setAge(cartoonProperties.getCat()!=null&& cartoonProperties.getCat().getAge()!=0?
                cartoonProperties.getCat().getAge():6);
        this.mouse=new Mouse();
        this.mouse.setName(cartoonProperties.getMouse()!=null&&StringUtils.hasText(cartoonProperties.getMouse().getName())?
                cartoonProperties.getMouse().getName():"Jerry");
        this.mouse.setAge(cartoonProperties.getMouse()!=null && cartoonProperties.getMouse().getAge()!=0?
                cartoonProperties.getMouse().getAge():2);
    }
    public void play() {
        System.out.println(cat.getAge()+"歲的"+cat.getName()+"和"+mouse.getAge()+"歲的"+mouse.getName()+"打起來了");
    }
}
import com.yi.bean.CartoonCatAndMouse;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootBean2ApplicationTests {
    @Autowired
    private CartoonCatAndMouse cartoonCatAndMouse;
    @Test
    void contextLoads() {
        cartoonCatAndMouse.play();
    }
}

可以看到加載的就是我們自己寫的配置,現(xiàn)在我把配置注解一部分,我們再來看運(yùn)行結(jié)果。

cartoon:
  cat:
#    name: "圖多蓋洛"
    age:  5
  mouse:
#    name: "泰菲"
    age: 1

可以看到,沒有寫的屬性使用的就是默認(rèn)屬性,也就是自動(dòng)配置的思想,只有在調(diào)用的時(shí)候才會(huì)生成bean,默認(rèn)的bean也不會(huì)在項(xiàng)目加載時(shí)就添加,這樣壓力會(huì)很大。如果我們沒有使用某個(gè)第三方的bean,我們的項(xiàng)目啟動(dòng)時(shí)也并不會(huì)加載默認(rèn)的bean。

到此這篇關(guān)于SpringBoot Bean被加載時(shí)進(jìn)行控制的文章就介紹到這了,更多相關(guān)SpringBoot Bean加載控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring-cloud Sleuth的使用方法

    spring-cloud Sleuth的使用方法

    這篇文章主要介紹了spring-cloud Sleuth的使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Simple JSON開發(fā)指南

    Simple JSON開發(fā)指南

    注意:JSONPauser不是線程安全的,需要的朋友可以參考下
    2016-04-04
  • Java常見踩坑記錄之異常處理

    Java常見踩坑記錄之異常處理

    程序運(yùn)行時(shí)發(fā)生的不被期望的事件,它阻止了程序按照程序員的預(yù)期正常執(zhí)行,這就是異常,下面這篇文章主要給大家介紹了關(guān)于Java常見踩坑記錄之異常處理的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • SpringBoot實(shí)現(xiàn)整合微信支付方法詳解

    SpringBoot實(shí)現(xiàn)整合微信支付方法詳解

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)整合微信支付的過程詳解,文中的示例代碼對(duì)我們的工作或?qū)W習(xí)有一定的幫助,感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下
    2021-12-12
  • java 拋出異常處理的方法

    java 拋出異常處理的方法

    這篇文章主要介紹了java 拋出異常處理的方法的相關(guān)資料,throws關(guān)鍵字通常被應(yīng)用在聲明方法時(shí),用來指定可能拋出的異常,這里就講下如何使用,需要的朋友可以參考下
    2017-08-08
  • Java獲取時(shí)間差(天數(shù)差,小時(shí)差,分鐘差)代碼示例

    Java獲取時(shí)間差(天數(shù)差,小時(shí)差,分鐘差)代碼示例

    這篇文章主要介紹了Java獲取時(shí)間差(天數(shù)差,小時(shí)差,分鐘差)代碼示例,使用SimpleDateFormat來實(shí)現(xiàn)的相關(guān)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • java 實(shí)現(xiàn)增量同步和自定義同步的操作

    java 實(shí)現(xiàn)增量同步和自定義同步的操作

    這篇文章主要介紹了java 實(shí)現(xiàn)增量同步和自定義同步的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Spring Boot實(shí)現(xiàn)簡單的定時(shí)任務(wù)

    Spring Boot實(shí)現(xiàn)簡單的定時(shí)任務(wù)

    這篇文章主要給大家介紹了關(guān)于利用Spring Boot實(shí)現(xiàn)簡單的定時(shí)任務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 單點(diǎn)登錄的概念及SpringBoot實(shí)現(xiàn)單點(diǎn)登錄的操作方法

    單點(diǎn)登錄的概念及SpringBoot實(shí)現(xiàn)單點(diǎn)登錄的操作方法

    在本文中,我們將使用Spring Boot構(gòu)建一個(gè)基本的單點(diǎn)登錄系統(tǒng),我們將介紹如何使用Spring Security和JSON Web Tokens(JWTs)來實(shí)現(xiàn)單點(diǎn)登錄功能,本文假設(shè)您已經(jīng)熟悉Spring Boot和Spring Security,感興趣的朋友一起看看吧
    2024-10-10
  • Java中的Timer與TimerTask源碼及使用解析

    Java中的Timer與TimerTask源碼及使用解析

    這篇文章主要介紹了Java中的Timer與TimerTask源碼及使用解析,在Java中,經(jīng)常使用Timer來定時(shí)調(diào)度任務(wù),Timer調(diào)度任務(wù)有一次性調(diào)度和循環(huán)調(diào)度,循環(huán)調(diào)度有分為固定速率調(diào)度(fixRate)和固定時(shí)延調(diào)度(fixDelay),需要的朋友可以參考下
    2023-10-10

最新評(píng)論