Autowired、Resource、Qualifier的使用及区别

今天在项目中使用线程池执行任务时,发现配置的线程池参数怎么都没有生效(固定了线程池的线程数为1,但实际执行任务时却有10多个线程在跑),一番排查过后发现原来是我配置的线程池名称跟Spring容器中已存在的线程池重名了,通过Async注解进行注入时,spring默认选了原先容器中存在的线程池,所以没有生效。于是联想到Autowired注解好像也会出现类似的注入问题,所以写下这篇文章记录一下。

@Autowired

  • spring的注解,默认是按照Type进行自动装配,当且仅有一个匹配的Bean时,才能正常注入。如果一个接口被多个实现类实现,或者Spring容器中存在两个相同类型的Bean、使用Autowired注入该属性会报BeanCreationException

@Qualifier

  • spring的注解,按name注入,一般当出现两个及以上bean时,不知道要注入哪个,作为@Autowired()的修饰用

@Resource

  • @Resource(J2EE注解),默认按name注入,可以通过name和type属性进行选择性注入。默认按照注入类名的小写作为name去注入Bean,如果发现并没有这个名字的实例,然后会根据类型自动匹配

来看例子

Controller

/**
 * @author JayChan
 * @Description
 * @create 2023-01-17 09:10
 */
@RestController
public class TestAutowireController {
    @Autowired
    private TestUser testUser;
    @Autowired
    private IUserService userService;

    @RequestMapping("/bean")
    public String bean() {
        return testUser.getUsername();
    }

    @RequestMapping("/service")
    public String service() {
        return userService.getUser().getUsername();
    }
}

BeanFactory

/**
 * @author JayChan
 * @Description bean的方式注入两个相同的bean
 * @create 2023-01-17 09:07
 */

@Component
public class BeanFactory {

    @Bean("userA")
    public TestUser get(){
        TestUser testUser = new TestUser();
        testUser.setUsername("userA");
        testUser.setId(1L);
        return testUser;
    }

    @Bean("userB")
    public TestUser get2(){
        TestUser testUser = new TestUser();
        testUser.setUsername("userB");
        testUser.setId(1L);
        return testUser;
    }
}

IUserService


public interface IUserService {

    public TestUser getUser();
}

两个实现类

@Service
public class UserServiceImpl implements IUserService{
    @Override
    public TestUser getUser() {
        TestUser testUser = new TestUser();
        testUser.setUsername("i come from UserServiceImpl");
        return testUser;
    }
}


@Service
public class UserServiceImpl2 implements IUserService{
    @Override
    public TestUser getUser() {
        TestUser testUser = new TestUser();
        testUser.setUsername("i come from UserServiceImpl2");
        return testUser;
    }
}

iDea的提示非常智能,在编译前就已经帮检测出注入的bean对象可能有多个实例,不能自动装配

这时候就可以通过@Qualifier注解来指定注入某个名称的Bean

或者直接使用@Resource

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值