IOC
控制反转,是一种设计思想,意味着将设计好的对象交给Ioc容器控制,而不是传统的在对象的内部直接控制。
IOC容器把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象。
DI
依赖注入,组件之间的依赖关系由容器在运行期间决定。
Ioc容器注入应用程序某个对象,它所需要的外部资源(包括对象,资源,常量数据)。
Spring Ioc容器
具有依赖注入功能的容器。负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖。
在Spring中BeanFactory是Ioc容器的实际代表者。BeanFactory接口提供了IoC容器的基本功能。
Spring Ioc容器通过读取配置文件中的配置元数据,通过元数据对应用中各个对象进行实例化及装配。
1 xml配置文件进行配置元数据(一般使用)
2 基于注解
3 基于java文件
Spring Ioc容器管理的对象:Bean
Bean就是由Spring容器初始化、装配及管理的对象,此外bean与应用程序中的其他对象没有什么区别.
Bean在容器内部由BeanDefinition对象表示。
BeanDefinition:
全限定类名(FQN):用于定义Bean的实现类;(必须的)
Bean行为定义:包括作用域(单例、原型创建)、是否惰性初始化及生命周期等;
Bean创建方式定义:说明是通过构造器还是工厂方法创建Bean;
Bean之间关系定义:即对其他bean的引用,也就是依赖关系定义,也就是依赖注入。
Bean的作用域:
1. “singleton”(单例,通过单例缓存池实现)
2. “prototype”(原型,每次创建全新的bean)
3. 另外提供“request”、“session”、“global session”三种web作用域;
Spring Ioc容器工作流程:(基于xml配置)
1. 准备配置文件
2. 由Ioc容器进行解析元数据,创建,组装bean
3. 客户端实例化Ioc容器,从容器中获取需要的bean
Spring IoC容器实例化Bean
根据Bean定义里的配置元数据使用反射机制来创建Bean。
1. 使用无参构造器
2. 静态工厂
3. 实例工厂
Spring IoC容器注入依赖资源的方式:
1. 构造器注入。(构造器方式,静态工厂方式,实例工厂方式都可以)
通过在<bean>中配置构造器实现,构造器参数就是依赖。
配置文件中三种表示参数的方式:参数索引,参数类型,参数名称
public HelloImpl3(String message, int index) {
this.message = message;
this.index = index;
}
<!-- 通过构造器参数索引方式依赖注入 -->
<bean id="byIndex" class="cn.javass.spring.chapter3.HelloImpl3">
<constructor-arg index="0" value="Hello World!"/>
<constructor-arg index="1" value="1"/>
</bean>
<!-- 通过构造器参数类型方式依赖注入 -->
<bean id="byType" class="cn.javass.spring.chapter3.HelloImpl3">
<constructor-arg type="java.lang.String" value="Hello World!"/>
<constructor-arg type="int" value="2"/>
</bean>
<!-- 通过构造器参数名称方式依赖注入 -->
<bean id="byName" class="cn.javass.spring.chapter3.HelloImpl3">
<constructor-arg name="message" value="Hello World!"/>
<constructor-arg name="index" value="3"/>
</bean>
2. Setter注入
通过在通过构造器,静态工厂,实例工厂实例好bean后,通过调用bean类的setter方法进行注入依赖。
只有一种方式,根据名字注入。
//setter方法
public void setMessage(String message) {
this.message = message;
}
public void setIndex(int index) {
this.index = index;
}
<bean id="bean" class="cn.javass.spring.chapter3.HelloImpl4">
<property name="message" value="Hello World!"/>
<property name="index"><value>1</value></property>
</bean>
Spring IoC容器注入集合、数组、字典
Spring不仅能注入简单类型数据,还能注入集合(Collection、Set、List)类型、数组(Array)类型、字典(Map)类型数据、Properties类型数据。
自动装配
自动装配就是指由Spring来自动地注入依赖对象,无需人工参与。
自动装配的好处是减少构造器注入和setter注入配置,减少配置文件的长度。自动装配通过配置<bean>标签的 “autowire”属性来改变自动装配方式。
Eg.<bean id="bean" class="cn.javass.spring.chapter3.bean.HelloApiDecorator"
autowire="byName"/>
四种可选值:“no”、“byName ”、“byType”、“constructor”
如果一个bean有很多setter注入,通过“byName”方式能减少很多<property>配置。
原文地址:http://blog.51cto.com/13580976/2073508