【学习笔记】IOC的推导及本质
1.IOC理论推导
原来要实现一个业务,需要 Service接口、ServiceImpl、Dao接口、DaoImpl
如下:
UserDao接口:
package com.wang.dao;
public interface UserDao {
void getUser();
}
UserDaoImpl实现类:
package com.wang.dao;
public class UserDaoImpl implements UserDao{
@Override
public void getUser() {
System.out.println("默认用户");
}
}
UserService接口:
package com.wang.service;
public interface UserService {
void getUser();
}
UserServiceImpl实现类:
package com.wang.service;
import com.wang.dao.UserDao;
import com.wang.dao.UserDaoImpl;
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserDaoImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
用户要实现这个业务,直接调用UserserviceImpl即可
但是,如果用户此时想要改变业务,输出“Spring用户”,需要在加一个UserDaoImpl,如果想要输出,就需要修改UserServiceImpl中的调用,业务每变一次,我们就要修改一次。
如下:
UserDaoSpringImpl实现类:
package com.wang.dao;
public class UserDaoSpringImpl implements UserDao{
@Override
public void getUser() {
System.out.println("Spring用户");
}
}
UserServiceImpl实现类:
package com.wang.service;
import com.wang.dao.UserDao;
import com.wang.dao.UserDaoImpl;
import com.wang.dao.UserDaoSpringImpl;
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserDaoSpringImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
如果代码量十分大,这样无疑是十分繁琐的,所以我们可以利用set方法来实现值的动态注入
UserServiceImpl实现类:
package com.wang.service;
import com.wang.dao.UserDao;
import com.wang.dao.UserDaoImpl;
import com.wang.dao.UserDaoSpringImpl;
public class UserServiceImpl implements UserService{
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
主程序:
import com.wang.dao.UserDaoSpringImpl;
import com.wang.service.UserService;
import com.wang.service.UserServiceImpl;
import org.junit.Test;
public class MyTest {
@Test
public void test01(){
UserService userService = new UserServiceImpl();
((UserServiceImpl) userService).setUserDao(new UserDaoSpringImpl());
userService.getUser();
}
}
这样实现和之前的区别:
-
之前是程序主动创建对象,控制权在程序员手中
-
使用set注入后,程序不在有主动性,而是变成了被动接受对象
以上就是IOC的原型
2.IOC本质
控制反转 IOC 是一种设计思想,在没有IOC的程序中,对象的创建和对象的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后,将对象的创建交给第三方,所谓控制反转就是:获得依赖对象的方式反转了。