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

SpringBoot通過(guò)注解注入Bean的幾種方式解析

 更新時(shí)間:2022年03月10日 10:32:32   作者:Q.E.D  
這篇文章主要為大家介紹了SpringBoot注入Bean的幾種方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪

1、背景

我們談到Spring的時(shí)候一定會(huì)提到IOC容器、DI依賴注入,Spring通過(guò)將一個(gè)個(gè)類標(biāo)注為Bean的方法注入到IOC容器中,達(dá)到了控制反轉(zhuǎn)的效果。那么我們剛開(kāi)始接觸Bean的時(shí)候,一定是使用xml文件,一個(gè)一個(gè)的注入,就例如下面這樣。

 <bean id="bean" class="com.xxx.xxx.Bean" />

我們的項(xiàng)目一般很大的話,就需要成千上百個(gè)Bean去使用,這樣寫(xiě)起來(lái)就很繁瑣。那么Spring就幫我們實(shí)現(xiàn)了一種通過(guò)注解來(lái)實(shí)現(xiàn)注入的方法。只需要在你需要注入的類前面加上相應(yīng)的注解,Spring就會(huì)幫助我們掃描到他們?nèi)?shí)現(xiàn)注入。

xml掃描包的方式

 <context:component-scan base-package="com.xxx"/>

2、通過(guò)注解注入的一般形式

一般情況下,注入Bean有一個(gè)最直白,最易懂的方式去實(shí)現(xiàn)注入,下面廢話先不多說(shuō),先貼代碼。

2.1、Bean類

 public class MyBean{
 }

2.2、Configuration類

//創(chuàng)建一個(gè)class配置文件
@Configuration
public class MyConfiguration{
//將一個(gè)Bean交由Spring進(jìn)行管理
    @Bean
    public MyBean myBean(){
        return new MyBean();
    }
}

2.3、Test類

與xml有一點(diǎn)不同,這里在Test中,實(shí)例化的不再是ClassPathXmlApplicationContext,而是獲取的AnnotationConfigApplicationContext實(shí)例。

ApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class);
MyBean myBean = cotext.getBean("myBean",MyBean.class);
System.out.println("myBean = " + myBean);

上面的代碼中MyBean也就是我們需要Spring去管理的一個(gè)Bean,他只是一個(gè)簡(jiǎn)單的類。而MyConfiguration中,我們首先用@Configuration注解去標(biāo)記了該類,這樣標(biāo)明該類是一個(gè)Spring的一個(gè)配置類,在加載配置的時(shí)候會(huì)去加載他。

在MyConfiguration中我們可以看到有一個(gè)方法返回的是一個(gè)MyBean的實(shí)例,并且該方法上標(biāo)注著@Bean的注解,標(biāo)明這是一個(gè)注入Bean的方法,會(huì)將下面的返回的Bean注入IOC。

3、通過(guò)構(gòu)造方法注入Bean

我們?cè)谏梢粋€(gè)Bean實(shí)例的時(shí)候,可以使用Bean的構(gòu)造方法將Bean實(shí)現(xiàn)注入。直接看代碼

3.1、Bean類

 @Component
 public class MyBeanConstructor {
     private AnotherBean anotherBeanConstructor;
     @Autowired
     public MyBeanConstructor(AnotherBean anotherBeanConstructor){
         this.anotherBeanConstructor = anotherBeanConstructor;
     }
     @Override
     public String toString() {
         return "MyBean{" +
             "anotherBeanConstructor=" + anotherBeanConstructor +
             '}';
     }
 }

3.2、AnotherBean類

 @Component(value="Bean的id,默認(rèn)為類名小駝峰")
 public class AnotherBean {
 }

3.3、Configuration類

 @Configuration
 @ComponentScan("com.company.annotationbean")
 public class MyConfiguration{
 }

這里我們可以發(fā)現(xiàn),和一般方式注入的代碼不一樣了,我們來(lái)看看新的注解都是什么意思:

@AutoWired

簡(jiǎn)單粗暴,直接翻譯過(guò)來(lái)的意思就是自動(dòng)裝配:wrench:,還不理解為什么叫自動(dòng)裝配:wrench:?看了下一個(gè)注解的解釋你就知道了。若是在這里注入的時(shí)候指定一個(gè)Bean的id就要使用@Qualifier注解

@Component(默認(rèn)單例模式)

什么??這翻譯過(guò)來(lái)是零件,怎么感覺(jué)像是修汽車??是的,Spring管理Bean的方法就是修汽車的方式。我們?cè)谛枰獙⒁粋€(gè)類變成一個(gè)Bean被Spring可以注入的時(shí)候加上注解零件@Conmonent,那么我們就可以在加載Bean的時(shí)候把他像零件一樣裝配:wrench:到這個(gè)IOC汽車上了

