文章目录
2、IOC理念推导之传统业务
举个栗子:
1、传统的业务实现:
1.UserDao接口
2.UserDaoImpl实现类
UserDaoMysqlImpl
UserDaoOracleImpl
3.UserService业务接口
4.UserServiceImpl 业务实现类
1、在dao层写一个UserDao接口和一个实现类
package com.blackcat.dao;
public interface UserDao {
void getUser();
}
package com.blackcat.dao;
public class UserDaoImpl implements UserDao {
public void getUser() {
System.out.println("默认获取用户的数据");
}
}
2、在service层中编写一个接口:这个接口中调用dao层的方法
package com.blackcat.service;
public interface UserService {
void getUser();
}
3、在service层中编写一个实现类:这个实现类,通过聚合的方式,调用 Dao层的功能。
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserDaoImpl();
public void getUser() {
userDao.getUser();
}
}
4、编写测试类 MyTest 测试我们的代码
public class MyTest {
@Test
public void testUser(){
//用户实际调用的是业务层,dao层他们不需要接触!
UserServiceImpl userService = new UserServiceImpl();
userService.getUser();
}
}
默认获取用户的数据
Process finished with exit code 0
2、如果我们要修改需求
1、比如业务层要实现dao层修改mysql数据库,或者oracle数据库的数据,我们需要改动原代码:
package com.blackcat.dao;
public class UserDaoMysqlImpl implements UserDao{
public void getUser() {
System.out.println("Mysql获取用户数据!");
}
}
package com.blackcat.dao;
public class UserDaoOracleImpl implements UserDao {
public void getUser() {
System.out.println("Oracle获取用户数据!");
}
}
//修改原代码
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserDaoMysqlImpl();
public void getUser() {
userDao.getUser();
}
}
2、思想:我们可以让我们的程序不动,让我们的客户端去做一些事情。
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!
如果程序代码量十分大,修改一次的成本代价十分昂贵!
3、我们使用一个set接口实现,发生了革命性的变化!
public class UserServiceImpl implements UserService{
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void getUser() {
userDao.getUser();
}
}
-
之前,程序主动创建对象,控制权在我们程序员手里。
-
后来,使用了set注入接口类型对象以后,程序不再具有主动性,只是被动地接受对象。
这种思想,在本质上解决了问题,我们程序猿不用再去管理对象的创建了,有什么好处?
4、好处:
大大降低了程序的耦合性,让我们程序员专注于业务的的实现上,这就是IOC的原型。