处理自动装配的歧义性

spring的自动装备Autowired默认是根据类型查找的,如果有俩个同类型的bean,则会出现异常。此时有俩种方法解决:
1:设置首选bean,在声明bean的同时声明为首选bean,

@Component
@Primary
public SuperMan implements Person{
}
@Component
public LazyMan implements Person{
}

这样在自动装配的时候会首先选择SuperMan。
2.创建自定义的限定符:

@Configuration
@ComponentScan(“com.kai.vo”)
@PropertySource(“app.properties”)
public class Configuration1 {
@Bean
@Qualifier(“super”)
public Person superman(){
return new SuperMan();
}
@Bean
@Qualifier(“lazy”)
public Person lazyman(){
return new LazyMan();
}

        @Component
        public class Company {

            public Person person;
            @Autowired
            @Qualifier("super")
            public void set(Person person){
                this.person=person;
            }
            public void print(){
                System.out.println("company "+person.getName());
            }
        }
  </code>

3. 或者自定义一个新的注解:

@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Super {

@Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Lazy {
}

    @Configuration
@ComponentScan("com.kai.vo")
@PropertySource("app.properties")
public class Configuration1 {
  @Bean
  @Super
  public Person superman(){
      return new SuperMan();
  }
  @Bean
  @Lazy
  public Person lazyman(){
      return new LazyMan();
  }

}

@Target取值有:
1.CONSTRUCTOR:用于描述构造器
    2.FIELD:用于描述域
    3.LOCAL_VARIABLE:用于描述局部变量
    4.METHOD:用于描述方法
    5.PACKAGE:用于描述包
    6.PARAMETER:用于描述参数
@Retention表示注解被保留时间长短:
1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在运行时有效(即运行时保留)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值