在這里我們還有幾個(gè)其他的注解也可以實(shí)現(xiàn)這個(gè)功能,也就是細(xì)化的@Component:

@Controller 標(biāo)注在Controller層

@Service 標(biāo)注在Service層

@Repository 標(biāo)注在dao層

@ComponentScan("")

還是翻譯,零件掃描,我們?nèi)タ纯蠢ㄌ?hào)里的“零件倉(cāng)庫(kù)”里面,哪些“零件”(類)需要被裝載,Spring就會(huì)去掃描這個(gè)包,將里面所有標(biāo)注了@Component的類進(jìn)行注入。

這里的通過(guò)構(gòu)造方法進(jìn)行注入就很好理解了,我們?cè)谘b配MyBean這個(gè)零件的時(shí)候,突然發(fā)現(xiàn)他必須在AnotherBean的基礎(chǔ)上才能安裝到IOC里面,那么我們就在每次裝配MyBean的時(shí)候自動(dòng)裝配:wrench:一個(gè)AnotherBean進(jìn)去。舉個(gè):chestnut:吧:

還是以汽車為例,我們?cè)诓扔烷T(mén)出發(fā)之前,是不是必須發(fā)車??這里的AutoWired的內(nèi)容就像發(fā)車,你不發(fā)車,這個(gè)油門(mén)你踩斷都沒(méi)有用,他都不會(huì)走。

4、通過(guò)set方法注入Bean

我們可以在一個(gè)屬性的set方法中去將Bean實(shí)現(xiàn)注入,看代碼吧

4.1、MyBean類

 @Component
 public class MyBeanSet {
     private AnotherBean anotherBeanSet;
     @Autowired
     public void setAnotherBeanSet(AnotherBean anotherBeanSet) {
         this.anotherBeanSet = anotherBeanSet;
     }
     @Override
     public String toString() {
         return "MyBeanSet{" +
             "anotherBeanSet=" + anotherBeanSet +
             '}';
     }
 }

4.2、Configuration類 和 Test類

同上一個(gè),就不貼了

這里我們發(fā)現(xiàn)在setter方法上我們有一個(gè)@AutoWired,與上面不同的是,我們不會(huì)在實(shí)例化該類時(shí)就自動(dòng)裝配:wrench:這個(gè)對(duì)象,而是在顯式調(diào)用setter的時(shí)候去裝配。

5、通過(guò)屬性去注入Bean

我們前面兩種注入的方式諸如時(shí)間不同,并且代碼較多,若是通過(guò)屬性,即就是

 @Component
 public class MyBeanProperty {
     @Autowired
     private AnotherBean anotherBeanProperty;
     @Override
     public String toString() {
         return "MyBeanProperty{" +
             "anotherBeanProperty=" + anotherBeanProperty +
             '}';
     }
 }

這里我們可以看到我們這個(gè)類中需要使用AnotherBean這個(gè)實(shí)例對(duì)象,我們可以通過(guò)@AutoWired去自動(dòng)裝配它。

6、通過(guò)List注入Bean

6.1、MyBeanList類

 @Component
 public class MyBeanList {
     private List<String> stringList;
     @Autowired
     public void setStringList(List<String> stringList) {
         this.stringList = stringList;
     }
     public List<String> getStringList() {
         return stringList;
     }
 }

6.2、MyConfiguration類

 @Configuration
 @ComponentScan("annoBean.annotationbean")
 public class MyConfiguration {
     @Bean
     public List<String> stringList(){
        List<String> stringList = new ArrayList<String>();
         stringList.add("List-1");
         stringList.add("List-2");
         return stringList;
     }
 }

這里我們將MyBeanList進(jìn)行了注入,對(duì)List中的元素會(huì)逐一注入。下面介紹另一種方式注入List

6.3、MyConfiguration類

@Bean
//通過(guò)該注解設(shè)定Bean注入的優(yōu)先級(jí),不一定連續(xù)數(shù)字
@Order(34)
public String string1(){
    return "String-1";
}
@Bean
@Order(14)
public String string2(){
    return "String-2";
}

注入與List中泛型一樣的類型,會(huì)自動(dòng)去匹配類型,及時(shí)這里沒(méi)有任何List的感覺(jué),只是String的類型,但他會(huì)去通過(guò)List的Bean的方式去注入。

第二種方式的優(yōu)先級(jí)高于第一種,當(dāng)兩個(gè)都存在的時(shí)候,若要強(qiáng)制去使用第一種方式,則要去指定Bean的id即可

