@Primary ,@Qualifier ,@Autowired ,@Resource作用与区别

首先阐述 @Autowired 和 @Resource 的区别

@Resource 是JDK自带的注解 可以按名称注入也可以按类型注入,默认是按名称注入,没有显式指定名称时,在spring容器中匹配与需要注入的bean属性名相同的bean,如果还不同,@Resource会找到一个主类型匹配而不是一个特定的命名bean
@Autowired 由spring 提供 ,默认按类型注入,也可结合@Qualifier() 实现按名称注入

需要注意的是 以@Bean方式注入对象时,@Resource 按名称注入,是按声明的方法名注入的
@Autowired 结合 @Qualifier() 实现按名称注入时,是按@Qualifier() 定义的名称注入的

@Primary 当需要注入多个同类型的bean时,选择其中一个为优先注入对象,并且同类型对象只能选择一个,超过一个时则启动报错,提示信息就是你选择了多个bean为优先注入对象

@Qualifier() 你可以为每个注入的bean起个不同的名字,结合@Autowired 实现按名称注入

示例:
@Autowired 结合 @Qualifier() 实现按名称注入
首先定义一个需要注入的对象

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class UserInfo {
    private String username;
    private String password;
}

然后定义一个config类,注入两个UserInfo,利用 @Qualifier() 声明两个不同的bean

import com.example.demo.entities.UserInfo;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class UserInfoConfig {

    @Bean
    @Qualifier("zhangsan")
    public UserInfo userInfo() {
        UserInfo userInfo = UserInfo.builder().username("zhangsan").password("123456").build();
        return userInfo;
    }

    @Bean
    @Qualifier("lisi")
    public UserInfo userInfo1() {
        UserInfo userInfo = UserInfo.builder().username("lisi").password("123456").build();
        return userInfo;
    }

}

controller 层注入 zhangsan这个对象

@RequestMapping("/user")
@RestController
public class UserController {

    @Autowired
    @Qualifier("zhangsan")
    private UserInfo userInfo;

    @GetMapping("/getUserInfo")
    public UserInfo getUserInfo() {
        return userInfo;
    }
}

返回结果为

{
    "username": "zhangsan",
    "password": "123456"
}

我们再注入lisi这个对象

@RequestMapping("/user")
@RestController
public class UserController {

    @Autowired
    @Qualifier("lisi")
    private UserInfo userInfo;

    @GetMapping("/getUserInfo")
    public UserInfo getUserInfo() {
        return userInfo;
    }
}

返回结果

{
    "username": "lisi",
    "password": "123456"
}

接下来,我们测一下@Primary 看是否实现优先注入,修改config类

@Configuration
public class UserInfoConfig {

    @Bean
    @Primary
    public UserInfo userInfo() {
        UserInfo userInfo = UserInfo.builder().username("zhangsan").password("123456").build();
        return userInfo;
    }

    @Bean
    public UserInfo userInfo1() {
        UserInfo userInfo = UserInfo.builder().username("lisi").password("123456").build();
        return userInfo;
    }
}

controller 层 直接用 @Autowired 注入

@RequestMapping("/user")
@RestController
public class UserController {

    @Autowired
    private UserInfo userInfo;

    @GetMapping("/getUserInfo")
    public UserInfo getUserInfo() {
        return userInfo;
    }
}

返回结果,没毛病

{
    "username": "zhangsan",
    "password": "123456"
}

我们再验证 lisi这个对象

@Configuration
public class UserInfoConfig {

    @Bean
    public UserInfo userInfo() {
        UserInfo userInfo = UserInfo.builder().username("zhangsan").password("123456").build();
        return userInfo;
    }

    @Bean
    @Primary
    public UserInfo userInfo1() {
        UserInfo userInfo = UserInfo.builder().username("lisi").password("123456").build();
        return userInfo;
    }
}

返回结果,没得毛病

{
    "username": "lisi",
    "password": "123456"
}

接下来我们再测,@Resource 的按名称注入,看是否是按定义的方法名注入的

config类

@Configuration
public class UserInfoConfig {

    @Bean
    public UserInfo userInfo() {
        UserInfo userInfo = UserInfo.builder().username("zhangsan").password("123456").build();
        return userInfo;
    }

    @Bean
    public UserInfo userInfo1() {
        UserInfo userInfo = UserInfo.builder().username("lisi").password("123456").build();
        return userInfo;
    }
}

controller 层

@RequestMapping("/user")
@RestController
public class UserController {

    @Resource(name = "userInfo")
    private UserInfo userInfo;

    @GetMapping("/getUserInfo")
    public UserInfo getUserInfo() {
        return userInfo;
    }
}

返回结果

{
    "username": "zhangsan",
    "password": "123456"
}

修改@Resource(name = “userInfo1”) 注入第二个方法名
返回结果,没毛病哈

{
    "username": "lisi",
    "password": "123456"
}
posted @   好事的猫  阅读(148)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
点击右上角即可分享
微信分享提示