<>场景:使用 @Autowired 的时候,到底是写接口还是实现类?
<>答案:写的接口
<>当实现类唯一时,表面上注入接口,其实注入实现类
<>当实现类多个时,通过@Service(“menuService1”)指定实现类
<>解析:
这个其实是创建了实现类的对象但引用了接口类型,
即 “InjectionDao injectionDao = new InjectionDaoImpl ()”, 是 Java 多态性(向上转型)的一种应用。
在实现类处加 @Repository 注解,意思就是 new InjectionDaoImpl (),
而在 InjectionServiceImpl 中定义属性 InjectionDAO injectionDAO 就是将 new 出来的这个
InjectionDaoImpl 对象向上转型为 InjectionDao 类型。
<>注意:
若一个接口被多个实现类,实现的时候,@Autowired,Spring 会按 byType
的方式寻找接口的实现类,将其注入。存在多个实现类,应该指定名字,可以通过 byName 注入的方式。可以使用 @Resource 或 @Qualifier
注解。
//实现类1 @Service("menuService1") public class MenuServiceImpl implements
IMenuService //实现类2 @Service("menuService2") public class MenuServiceImpl
implements IMenuService //注入接口,相当于new一个实现类,指定名称menuService1实现类 @Autowired @
Qualifier("menuService1") private IMenuService menuService;
//注入接口,相当于new一个实现类,指定名称menuService2实现类 @Autowired @Qualifier("menuService2")
private IMenuService menuService;