Spring实战(第四版)读书笔记08——处理自动装配的歧义性

1、标示首选的bean

组件扫描方式例子:

@Component
@Primary
public class IceCream implements Dessert {...}

Java配置例子:

@Bean
@Primary
public Dessert iceCream(){
    return new IceCream();
}

XML配置例子:

<bean id="iceCream" class="com.dessertteater.IceCream" primary="true" />

2、限定自动装配的bean

2.1、创建自定义限定符

例子:

@Autowired
@Qualifier("iceCream")
public void setDessert(Dessert dessert){
    this.dessert = dessert;
}

默认情况下,组件扫描创建的bean的id为类名第一个字母变为小写,在不自定义限定符的情况下,限定符默认与id相同,因此在默认情况下限定符与类名是紧耦合的,这样并不利于重构。

创建自定义限定符例子:

@Component
@Qualifier("cold")
public class IceCream implements Dessert {...}
@Bean
@Qualifier("cold")
public Dessert iceCream(){
    return new IceCream();
}

注意:Java8允许一个条目上出现重复的注解,但是这个注解本身在定义的时候要带有@Repeatable注解,不过,Spring的@Qualifier注解并没有在定义时添加这个注解。

2.2、创建自定义限定符注解

例子:

@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Cold{}
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Creamy{}
@Component
@Cold
@Creamy
public class IceCream implements Dessert {...}
@Component
@Cold
@Fruity
public class Popsicle implements Dessert {...}
@Autowired
@Cold
@Creamy
public void setDessert(Dessert dessert){
    this.dessert = dessert;
}

结合之前重构后的@Profile的定义,我们可以通过已有注解以及组合创建功能更加强大和灵活的自定义注解。

猜你喜欢

转载自blog.csdn.net/Nemoosi/article/details/107083894
今日推荐