创建同一个类的多个bean对象,使用 @Qualifier(value = "createUserDao2")解决

通过@Bean注解将Bean注入spring容器

package com.edu.spring.config;/**
 * @author n00444323
 * @date 2019/1/15 12:12
 */

import com.edu.spring.config.bean.AnimalBean;
import com.edu.spring.config.bean.CatBean;
import com.edu.spring.config.bean.DogBean;
import com.edu.spring.config.factorybean.RunnableFactoryBean;
import com.edu.spring.mvcbean.UserController;
import com.edu.spring.mvcbean.UserDao;
import com.edu.spring.mvcbean.UserService;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * @param
 * @return
 * @throws
 */

@Configuration
public class MyConfig
{

    @Bean
    public UserDao createUserDao ()
    {
        return new UserDao();
    }

    @Bean
    public UserDao createUserDao2 ()
    {
        return new UserDao();
    }



}

 

package com.edu.spring.mvcbean;/**
 * @author n00444323
 * @date 2019/1/15 15:58
 */

import com.sun.org.apache.bcel.internal.generic.JSR;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.lang.annotation.Inherited;

import javax.annotation.Resource;
import javax.inject.Inject;

import jdk.nashorn.internal.objects.annotations.Getter;
import jdk.nashorn.internal.objects.annotations.Setter;

/**
 * @param
 * @return
 * @throws
 */
@Service
public class UserService
{

    @Autowired
    @Qualifier(value = "createUserDao2")  //使用Qualifier指定bean对象
    private  UserDao userDao;


    @Resource  //JSR 250 提供的注入能力
    @Qualifier(value = "createUserDao2")
    private  UserDao userDao1;


    @Inject
    @Qualifier(value = "createUserDao2")
    private  UserDao userDao2;

    private  void show(){
        System.out.println("UserService...userDao");
    }

    @Override
    public String toString()
    {
        return "UserService{" +
                "userDao=" + userDao +
                ", userDao1=" + userDao1 +
                ", userDao2=" + userDao2 +
                '}';
    }
}

 

 

### @Qualifier 注解在 Spring Boot 中的应用 在 Spring Boot 中,当存在多个相同型的 Bean 时,@Autowired 默认按照型注入会导致冲突。为了准确地指定要注入的 Bean,可以使用 @Qualifier 注解结合 @Autowired 来实现精确匹配。 #### 基本用法 @Qualifier 允许通过 Bean 的名称来区分同型的多个 Bean。例如,在接口 `Pay` 的两个实现 `AlipayImpl` 和 `WeChatImpl` 存在的情况下,可以通过如下方式明确指定注入哪一个实现: ```java @Controller @RequestMapping("/test") public class TestQualifier { @Autowired @Qualifier("alipayImpl") // 指定注入 AlipayImpl 实例 private Pay pay; } ``` 上述代码中,`@Qualifier("alipayImpl")` 表示将容器中名为 `alipayImpl` 的 `Pay` Bean 注入到 `pay` 字段中 [^3]。 #### 示例说明 考虑一个更具体的例子,假设定义了一个 `Singer` 接口以及其实现 `PopSinger` 和 `JazzSinger`: ```java public interface Singer { String sing(String lyrics); } @Component("popSinger") public class PopSinger implements Singer { @Override public String sing(String lyrics) { return "Pop: " + lyrics; } } @Component("jazzSinger") public class JazzSinger implements Singer { @Override public String sing(String lyrics) { return "Jazz: " + lyrics; } } ``` 在某个服务中需要注入特定型的 `Singer`,可以通过 @Qualifier 明确指定名称: ```java @Service public class MusicService { @Autowired @Qualifier("popSinger") // 注入 PopSinger 实例 private Singer singer; public String perform() { return singer.sing("I love pop music."); } } ``` 以上代码确保了即使存在多个 `Singer` 型的 Bean,也能正确选择 `PopSinger` 进行注入 [^2]。 #### 结合 @Primary 使用 除了使用 @Qualifier 外,还可以利用 @Primary 标注某个 Bean 为首选 Bean。当没有明确使用 @Qualifier 指定时,Spring 会优先选择带有 @Primary 的 Bean。 对于前面提到的 `Pay` 接口及其两个实现 `AlipayImpl` 和 `WeChatImpl`,如果希望默认情况下总是使用 `AlipayImpl`,可以在该上添加 @Primary: ```java @Component @Primary public class AlipayImpl implements Pay { // ... } ``` 这样,在未指定 @Qualifier 的情况下,所有对 `Pay` 型的注入都将默认使用 `AlipayImpl` [^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值