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

使用SpringBoot根據(jù)配置注入接口的不同實(shí)現(xiàn)類(代碼演示)

 更新時(shí)間:2022年06月30日 16:12:39   作者:祁畫(huà)_  
使用springboot開(kāi)發(fā)時(shí)經(jīng)常用到@Autowired和@Resource進(jìn)行依賴注入,但是當(dāng)我們一個(gè)接口對(duì)應(yīng)多個(gè)不同的實(shí)現(xiàn)類的時(shí)候如果不進(jìn)行一下配置項(xiàng)目啟動(dòng)時(shí)就會(huì)報(bào)錯(cuò),那么怎么根據(jù)不同的需求注入不同的類型呢,感興趣的朋友一起看看吧

一.引言

我們?cè)谑褂胹pringboot進(jìn)行開(kāi)發(fā)的時(shí)候經(jīng)常用到@Autowired@Resource進(jìn)行依賴注入,但是當(dāng)我們一個(gè)接口對(duì)應(yīng)多個(gè)不同的實(shí)現(xiàn)類的時(shí)候如果不進(jìn)行一下配置項(xiàng)目啟動(dòng)時(shí)就會(huì)報(bào)錯(cuò),那么怎么根據(jù)不同的需求注入不同的類型就是一個(gè)值得考慮的問(wèn)題,雖然@Autowired@Resource就可以實(shí)現(xiàn),但是我們也可以選擇更加靈活的@ConditionalOnProperty注解來(lái)實(shí)現(xiàn)

二.代碼演示

1.問(wèn)題描述

TestController.java

package com.example.demo.controller;
 
import com.example.demo.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
/**
 * @ClassName TestController
 * @Author xuwei
 * @DATE 2022/6/28
 */
@RestController
@RequestMapping("test")
public class TestController {
 
    //注入需要的service
    @Autowired
    TestService testService;
 
    @RequestMapping("test")
    public void test(){
        testService.sayHello();
    }
}

 TestService.java

package com.example.demo.service;
 
/**
 * @InterfaceName TestService
 * @Author xuwei
 * @DATE 2022/6/28
 */
public interface TestService {
    /**
     * sayHello方法
     */
    void sayHello();
}

TestService實(shí)現(xiàn)類一  TestServiceImplOne.java

package com.example.demo.service.impl;
 
import com.example.demo.service.TestService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
/**
 * @ClassName TestServiceImplOne
 * @Author xuwei
 * @DATE 2022/6/28
 */
@Service
public class TestServiceImplOne implements TestService {
    private static final Logger LOGGER = LoggerFactory.getLogger(TestServiceImplOne.class);
    /**
     * sayHello方法
     */
    @Override
    public void sayHello() {
        LOGGER.info("I am TestServiceImplOne");
    }
}

TestService實(shí)現(xiàn)類二 TestServiceImplTwo.java

package com.example.demo.service.impl;
 
import com.example.demo.service.TestService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
/**
 * @ClassName TestServiceImplTwo
 * @Author xuwei
 * @DATE 2022/6/28
 */
@Service
public class TestServiceImplTwo implements TestService {
    private static final Logger LOGGER = LoggerFactory.getLogger(TestServiceImplTwo.class);
    /**
     * sayHello方法
     */
    @Override
    public void sayHello() {
        LOGGER.info("I am TestServiceImplTwo");
    }
}

這時(shí)我們的程序啟動(dòng)會(huì)報(bào)錯(cuò),大概意思就是找到了兩個(gè)實(shí)現(xiàn)類

***************************
APPLICATION FAILED TO START
***************************
Description:
Field testService in com.example.demo.controller.TestController required a single bean, but 2 were found:
    - testServiceImplOne: defined in file [/Users/xuwei/Desktop/Projects/IdeaProjects/demo/target/classes/com/example/demo/service/impl/TestServiceImplOne.class]
    - testServiceImplTwo: defined in file [/Users/xuwei/Desktop/Projects/IdeaProjects/demo/target/classes/com/example/demo/service/impl/TestServiceImplTwo.class]
Action:
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

2.解決方案

2.1使用@Autowired的時(shí)候?qū)⒔涌谧兞棵臑閷?shí)現(xiàn)類的限定名

TestController.java修改為如下

package com.example.demo.controller;
 
