Spring基础处理-自动装配的歧义性

1.出现歧义性的原因

当自动装配的多个bean,同时继承同一个接口的时候,使用@Autowired注解对接口进行bean的注入,会出现歧义性.如:

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

@Component 
public class Cake implement Dessert{...}

@Component
public class Cookies implement Dessert{...}

@Component 
public class IceCream implement Dessert {...}

这三个类都实现了Dessert接口,所以在进行注入的时候,不知道会注入哪一个

2.解决方法

2.1 标记首选的bean
在有@Component 注解的类上加上@Primary注解,表明他是一个首选的类,不能通同时标记两个首选类,如:

//使用组件扫描
@Component
@Primary
public class IceCream implements Dessert{...}

//使用java配置类的显式配置
@Bean
@Primary
public Dessert iceCream() {
return new IceCream;
}
//使用xml的显式配置
<bean id="iceCream" class="包名.IceCream" primary="true"/>

这种方式无法将可选的方案的范围限定到唯一一个无歧义性的选项中,他只能标记一个优先的方案,没有办法进一步缩小范围.
2.限定自动装配的bean
使用@Qualifier 注解,可以和@Autowired和@Inject注解一起使用,如:

@Autowired
@Qualifier("iceCream")//里面的参数就是想要注入的bean的ID,@Component注解的类,都会被创建为bean,默认的id就是类名的首字母小写,这就表示要把iD为iceCream的类注入进去.如果没有iceCream作为限定符,那默认的就是这个bean的ID
public Dessert dessert;

这种方法有一些问题,比如,如果重构了IceCream方法,那么iceCream这个ID就不能找到任何方法,自动装配就会失败.所以要创建自定义的限定符来解除这种紧耦合.
在类的定义上也是用@Qualifier注解:

@Component
@Qualifier("cold")//给类起一个ID ,这个ID不能乱起,应该表达这个类的一些特性
public class IceCream implements Dessert{...}

然后使用上面的@Autowired和@Qualifier(“cold”)就可以啦
PS:如果有相同的cold作为限定符,还是有歧义,可以想到的方法是使用多个@Qualifier 来给类进行限定多个ID,但是,上面的方法可能会报错,Java不允许在统一条目上重复出现多个相同类型的注解,如下是可能报错的:

@Component
@Qualifier("cold")
@Qualifier("creamy")
public class IceCream implements Dessert{...}


@Autowired
@Qualifier("cold")
@Qualifier("creamy")
public Dessert dessert;

所以根据这种需求可以创建多个自定义的注解来实现这个功能,比如创建@Cold注解来代替@Qualifier(“cold”)

@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{...}

@Autowired 
@Cold
@Creamy
public Dessert Dessert;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行和易用,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
回答: 自动装配Spring框架中有一些局限。其中一些局限包括: 1. 自动装配可能会导致歧义。当存在多个候选bean时,Spring无法确定应该使用哪个bean进行装配,从而导致装配失败。这种情况下,需要通过限定符或者使用@Primary注解来解决歧义。 2. 自动装配可能会导致不可预测的行为。当存在多个匹配的bean时,Spring会选择其中一个进行装配,但是无法保证选择的是我们期望的bean。这可能会导致应用程序的行为不一致。 3. 自动装配可能会导致循环依赖。当存在循环依赖关系时,自动装配可能无法解决依赖关系,从而导致应用程序无法启动或者出现其他问题。在这种情况下,需要使用构造函数注入或者使用@Lazy注解来解决循环依赖问题。 4. 自动装配可能会导致能问题。自动装配需要在运行时进行类型匹配和依赖解析,这可能会导致一定的能损失。在能敏感的场景下,可以考虑使用显式的依赖注入来避免自动装配能开销。 总结起来,自动装配虽然方便,但是在一些特定情况下可能会遇到局限,需要注意和处理。\[1\] #### 引用[.reference_title] - *1* *2* *3* [Spring最新2021年面试题及答案,汇总版-8](https://blog.csdn.net/qfchenjunbo/article/details/121373162)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值