7、通過(guò)Map去注入Bean

 @Component
 public class MyBeanMap {
     private Map<String,Integer> integerMap;
     public Map<String, Integer> getIntegerMap() {
         return integerMap;
     }
     @Autowired
     public void setIntegerMap(Map<String, Integer> integerMap) {
         this.integerMap = integerMap;
     }
 }
 @Bean
    public Map<String,Integer> integerMap(){
        Map<String,Integer> integerMap = new HashMap<String, Integer>();
        integerMap.put("map-1",1);
        integerMap.put("map-2",2);
        return integerMap;
    }
    @Bean
    public Integer integer1(){
        return 1;
    }
    @Bean
    public Integer integer2(){
        return 2;
    }

同樣這里也具有兩種方式去注入Map類型Bean,且第二種的優(yōu)先值高于第一種

以上就是Bean通過(guò)注解注入的幾種方式,大家可以對(duì)比著xml注入的方式去看。

希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Java語(yǔ)言開(kāi)發(fā)的一個(gè)高效的敏感詞過(guò)濾工具

    基于Java語(yǔ)言開(kāi)發(fā)的一個(gè)高效的敏感詞過(guò)濾工具

    這篇文章主要為大家詳細(xì)介紹了如何基于Java語(yǔ)言開(kāi)發(fā)的一個(gè)高效的敏感詞過(guò)濾工具,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以參考一下
    2025-01-01
  • JAVA進(jìn)階之HashMap底層實(shí)現(xiàn)解析

    JAVA進(jìn)階之HashMap底層實(shí)現(xiàn)解析

    Hashmap是java面試中經(jīng)常遇到的面試題,大部分都會(huì)問(wèn)其底層原理與實(shí)現(xiàn),為了能夠溫故而知新,特地寫(xiě)了這篇文章,以便時(shí)時(shí)學(xué)習(xí)
    2021-11-11
  • Java 字符終端上獲取輸入三種的方式分享

    Java 字符終端上獲取輸入三種的方式分享

    這篇文章主要介紹了Java 字符終端上獲取輸入三種的方式,有需要的朋友可以參考一下
    2013-11-11
  • springboot應(yīng)用訪問(wèn)zookeeper的流程

    springboot應(yīng)用訪問(wèn)zookeeper的流程

    這篇文章主要介紹了springboot應(yīng)用訪問(wèn)zookeeper的流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot整合neo4j使用詳解

    SpringBoot整合neo4j使用詳解

    這篇文章將和大家詳細(xì)聊聊如何在springboot應(yīng)用中集成和使用neo4j,文中有詳細(xì)的實(shí)現(xiàn)流程和實(shí)例代碼,具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • Java中Lambda表達(dá)式的使用詳細(xì)教程

    Java中Lambda表達(dá)式的使用詳細(xì)教程

    這篇文章將通過(guò)示例為大家詳細(xì)展示Java中Lambda表達(dá)式的用法,同時(shí)也會(huì)介紹Lambda的相關(guān)知識(shí),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-05-05
  • MyBatis獲取自動(dòng)生成的(主)鍵值的方法

    MyBatis獲取自動(dòng)生成的(主)鍵值的方法

    本文主要介紹了MyBatis獲取自動(dòng)生成的(主)鍵值的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java sm3加密算法的實(shí)現(xiàn)

    Java sm3加密算法的實(shí)現(xiàn)

    這篇文章主要介紹了Java sm3加密算法的實(shí)現(xiàn),幫助大家更好的利用Java進(jìn)行加密,感興趣的朋友可以了解下
    2020-10-10
  • 關(guān)于@Value注解取不到值的幾種情況

    關(guān)于@Value注解取不到值的幾種情況

    這篇文章主要介紹了關(guān)于@Value注解取不到值的幾種情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java Spring Bean的生命周期管理詳解

    Java Spring Bean的生命周期管理詳解

    這篇文章主要為大家介紹了Java Spring Bean的生命周期管理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12

最新評(píng)論

博罗县| 施甸县| 都江堰市| 胶州市| 深圳市| 桐柏县| 屯门区| 桐庐县| 兰州市| 晴隆县| 正安县| 象山县| 新津县| 临邑县| 贡嘎县| 吉安市| 舟曲县| 漠河县| 永城市| 福贡县| 逊克县| 武隆县| 鸡泽县| 绍兴市| 来凤县| 威远县| 禄丰县| 吉林省| 界首市| 娄底市| 汉寿县| 涪陵区| 社会| 太原市| 绩溪县| 浦江县| 美姑县| 昭苏县| 比如县| 东兴市| 长泰县|