AutoWired引入的歧义性

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