美文网首页Java 杂谈
Spring 实战 三: 自动装配的歧义性

Spring 实战 三: 自动装配的歧义性

作者: DJN_ | 来源:发表于2018-07-14 09:16 被阅读1次

    自动装配仅在只有一个 bean 匹配时有效,如果不只有一个 bean 的话,就会阻碍 spring 自 动装配属性、构造器参数或方法参数。

    解决:

    1. 将可选 bean 中的每一个设为首选( primary )
    2. 使用限定符来帮助 spring 缩小范围( qualifier )

    标识首选的 bean

    @Primary 可与 @Component 和 @Bean 注解配合使用。xml 中对于 bean 标签有对应的 boolean 属性 primary。


    image.png
    image.png
    image.png

    当有两个可选的 Dessert 时,spring 无法从多个首选 bean 中做出选择,因此 @Primary 只在唯一时有效。

    明确限定 bean

    @Qualifier 注解是使用限定符的主要方式,可以与 @Autoware 和 @Inject 注解配合使用。


    image.png

    缺点:@Qualifier 指定的 bean id 与类名(方法名)紧耦合,类名修改时 @Qualifer 注解将失效。

    通过在 Bean 定义处和使用处同时使用 @Qualifier 注解,可以实现基于 String 描述的对多个限定特性进行限定(java 8 才支持重复注解,java 8 允许在一个条目上重复使用一个注解,只要这个注解本身有 @Repeatable 注解。但 @Qualifier 不支持重复注解),因此只能明确限定一个特性。


    image.png
    image.png

    可以通过创建自定义的注解来实现限定符的功能,这些注解需要被 @Qualifier 注解注解,那么这个注解本身可以作为一个限定特性。


    image.png
    image.png
    image.png
    image.png
    image.png

    原始的 @Qualifier 注解使用 String 进行限定,而基于 @Qualifier 注解的注解使用注解进行限定,类型更为安全,同时能够解耦。

    相关文章

      网友评论

        本文标题:Spring 实战 三: 自动装配的歧义性

        本文链接:https://www.haomeiwen.com/subject/ejmepftx.html