控制反转(IoC:Inversion of Control):
应用本身不负责依赖对象的创建与维护,而是由外部容器负责(IOC容器)。就是说控制权由应用转移到外部容器。控制权的转移就是所谓的反转。 控制反转一般分为两种类型,
依赖注入(Dependency Injection,简称DI)(流行)和依赖查找(Dependency Lookup)(不流行)。
依赖注入(DI:Dependency Injection):
在运行期,由外部容器动态地将对象注入到组件中。如下(注入personDao):
- public class PersonServiceBean{
- //PersonDao是一个接口,使用XML配置或注解可以注入一个实现类的实例
- @Autowired
- public PersonDao personDao;
- }
如果不采用依赖注入,则必须这样:
- public PersonDao personDao = new PersonDaoBean();
依赖注入有三种方式:
- 接口注入(Interface Injection)
- 设值注入(Setter Injection): IoC 容器使用属性的 setting 方法来注入被依赖的实例
- 构造注入(Constructor Injection):利用构造器来设置依赖关系
Spring IoC/DI的过程:
- 遍历所有被注解的类和配置文件,为被注解或配置的类创建实例bean
- 再次遍历这些被注解的类和配置文件,如果发现某个bean里面的某个成员被注解或配置为需要注入,则为其注入相应的bean
- 默认地,这些bean都是单例的
依赖查找:
例子:
- public class MyBusniessObject{
- private DataSource ds;
- private MyCollaborator myCollaborator;
- public MyBusnissObject(){
- Context ctx = null;
- try{
- ctx = new InitialContext();
- ds = (DataSource) ctx.lookup(“java:comp/env/dataSourceName”);
- myCollaborator = (MyCollaborator) ctx.lookup(“java:comp/env/myCollaboratorName”);
- }……