Spring 基础概念——DI、IOC(一)
一、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的默认服务,那么就是轻量级框架,如果其他的服务都打开使用的话就是重量级框架。