控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
实现策略
IoC是一个很大的概念,可以用不同的方式实现。其主要形式有两种:
-
依赖查找:容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回调方法上(也就是上面所说的 类型1):容器将调用这些回调方法,从而让应用代码获得相关资源。
-
依赖注入:组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection
代码:
package com.qi.dao;
public interface UserDao {
void getUser();
}
package com.qi.dao;
public class UserDaoImpl implements UserDao {
public void getUser() {
System.out.println("默认获取用户数据");
package com.qi.dao;
public class UserDaoMysqlImpl implements UserDao {
public void getUser() {
System.out.println("Mysql获取用户数据");
}
}
package com.qi.dao;
public class UserDaoOracleImpl implements UserDao {
public void getUser() {
System.out.println("Oracle获取用户数据");
}
}
package com.qi.Service;
public interface UserService {
void getUser();
}
package com.qi.Service;
import com.qi.dao.UserDao;
public class UserServiceImpl implements UserService {
//private UserDao userDao = new UserDaoImpl();
private UserDao userDao ;
//利用set进行动态实现值的注入!
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void getUser() {
userDao.getUser();
}
}
我们使用一个Set接口实现
private UserDao userdao; //利用set进行动态实现值的注入 public void setUserDao(UserDao userDao){ this.userDao = userDao; }
-
之前,程序是主动创建对象,控制权在程序猿手上!
-
使用了set注入后,程序不再具有主动性,而是变成了被动的接收对象
这种思想,从本质上解决了问题,程序员不再去管理对象的创建了.系统耦合性大大降低,可以更加专注在业务的实现上!这是IOC的原型!
import com.qi.Service.UserServiceImpl;
import com.qi.dao.UserDaoImpl;
import com.qi.dao.UserDaoMysqlImpl;
public class Mytest {
public static void main(String[] args) {
//用户实际调用的是业务层,dao层不需要接触
UserServiceImpl userService = new UserServiceImpl();
userService.setUserDao(new UserDaoImpl());
//userService.setUserDao(new UserDaoMysqlImpl());
userService.getUser();
}
}
运行结果:
userService.setUserDao(new UserDaoImpl());
userService.setUserDao(new UserDaoMysqlImpl());