处理自动装配的歧义性

来源:互联网 发布:深圳阿里云大厦图片 编辑:程序博客网 时间:2024/09/15 11:17

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)@Qualifierpublic @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:在运行时有效(即运行时保留)