AutoWired引入的歧义性

多个类型实现了同一个接口,调用方根据类型自动注入:
    
    
Spring此时别无他法, 只好宣告失败并抛出异常 ,异常类型为NoUniqueBeanDefinitionException 。
此时根据通过使用@Primary 设置注入Bean的首选项来选择注入:
    
    
但是如果有多个Bean同时设置了首选项,会引入新的歧义。
    
解决这个问题,可以使用限定符:
    
使用限定符可以较好的解决自动注入和设置首选项不能解决的问题,但是这样会有一个新的问题,限定符和自动注入的类名紧耦合在了一起。如果重构IceCream为其他的名称,则会引入调用方通过限定符类自动注入的失效。
可以通过自定义限定符来解决这个问题:
    
同样的问题,如果有多个类上具有相同的限定名,同样会导致注入失败,解决的方法为在声明的类上和调用方的类上,组合使用多个限定符来达到筛选唯一Bean的目的,但是。。。。Java不允许同个类上有多个同类型的声明,所以,需要另外创建自定义类型,来代替组合中其他同类型的声明,通过这样的方式,在自定义的声明中使用组合中的同类型的限定符,为组合中其他的所有同类型声明创建一一对应的自定义声明,从而来完成组合筛选Bean的目的。
    

Spring框架中,`@Autowired`注解用于自动装配bean。它可以标注在类的成员变量、构造方法、普通方法和参数上。当使用`@Autowired`注解引入方法时,可以通过以下几种方式: 1. 通过成员变量注入:将`@Autowired`注解放在类的成员变量上,Spring会自动将匹配的bean注入到该成员变量中。 ```java @Component public class MyClass { @Autowired private MyService myService; } ``` 2. 通过构造方法注入:将`@Autowired`注解放在类的构造方法上,Spring会自动将匹配的bean作为构造参数传入。 ```java @Component public class MyClass { private final MyService myService; @Autowired public MyClass(MyService myService) { this.myService = myService; } } ``` 3. 通过普通方法注入:将`@Autowired`注解放在普通方法上,Spring会自动调用该方法,并将匹配的bean作为返回值。 ```java @Component public class MyClass { @Autowired public void setMyService(MyService myService) { // 使用myService进行操作 } } ``` 4. 通过参数注入:将`@Autowired`注解放在方法参数上,Spring会自动将匹配的bean作为参数传入。 ```java @Component public class MyClass { public void doSomething(@Autowired MyService myService) { // 使用myService进行操作 } } ``` 需要注意的是,如果一个类中有多个符合条件的bean,可以使用`@Qualifier`注解来指定具体要注入的bean。同时,如果需要按名称装配,可以使用`@Resource`注解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值