一、IOC 控制反转

package com.qunar.studyspring.bean;

import com.qunar.studyspring.dao.PersonDao;
import com.qunar.studyspring.object.Person;

/**
 * 这是一个没有控制反转的例子
 * @author liqiu
 *
 */
public class PersonServiceBean {
    private PersonDao personDao = new PersonDao();

    public void save(Person person) {
        personDao.save(person);
    }
}

在解释什么是控制反转之前,先介绍没有出现这个技术之前的例子。如上面所示,PersonDao是直接引用的,也就是说我要在哪里使用PersonDao,就要在哪里初始化它,像是废话是吧,没关系,再看下面的控制反转的例子:

package com.qunar.studyspring.bean;

import com.qunar.studyspring.dao.PersonDao;
import com.qunar.studyspring.object.Person;

/**
 * 这是一个没有控制反转的例子
 * @author liqiu
 *
 */
public class PersonServiceBean {
    private PersonDao personDao;

    //咱们在构造方法内(也可以采用set方法),将对象注入到应用里面,也就是应用里面的personDao是由外部容器负责创建的
    public PersonServiceBean(PersonDao personDao){
        this.personDao = personDao;
    }
    
    public void save(Person person) {
        personDao.save(person);
    }
}

区别就是在PersonServiceBean中,什么时候创建personDao,自己不知道,有外面调用它的程序控制。也就是说所谓控制反转就是把依赖对象交给外部容易负责创建。

二、DI 依赖注入

所谓依赖注入就是:在运行期间,由外部容器动态将依赖对象注入到组件中。

那么依赖注入和控制反转有啥区别哪?引用网络上面的一段话:“依赖注入和控制反转是对同一件事情的不同描述,只是它们描述的角度不同。依赖注入是从应用程序的角度在描述,即:应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,既:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。”

三、使用Spring的好处:

1、解耦:Control、Service和Dao相互不在直接声明使用

2、事物管理服务、JMS服务、持久化等等

3、支持单例模式

4、支持AOP技术,面向切面开发

5、有很多的辅助类:JdbcTemplate、HibernateTemplate

6、支持主流框架的集成:Hibernate、Struts等

四、轻量级框架和重量级框架的区别

主要区别是:启用服务的多少。

Spring是否是重量级框架?如果仅仅使用Spring的默认服务,那么就是轻量级框架,如果其他的服务都打开使用的话就是重量级框架。