Spring中的注解总结

举报
多米诺的古牌 发表于 2022/03/21 23:51:32 2022/03/21
【摘要】 1、@Qualifier注解       @Qualifier注解是在按照bean的类型注入的基础上再按照bean的名称进行注入的,即区分两个相同类型,名称却不一样的bean,是在解决需要注入哪个bean的问题时使用。       @Qualifier的工作原理是:@Qualifier注解与我们想要使用的特定bean的名称一起进行装配,Spring框架就能从多个相同类型并满足装配要求的bea...

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属性一旦指定,就只会按照名称进行装配。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。