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

    技术2022-07-15  82

    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的定义,我们可以通过已有注解以及组合创建功能更加强大和灵活的自定义注解。

    Processed: 0.011, SQL: 9