import com.example.demo.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
/**
 * @ClassName TestController
 * @Author xuwei
 * @DATE 2022/6/28
 */
@RestController
@RequestMapping("test")
public class TestController {
 
    //修改變量名為實(shí)現(xiàn)類的限定名
    @Autowired
    TestService testServiceImplOne;
 
    @RequestMapping("test")
    public void test(){
        testServiceImplOne.sayHello();
    }
}

我們可以將接口的命名改為對(duì)應(yīng)實(shí)現(xiàn)類的限定名,默認(rèn)為類名且首字母小寫(xiě),當(dāng)然我們也可以自己給接口的實(shí)現(xiàn)類配置限定名,例如@Service("serviceOne") 之后在引用時(shí)使用我們配置的限定名,這樣程序都可以自動(dòng)找到實(shí)現(xiàn)類,測(cè)試結(jié)果如下:

2.2 使用@Autowired配合@Qualifier指定限定名注入實(shí)現(xiàn)類

其實(shí)這個(gè)方法的原理和上面的很相似,@Autowired會(huì)默認(rèn)根據(jù)type進(jìn)行注入,如果type相同會(huì)根據(jù)id進(jìn)行注入,也就是我們說(shuō)的限定名,我們只需要讓它找到對(duì)應(yīng)限定名的類即可,上面我們通過(guò)修改接口變量名的方式來(lái)實(shí)現(xiàn),同時(shí)我們還可以配合@Qualifier注解來(lái)實(shí)現(xiàn)相同的目的

TestController.java修改為如下

package com.example.demo.controller;
 
import com.example.demo.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
/**
 * @ClassName TestController
 * @Author xuwei
 * @DATE 2022/6/28
 */
@RestController
@RequestMapping("test")
public class TestController {
 
    //配合注解指定限定名
    @Qualifier("testServiceImplTwo")
    @Autowired
    TestService testService;
 
    @RequestMapping("test")
    public void test(){
        testService.sayHello();
    }
}

當(dāng)然,和上一種方法相同,我們注解中填的值是實(shí)現(xiàn)類的限定名,可以使用默認(rèn),也可以和上面一樣在使用@Service時(shí)進(jìn)行配置,測(cè)試結(jié)果如下:

2.3@ConditionalOnProperty

以上兩種方法都是硬編碼方式,在我們需要進(jìn)行用戶配置時(shí)很不方便,所以我們可以使用@ConditionalOnProperty注解來(lái)實(shí)現(xiàn)配置文件控制的功能

在TestController中使用@Resource注入

package com.example.demo.controller;
 
import com.example.demo.service.TestService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import javax.annotation.Resource;
 
/**
 * @ClassName TestController
 * @Author xuwei
 * @DATE 2022/6/28
 */
@RestController
@RequestMapping("test")
public class TestController {
 
    //使用@Resource注入
    @Resource
    TestService testService;
 
    @RequestMapping("test")
    public void test(){
        testService.sayHello();
    }
}

TestServiceImplOne.java

package com.example.demo.service.impl;
 
import com.example.demo.service.TestService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
 
/**
 * @ClassName TestServiceImplOne
 * @Author xuwei
 * @DATE 2022/6/28
 */
@Component
@ConditionalOnProperty(name = "serviceControl",havingValue = "serviceOne")
public class TestServiceImplOne implements TestService {
    private static final Logger LOGGER = LoggerFactory.getLogger(TestServiceImplOne.class);
    /**
     * sayHello方法
     */
    @Override
    public void sayHello() {
        LOGGER.info("I am TestServiceImplOne");
    }
}

TestServiceImplTwo.java

package com.example.demo.service.impl;
 
import com.example.demo.service.TestService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
 
/**
 * @ClassName TestServiceImplTwo
 * @Author xuwei
 * @DATE 2022/6/28
 */
@Component
@ConditionalOnProperty(name = "serviceControl",havingValue = "serviceTwo")
public class TestServiceImplTwo implements TestService {
    private static final Logger LOGGER = LoggerFactory.getLogger(TestServiceImplTwo.class);
    /**
     * sayHello方法
     */
    @Override
    public void sayHello() {
        LOGGER.info("I am TestServiceImplTwo");
    }
}

在配置文件中配置我們使用的類

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

 三.總結(jié)

