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

Spring?@Bean?修飾方法時(shí)注入?yún)?shù)的操作方法

 更新時(shí)間:2023年10月07日 12:15:06   作者:Varitall  
對于 Spring 而言,IOC 容器中的 Bean 對象的創(chuàng)建和使用是一大重點(diǎn),Spring 也為我們提供了注解方式創(chuàng)建 bean 對象:使用 @Bean,這篇文章主要介紹了Spring?@Bean?修飾方法時(shí)如何注入?yún)?shù),需要的朋友可以參考下

一、@Bean 的簡單使用

在開發(fā)中,基于 XML 文件配置 Bean 對象的做法非常繁瑣且不好維護(hù),因此絕大部分情況下都是使用“完全注解開發(fā)”。

對于 Spring 而言,IOC 容器中的 Bean 對象的創(chuàng)建和使用是一大重點(diǎn),Spring 也為我們提供了注解方式創(chuàng)建 bean 對象:使用 @Bean。

在舉例之前,先熟悉以下兩個(gè)需要用到的類:

(1)User 類

package com.demo.pojo;
import org.springframework.stereotype.Component;
@Component
public class User {
    private String name;
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }
}

 (2)Book 類

package com.demo.pojo;
import org.springframework.stereotype.Component;
@Component
public class Book {
    private User user;
    public void setUser(User user) {
        this.user = user;
    }
    public User getUser() {
        return user;
    }
}

1、正常情況

(1)下面是一個(gè)簡單的 bean 對象創(chuàng)建:

@Bean
public User getUser() {
    return new User();
}

經(jīng)此操作,IOC 中就會(huì)多出一個(gè)與 <bean id = "getUser" class = "類路徑.User"/> 同義的 bean 對象。即:方法名就是 id,返回類型就是 class。

(2)含有普通類型參數(shù)的 bean 對象創(chuàng)建:

@Bean
public User getUser(@Value("wyt") String name) {
    User user = new User();
    user.setName(name);
    return user;
}

需要注意的是,方法中的參數(shù)并不是 bean 對象的成員屬性,而是代表著 bean 對象的創(chuàng)建依賴于這幾個(gè)參數(shù),或許用來 setParameter,或許只是中間變量。

而在 xml 文件中的 <property> 則必須要求用 set 方法。

(3)含有對象類型參數(shù)的 bean 對象創(chuàng)建:

package com.demo.config;
import com.demo.pojo.Book;
import com.demo.pojo.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
@Configuration
public class Config {
    @Bean
    public User getUser(@Value("wyt") String name) {
        User user = new User();
        user.setName(name);
        return user;
    }
    @Bean
    public Book createBook(User user) {
        Book book = new Book();
        book.setUser(user);
        return book;
    }
}

對比在 xml 中是如何實(shí)現(xiàn)參數(shù)是對象類型時(shí)的屬性注入:

(4)正常情況下,@Bean 使用總結(jié)

(4-1)@Bean 注解的方法,其返回值就是一個(gè) <bean> 對象,并且注冊到了 IOC 容器中。

  • id 為方法的名字;
  • class 為方法的返回類型;

(4-2)@Bean 對象的實(shí)例化依賴于方法內(nèi)的參數(shù),參數(shù)可以是普通類型,也可以是對象類型。

  • 若為普通類型,用 @Value("xxx") 來注入這個(gè)參數(shù);
  • 若為對象類型,則默認(rèn)情況下,Spring 會(huì)到 IOC 容器中尋找與參數(shù)類型相同的 bean 對象來注入這個(gè)參數(shù);

2、問題提出

根據(jù)上述內(nèi)容,我們會(huì)想到:如果參數(shù)是對象類型,可是 IOC 中擁有不止一個(gè)相同類型的 bean 對象,這該怎么辦呢?

比如下面的情況:

可以看到,Book 對象的參數(shù) user 已經(jīng)報(bào)錯(cuò)了,無法自動(dòng)裝配,因?yàn)榇嬖诙鄠€(gè) User 類型的 Bean,Spring 不知道應(yīng)該將哪個(gè) bean 注入到 user 中。

