一个接口有多个实现类的时候在controller中定义Service的时候要用以下两种写法,否则会因为无法根据接口类型获取指定的实现类(每个bean在spring容器默认的唯一bean名称:【首字母小写 + 驼峰 】)
写法一
@Qualifier("userServiceImpl")
@Autowired
private UserService userService;
写法二
@Resource(name = "userServiceImpl")
private UserService userService;
一个接口有多个实现类时要在接口中增加新功能:
背景:
时间比较长,版本比较低就有的老接口,jdk或者某些框架 使用非常广泛
A是接口 A1、A2、A3、A4、A5 。。。都是A接口的实现类
目的:
增强A接口中某些实现类(一部分)的功能
方法一=>抽象类方式 abstract
新建一个公共的抽象类实现UserService接口,在这个抽象的实现类AbstractUserServiceImpl中写要添加的功能,然后再让需要添加功能的ServiceImpl类继承这个抽象类,这样就完成了功能的添加而不需要改变之前的代码
@Service
public abstract class AbstractUserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
/**
* 批量删除的功能 => 只有UserServiceImpl、xxx、xxx、xxx 这个业务需要
* @param idList
*/
public void deleteByIds(List<Long> idList){
// 具体的mapper方法
}
// 每个继承改抽偶类的 实现类 自己实现不同的逻辑
public abstract void test();
}
public class UserServiceImpl extends AbstractUserServiceImpl implements UserService{
}
继承了抽象类的Impl
方法二=>default关键字
接口中的方法定义时加一个default关键字 这样这个方法就可以不被实现类实现,这个方法可以在接口中直接实现,也可以在实现类中重写
public interface UserService {
List<User> listAll(int pageNo,int pageSize,User user);
加一个default 修饰符
public default void deleteByIds(List<Long> idList){
}
}