IoC基础
原先方式
Dao部分
UserDao接口
public interface UserDao {
public void getUser();
}
Dao实现类
public class UserDaoImpl implements UserDao {
@Override
public void getUser() {
System.out.println("获取用户数据");
}
}
Service部分
UserService接口
public interface UserService {
public void getUser();
}
UserService实现类
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
测试
@Test
public void test(){
UserService service = new UserServiceImpl();
service.getUser();
}
增加UserDao的实现类
Dao部分
UserDao另一个实现类
public class UserDaoMySqlImpl implements UserDao {
@Override
public void getUser() {
System.out.println("MySql获取用户数据");
}
}
UserService实现类
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoMySqlImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
如此,需求更改时,需要不断的在service
实现类上修改代码
造成维护和使用不便利的后果。
解决
方法
-
在会用到的地方,不实现,只留一个接口就行。
-
在service层利用set方法实现对UserDao实现类的赋值。
public class UserServiceImpl implements UserService {
private UserDao userDao;
// 利用set实现
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
效果
此时,我们再使用Dao的实现类时,就可以在申请上层类(controller)时,灵活的创建对象。
@Test
public void test(){
UserServiceImpl service = new UserServiceImpl();
service.setUserDao( new UserDaoMySqlImpl() );
service.getUser();
//那我们现在又想用Oracle去实现呢
service.setUserDao( new UserDaoOracleImpl() );
service.getUser();
}
实质:原先是硬编码的程序对象,现在变为可以灵活的由第三方控制。
本文借鉴狂神笔记
。
供个人参考。