二、解決方案

首先我們要知道,默認(rèn)情況下,參數(shù)的注入使用的是 @Autowired,不需要顯式寫出。

1、@Qualifier

我們可以想到,@Autowired 是根據(jù)類型自動(dòng)裝配,當(dāng)一個(gè)類型有多個(gè) bean 對象時(shí)失效。

而 @Qualifier 是根據(jù)名稱進(jìn)行裝配,這不就意味著我們可以用 @Qualifier 來明確需要的 bean 對象嘛。

這有兩種寫法,都是有效的:

  • 直接在參數(shù)前加 @Qualifier("function_name");
  • 在方法前加 @Qualifier("function_別名"),在參數(shù)前加 @Qualifier("function_別名");

(1)配置類

package com.demo.config;
import com.demo.pojo.Book;
import com.demo.pojo.User;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
@Configuration
public class Config {
    @Bean
    public User getUser(@Value("wyt") String name) {
        User user = new User();
        user.setName(name);
        return user;
    }
    @Bean
    public User createUser(@Value("wyt") String name) {
        User user = new User();
        user.setName(name);
        return user;
    }
    @Bean
    public Book createBook(@Qualifier("createUser") User user) {
        Book book = new Book();
        book.setUser(user);
        return book;
    }
}

(2)測試代碼

@Test
public void SameObjectTest() {
    ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
    Book book = context.getBean("createBook", Book.class);
    System.out.println(book.getUser());
}

(3)輸出結(jié)果

2、直接寫方法名

因?yàn)橐话闱闆r下,方法名不能相同,因此也可以通過將參數(shù)名寫成對應(yīng)的方法名來進(jìn)行注入。

package com.demo.config;
import com.demo.pojo.Book;
import com.demo.pojo.User;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
@Configuration
public class Config {
    @Bean
    public User getUser(@Value("wyt") String name) {
        User user = new User();
        user.setName(name);
        return user;
    }
    @Bean
    public User createUser(@Value("wyt") String name) {
        User user = new User();
        user.setName(name);
        return user;
    }
    @Bean
    public Book createBook(User createUser) {
        Book book = new Book();
        book.setUser(createUser);
        return book;
    }
}

三、特殊情況

在這里要說明一些特別的對象類型,比如:DataSource。

1、DataSource

(1)問題描述

@Bean
public DruidDataSource createDruidDataSource() {
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setDriverClassName(driver);
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    return dataSource;
}
@Bean
public DruidDataSource getDruidDataSource() {
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setDriverClassName(driver);
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    return dataSource;
}

當(dāng)我們像上面的代碼一樣,寫了兩個(gè)數(shù)據(jù)源的 bean 對象之后,運(yùn)行就會(huì)出現(xiàn)如下報(bào)錯(cuò): 

No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found 2

簡單來說,就是因?yàn)?Spring 有其自身的配置類,導(dǎo)致程序不知道選擇哪一個(gè)數(shù)據(jù)源。

(2)解決方法

給其中任意一個(gè)加上 @Primary,代表當(dāng)出現(xiàn)多個(gè)同類型 bean 時(shí),優(yōu)先使用哪一個(gè)。寫上之后,就可以使用前文所述的方法,如:@Qualifier 或直接寫方法名。

@Bean
@Primary
public DruidDataSource createDruidDataSource() {
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setDriverClassName(driver);
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    return dataSource;
}

