@Autowired,@Resource,@Qualifier,@Primary注解的使用与区别

@Resource 和@Autowired 这两个注解的作用都是在Spring 生态里面去实现Bean 的依赖注入。

@Autowired

  • @Autowired 注解里面有一个 required 属性默认值是 true,表示强制要求bean实例的注入, 在应用启动的时候,如果 IOC 容器里面不存在对应类型的Bean,就会报错。当然,如果不希望自动注入,可以把这个属性设置成 false。
  • 如果在容器中有多个相同类型的Bean,使用@Autowired注入Bean,则去找名称和注入属性的属性名相同的Bean,如果能找到唯一的,则注入成功,否则应用启动的时候就会报错,大概意思是指注入只需要一个Bean实例,但在容器中找到了多个(容器不知道该注入那个Bean)。为了解决问题,需要配合@Qualifier注解使用。@Qualifier注解可以从多个相同类型的Bean里筛选出一个Bean名称和@Qualifier注解的value属性相同的Bean。如果容器中恰好找到一个这样的Bean,则应用启动的时候成功注入这个Bean实例。同样的,当有多个同类型的Bean时,@Parimary标注的Bean作为主要的Bean会被优先注入。

 只使用@Autowired注解,InjectTestController注入InjectTestService 

/* InjectTestController注入InjectTestService,此时容器中
有两个InjectTestService类型的Bean(injectTestService,injectTestServiceImpl)。
因为注入属性的属性名为injectTestService,
容器中恰好存在一个名称为injectTestService的Bean,
所以名称为injectTestService的Bean可以成功注入到属性injectTestService,
应用启动不报错。*/

@Controller
public class InjectTestController {
    @Autowired
    private InjectTestService injectTestService;
}

@Configuration
public class BeanConfig {
   @Bean
   public InjectTestService injectTestService(){
       return new InjectTestServiceImpl();
   }
}

@Service
public class InjectTestServiceImpl implements InjectTestService {
}

@Autowired注解和@Qualifier注解配合使用,InjectTestController注入InjectTestService 

/* 容器中存在两个类型为InjectTestService的Bean(injectTestService,injectTestServiceImpl),
但经过@Qualifier的value属性筛选,找到了名称为injectTestServiceImpl的Bean,
因此可以成功注入到属性service中 */


@Controller
public class InjectTestController {
    @Autowired
    @Qualifier("injectTestServiceImpl")
    private InjectTestService service;
}

@Configuration
public class BeanConfig {
   @Bean
   public InjectTestService injectTestService(){
       return new InjectTestServiceImpl();
   }
}

@Service
public class InjectTestServiceImpl implements InjectTestService {
}

 @Autowired注解和@Primary注解配合使用,InjectTestController注入InjectTestService 

/* 容器中存在两个类型为InjectTestService的Bean(injectTestService,injectTestServiceImpl),
但@Primary注解指定名称为injectTestService的Bean为主Bean,在多个同类型的Bean的时候会优先注入
因此可以成功注入到属性service中 */


@Controller
public class InjectTestController {
    @Autowired
    private InjectTestService service;
}

@Configuration
public class BeanConfig {
   @Bean
   @Primary
   public InjectTestService injectTestService(){
       return new InjectTestServiceImpl();
   }
}

@Service
public class InjectTestServiceImpl implements InjectTestService {
}

@Resource

  • @Resource 是 JDK 提供的注解,只是 Spring 在实现上提供了这个注解的功能支持。 它的使用方式和@Autowired 完全相同,最大的差异于@Resource 可以支持ByName 和 ByType 两种注入方式。 如果使用name,Spring就根据bean的名字实现依赖注入,如果使用type,Spring就根据类型实现依赖注入。 如果两个属性都没配置,就先根据定义的属性名字去匹配,如果没匹配成功,再根据类型匹配。两个都没匹配到,就报错。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值