前兩種方法都是去尋找接口的限定名,第三種方法中@ConditionalOnProperty(name = "serviceControl",havingValue = "serviceOne")注解的name屬性對(duì)應(yīng)配置文件中的key值,而havingValue屬性對(duì)應(yīng)的是配置文件中我們上面定義的name屬性對(duì)應(yīng)的value值

到此這篇關(guān)于SpringBoot根據(jù)配置注入接口的不同實(shí)現(xiàn)類的文章就介紹到這了,更多相關(guān)SpringBoot注入接口實(shí)現(xiàn)類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SSh結(jié)合Easyui實(shí)現(xiàn)Datagrid的分頁(yè)顯示

    SSh結(jié)合Easyui實(shí)現(xiàn)Datagrid的分頁(yè)顯示

    這篇文章主要為大家詳細(xì)介紹了SSh結(jié)合Easyui實(shí)現(xiàn)Datagrid的分頁(yè)顯示的相關(guān)資料,感興趣的小伙伴們可以參考一下
    2016-06-06
  • java中實(shí)現(xiàn)map與對(duì)象相互轉(zhuǎn)換的幾種實(shí)現(xiàn)

    java中實(shí)現(xiàn)map與對(duì)象相互轉(zhuǎn)換的幾種實(shí)現(xiàn)

    這篇文章主要介紹了java中實(shí)現(xiàn)map與對(duì)象相互轉(zhuǎn)換的幾種實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Springboot實(shí)現(xiàn)Java阿里短信發(fā)送代碼實(shí)例

    Springboot實(shí)現(xiàn)Java阿里短信發(fā)送代碼實(shí)例

    這篇文章主要介紹了springboot實(shí)現(xiàn)Java阿里短信發(fā)送代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 加速spring/springboot應(yīng)用啟動(dòng)速度詳解

    加速spring/springboot應(yīng)用啟動(dòng)速度詳解

    這篇文章主要介紹了加速spring/springboot應(yīng)用啟動(dòng)速度詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 客戶端設(shè)置超時(shí)時(shí)間真的很重要

    客戶端設(shè)置超時(shí)時(shí)間真的很重要

    今天小編就為大家分享一篇關(guān)于客戶端設(shè)置超時(shí)時(shí)間真的很重要,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Java使用遞歸法解決漢諾塔問(wèn)題的代碼示例

    Java使用遞歸法解決漢諾塔問(wèn)題的代碼示例

    這篇文章主要介紹了Java使用遞歸法解決漢諾塔問(wèn)題的代碼示例,漢諾塔問(wèn)題是使用遞歸解決問(wèn)題的經(jīng)典范例,用到的算法非常簡(jiǎn)單,需要的朋友可以參考下
    2016-04-04
  • Java設(shè)計(jì)模式之抽象工廠模式AbstractFactoryPattern詳解

    Java設(shè)計(jì)模式之抽象工廠模式AbstractFactoryPattern詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之抽象工廠模式AbstractFactoryPattern詳解,抽象工廠模式是一種軟件開(kāi)發(fā)設(shè)計(jì)模式,抽象工廠模式提供了一種方式,可以將一組具有同一主題的單獨(dú)的工廠封裝起來(lái),需要的朋友可以參考下
    2023-10-10
  • Java JTable 實(shí)現(xiàn)日歷的示例

    Java JTable 實(shí)現(xiàn)日歷的示例

    這篇文章主要介紹了Java JTable 實(shí)現(xiàn)日歷的示例,幫助大家更好的理解和學(xué)習(xí)Java jtable的使用方法,感興趣的朋友可以了解下
    2020-10-10
  • 全面了解Java反射機(jī)制

    全面了解Java反射機(jī)制

    Java的反射機(jī)制在實(shí)踐中可謂無(wú)處不在,如果你已經(jīng)工作幾年,還對(duì)Java的反射機(jī)制一知半解,那么這篇文章絕對(duì)值得你讀一讀。
    2020-03-03
  • Java使用正則表達(dá)式檢索、替換String中特定字符和正則表達(dá)式的一切

    Java使用正則表達(dá)式檢索、替換String中特定字符和正則表達(dá)式的一切

    這篇文章主要給大家介紹了關(guān)于Java使用正則表達(dá)式檢索、替換String中特定字符和正則表達(dá)式的一切,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評(píng)論