到此這篇關(guān)于Spring @Bean 修飾方法時(shí)如何注入?yún)?shù)的文章就介紹到這了,更多相關(guān)Spring @Bean 注入?yún)?shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA實(shí)現(xiàn)微信APPV3支付保姆級教程

    JAVA實(shí)現(xiàn)微信APPV3支付保姆級教程

    微信實(shí)現(xiàn)支付功能與支付寶實(shí)現(xiàn)支付功能是相似的,這篇文章主要介紹了JAVA實(shí)現(xiàn)微信APPV3支付的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Java編寫簡單猜數(shù)游戲

    Java編寫簡單猜數(shù)游戲

    這篇文章主要為大家詳細(xì)介紹了Java編寫簡單猜數(shù)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • mybatis in查詢條件過長的解決方案

    mybatis in查詢條件過長的解決方案

    這篇文章主要介紹了mybatis in查詢條件過長的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java使用動(dòng)態(tài)代理和反射實(shí)現(xiàn)字段變更跟蹤的方案

    Java使用動(dòng)態(tài)代理和反射實(shí)現(xiàn)字段變更跟蹤的方案

    該文章介紹了如何使用Java動(dòng)態(tài)代理和反射技術(shù)來跟蹤記錄對象字段的變更前和變更后的數(shù)據(jù),文章詳細(xì)講解了創(chuàng)建變更記錄數(shù)據(jù)結(jié)構(gòu)、變更跟蹤處理器、代理工廠,并通過示例展示了如何使用和運(yùn)行這個(gè)代理,需要的朋友可以參考下
    2025-12-12
  • 深入了解Java中的Filter過濾器

    深入了解Java中的Filter過濾器

    Filter也稱之為過濾器,WEB開發(fā)人員通過Filter技術(shù),對web服務(wù)器管理的所有web資源:從而實(shí)現(xiàn)一些特殊的功能。例如實(shí)現(xiàn)URL級別的權(quán)限訪問控制、過濾敏感詞匯、壓縮響應(yīng)信息等一些高級功能。下面我們來簡單學(xué)習(xí)一下吧
    2019-05-05
  • springboot跨域如何設(shè)置SameSite的實(shí)現(xiàn)

    springboot跨域如何設(shè)置SameSite的實(shí)現(xiàn)

    這篇文章主要介紹了springboot跨域如何設(shè)置SameSite的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 高分面試分析jvm如何實(shí)現(xiàn)多態(tài)

    高分面試分析jvm如何實(shí)現(xiàn)多態(tài)

    這篇文章主要介紹了講解了在面試中jvm如何實(shí)現(xiàn)多態(tài),怎樣回答才能得到高分的問題分析,有需要的朋友可以借鑒參考下,祝大家早日升職加薪多多進(jìn)步
    2022-01-01
  • 詳解Spring注入集合(數(shù)組、List、Map、Set)類型屬性

    詳解Spring注入集合(數(shù)組、List、Map、Set)類型屬性

    這篇文章主要介紹了詳解Spring注入集合(數(shù)組、List、Map、Set)類型屬性,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • SpringBoot詳解整合Redis緩存方法

    SpringBoot詳解整合Redis緩存方法

    本文主要介紹了SpringBoot整合Redis緩存的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • dubbo參數(shù)校驗(yàn)ValidationFilter使用與說明

    dubbo參數(shù)校驗(yàn)ValidationFilter使用與說明

    本文介紹了Dubbo框架中Filter的核心功能和實(shí)現(xiàn)機(jī)制,Filter用于攔截RPC調(diào)用流程,支持自定義攔截邏輯,并通過SPI擴(kuò)展機(jī)制動(dòng)態(tài)加載,形成鏈?zhǔn)秸{(diào)用結(jié)構(gòu),文中還說明了內(nèi)置和自定義Filter的實(shí)現(xiàn)方式及ValidationFilter參數(shù)校驗(yàn)功能
    2025-10-10

最新評論

沐川县| 儋州市| 南平市| 休宁县| 岗巴县| 桃源县| 邯郸县| 芜湖县| 化隆| 武夷山市| 山丹县| 潮州市| 十堰市| 宁都县| 余姚市| 曲麻莱县| 台安县| 阳信县| 阳城县| 二连浩特市| 新昌县| 馆陶县| 尖扎县| 富平县| 汨罗市| 长海县| 文成县| 刚察县| 雷州市| 沁源县| 台山市| 沐川县| 连平县| 积石山| 七台河市| 青神县| 济阳县| 绍兴县| 绥阳县| 六盘水市| 长治市|