2. IOC (控制反转)
2.1 IOC理论推导
-
一般实现业务:
编写dao层接口 、实现类
public interface UserDao { // 获取用户 void getUser(); }
public class UserDaoImpl implements UserDao{ public void getUser() { System.out.println("user, hello"); } }
编写service层接口、实现类
public interface UserService{ // 获取用户信息 void getUser(); }
public class UserServiceImpl implements UserService{ // 调用dao 层 UserDao userDao = new UserDaoImpl(); public void getUser() { userDao.getUser(); } }
测试,调用service层
public class TestUser { public static void main(String[] args) { UserService userService = new UserServiceImpl(); userService.getUser(); } }
-
如果客户需要修改业务:
public class UserDaoImpl2 implements UserDao{ public void getUser() { System.out.println("增加了业务"); } }
public class UserServiceImpl implements UserService{ // 调用dao 层 //UserDao userDao = new UserDaoImpl(); UserDao userDao = new UserDaoImpl2(); public void getUser() { userDao.getUser(); } }
我们可以发现,当增加一个业务或者修改业务时,需要修改原有的代码。如果业务量非常大,这样的成本将会非常高,浪费资源。
那么如何解决这个问题呢?
添加接口新的实现类:
public class UserDaoImplement3 implements UserDao {
public void getUser() {
System.out.println("实现新业务了");
}
}
给service层实现类添加set方法
public class UserServiceImpl implements UserService{
UserDao userDao;
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public void getUser() {
userDao.getUser();
}
}
测试
public class TestUser {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
((UserServiceImpl)userService).setUserDao(new UserDaoImplement3());
userService.getUser(); // 输出: 实现了新业务
}
}
通过使用了set方法,把对象当成参数输入, 只需要额外增加一个新的实现类,不需要修改原有的代码,也就是由用户来主动创建对象,程序被动接收,这种思想就是IOC原型。
2.2 什么是IOC?
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。
主动权的变动,程序结构不变。
控制反转就是获得依赖的对象的方式反转了。
采用xml方式配置bean时,bean的定义信息和实现是分离的,而采用注解的方式可以把两者结为一起,bean的定义信息直接以注解的方式定义在实现类中,从而达到了零配置的目的。