IOC理论
引入
原来实现业务的步骤:
- Dao层接口
- Dao层实现类
- Service层接口
- Service层实现类
eg:
-
Dao层接口
public interface UserDao { void getUser(); }
-
Dao层实现类
public class UserDaoImpl implements UserDao{ public void getUser() { System.out.println("获取用户,此方法为:Dao层方法"); } }
-
Service层接口
public interface UserService { void getUser(); }
-
Service层实现类
public class UserServiceImpl implements UserService{ private UserDao userDao = new UserDaoImpl(); public void getUser() { userDao.getUser(); } }
在service的实现类中引入Dao,在由Dao在service中调用相应的方法。
现在我们增加一个需求:增加其他的实现。
具体实现步骤:
- 新增Dao层实现类
- 在service中引入Dao层,并调用相应的方法
eg:
-
新增Dao层实现类
public class UserDaoMysqlImpl implements UserDao{ public void getUser() { System.out.println("获取用户,此方法为:UserDaoMysqlImpl中的方法"); } }
-
在service中引入Dao层,并调用相应的方法
这时候就会发生一个问题,如果用户想要访问到新增加的这个Dao层的东西,就必须修改Service层中实现类中的代码,将新的Dao层实现类对象引入到Service层中。
即:
private UserDao userDao = new UserDaoImpl(); //将下述代码替换上述代码 private UserDao userDao = new UserDaoMysqlImpl();
用户每次调用一个新的业务都需要修改Service层中的代码,显然这样在显示的业务中是不可取的。那么如何解决这类问题呢?
可以使用set方法实现动态的改变Service实现类中Dao的改变。
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
向上述这样。这样的话用户就可以根据自己的需求动态的进行改变。
eg:
@Test
public void test(){
UserService userService = new UserServiceImpl();
UserDaoImpl userDao = new UserDaoImpl();
UserDaoMysqlImpl userDaoMysql = new UserDaoMysqlImpl();
((UserServiceImpl) userService).setUserDao(userDaoMysql);//这里用户可以根据自己的需求动态的对Dao层进行注入。
userService.getUser();
}
总结:
- 之前,程序是主动进行创建的,控制权程序猿手中。
- 使用set方法以后,程序失去了主动性变成了被动的接受对象!!!!
- 这种思想从本质上解决了问题,我们作为开发人员不需要在去管理对象的创建了。这样大大降低了系统的耦合性,可以更加专注与业务的实现。这就是IOC的原型!!!!!
本质
控制反转IOC(Inversion Of Control),是一种设计思想,DI(依赖注入)是实现IOC的一种方法,也有一种说法是DI是IOC的另一种说法。在没有IOC的程序中对象的创建完全硬解码在程序中(写死在程序中),对象的创建由程序自己控制,使用了控制反转以后将对象的创建转移给第三方,所以个人认为所谓控制反转就是获取对象的方式发生了反转。
用图形表示如下:
IOC是Spring框架的核心,可以使用多种方式完美的实现IOC,eg:XML配置文件,注解,甚至可以零配置实现IOC
标签:SpringIOC,userDao,Service,推导,理论,Dao,UserDao,IOC,public From: https://www.cnblogs.com/fan129/p/17347157.html