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