Spring4 之 IOC & DI
前言
本节我们学习一下 Spring IOC 和 DI。首先我们了解一下什么时Spring。
Spring 为简化企业级应用开发而生的一个开源框架. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能。从Spring 的内部结构看,Spring 是一个 IOC(DI) 和 AOP 容器框架。
具体描述一下Spring
Light Weight:Spring 是非侵入性的 - 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API
Inversion of Control:依赖注入(DI — dependency injection、IOC)
aspect oriented programming:面向切面编程
container:Spring 是一个容器, 因为它包含并且管理应用对象的生命周期
Framework:Spring 实现了使用简单的组件配置组合成一个复杂的应用. 在 Spring 中可以使用 XML 和 Java 注解组合这些对象
One-Stop(一站式):在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库 (实际上 Spring 自身也提供了展现层的 SpringMVC 和 持久层的 Spring JDBC)
Spring Architecture
概念
IOC(Inversion of Control)
其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式
DI(Dependency Injection)
IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源注入. 相对于 IOC 而言,这种表述更直接
IOC Container
在 Spring IOC 容器读取 Bean 配置创建 Bean 实例之前, 必须对它进行实例化. 只有在容器实例化后, 才可以从 IOC 容器里获取 Bean 实例并使用。
Spring 提供了两种类型的 IOC 容器实现
BeanFactory: IOC 容器的基本实现
- BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身
ApplicationContext: 提供了更多的高级特性. 是 BeanFactory 的子接口
ApplicationContext 面向使用 Spring 框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext 而非底层的 BeanFactory
ApplicationContext 的主要实现类
- ClassPathXmlApplicationContext:从 类路径下加载配置文件
- FileSystemXmlApplicationContext: 从文件系统中加载配置文件
ConfigurableApplicationContext
- 扩展于 ApplicationContext,新增加两个主要方法:refresh() 和 close(), 让 ApplicationContext 具有启动、刷新和关闭上下文的能力
ApplicationContext
- 在初始化上下文时就实例化所有单例的 Bean。
WebApplicationContext
- WebApplicationContext 是专门为 WEB 应用而准备的,它允许从相对于 WEB 根目录的路径中完成初始化工作
DI
在Spring目前支持 3 依赖注入方式。
属性注入
属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象
属性注入使用 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 子节点指定属性值
属性注入是实际应用中最常用的注入方式
一个栗子
其中 Orders 是一个 Entity。<bean id="orderOne" class="com.spring.example.entiry.Orders"> <property name="orderId" value="123465798"></property> <property name="tradeArea" value="PECIA"></property> <property name="tradeTime" value="July,12th,2017"></property> </bean>
构造器注入
通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用
构造器注入在 元素里声明属性, 中没有 name 属性
一个栗子
<bean id = "jedisPool" class="redis.clients.jedis.JedisPool"> <constructor-arg index="0" ref="jedisPoolConfig"/> <constructor-arg index="1" value="${redis.host}"/> <constructor-arg index="2" value="${redis.port}" type="int"/> <constructor-arg index="3" value="${redis.timeout}" type="int"/> <constructor-arg index="4" value="${redis.password}"/> </bean>
工厂方法注入(很少使用,不推荐)
小结
就目前而言Spring 是一个非常优秀的Framework。在项目使用时Spring 不仅大大地提高了开发效率还能满足不同的扩张需求(比如与第三方 Dev. Tool相结合)。
IOC 和 DI是 Spring 的两个核心体现。