Spring中的注解总结
1、@Qualifier注解
@Qualifier注解是在按照bean的类型注入的基础上再按照bean的名称进行注入的,即区分两个相同类型,名称却不一样的bean,是在解决需要注入哪个bean的问题时使用。
@Qualifier的工作原理是:@Qualifier注解与我们想要使用的特定bean的名称一起进行装配,Spring框架就能从多个相同类型并满足装配要求的bean中找到我们所想要的这个特殊的bean。我们只需要做的是@Component或者@Bean注解中声明的value的属性值进行确定名称即可。
举个栗子1:下面有两个Test类,我们再Temp类中使用他的时候,Spring是不知道需要装配哪个Test的,如果不去指定可能会报org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.Test] is defined: expected single matching bean but found2: [test1, test2]这样的错误,所以使用@Qualifier注解指定我们使用的是test1之后就不会再报错了,因为已经一一对应上了,Spring也能明确知道需要装配哪个bean了。
<beanid="tes1"class="com.Test">
<property name="test"value="aaa"/></bean>
<beanid="tes2"class="com.Test">
<property name="test"value="bbb"/></bean>
public class Temp{
@Autowired
@Qualifier("test1")
private Test test;
}
举个栗子2:定义一个service接口,两个service都实现了这个接口,那么在Controller中使用这个接口的时候怎么区分我使用的到底是哪个实现类呢?使用@Qualifier进行指定所需要的实现类就可以区分了,如果不指定会报错。
public interface TestSerivce {
}
@Service("TestSevice1")
public class TestSevice1 implements TestSerivce{
}
@Service("TestSevice2")
public class TestSevice2 implements TestSerivce{
}
public class TestController {
@Autowired
@Qualifier("TestSevice1")
private TestSerivce serivce;
}
2、@Primary
@Primary注解是相当于我们定义默认值是哪个,可以用来处理在发生依赖注入歧义的时候,决定要注入哪个 bean。当存在多个相同类型的bean时,拥有@Primary注解定义的bean为首选项,除非另有说明,否则会使用与 @Primary 注释关联的 bean 。如果 @Qualifier 和 @Primary 注释都存在的时候,那么 @Qualifier 注释的bean的优先级会更高。不止bean中可以使用@Primary 注释在Component中也可以使用@Primary 注释,如下图所示:
@Bean
@Primary
public Test test1() {
return new Temp1();
}
@Bean
public Test test2() {
return new Temp2();
}
@Component
@Primary
public class Test1 implements Test{
public String test1() {
return "test1";
}
}
@Component
public class Test2 implements Test{
public String test2() {
return "test2";
}
}
3、@Autowired
@Autowired是Spring的注解,默认按类型进行装配,我们常常在项目中使用他来完成自动装配的任务,默认情况下必须要求依赖对象必须存在,不存在则会报错,可以通过required=false属性设置非必须 ,如果我们想使用名称装配可以结合@Qualifier注解进行使用。
4、@Resource
@Resource是JavaEE的注解,默认按照名称进行装配,可以通过name属性指定名称,如果没有指定name属性,当注解写在字段上时,默认取字段名进行查找注入,如果写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
- 点赞
- 收藏
- 关注作者
评论(0)