前言
当一个接口有多个实现的时候
哪个注解可以指明是哪个实现类
可以通过使用@Qualifier
1. 源码
查看源码可以更加透彻的了解
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Qualifier {
String value() default "";
}
如果默认不写的话直接是空value
而且只有一个value,value可以省略
直接填写值即可
在只有一个实现类的时候可以省略该注解
有多个实现类的时候要填写实现类才可以区分是哪个实现类
@Autowire
自动注入的时候
加上@Qualifier(“实现类”)
可以指定注入哪个实现类
本身@Autowired
结合@Qualifier
相当于增加了byName寻找bean的name属性( byType冲突或找不到的话通过byName属性)
再次查看其官方解释
This annotation may be used on a field or parameter as a qualifier for
candidate beans when autowiring. It may also be used to annotate other
custom annotations that can then in turn be used as qualifiers
翻译过来就是
该注释可用于字段或参数作为的限定符
自动装配时的候选bean。 它也可以用于注释其他
自定义注释,然后可以作为限定符使用
2. 代码实战
接口类
//BookService:底下需要去实现,调用dao层
public interface BookService {}
代码实现类
@Service
public class BookServiceImpfirst implements BookService{}
@Service
public class BookServiceImpsecond implements BookService{}
具体在控制层面上配合注解实现
@Controller
@RequestMapping("/book")
public class BookController {
//controller层调service层
@Autowired
@Qualifier("BookServiceImpfirst")
private BookService bookService;
}