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. 使用无参构造器
public class Person {
private String name;
private Integer age;
//必须包含一个无参数构造器,有参数的也可以有
public Person() { System.out.println("这是一个无参构造函数"); }
}
Person person = (Person)context.getBean("person");
2. 静态工厂
通过factory-method属性来指定创建bean实例的静态工厂方法
public class PersonServiceBeanFactory {
public static PersonServiceBean createPersonServiceBean(){
return new PersonServiceBean()
}
}
Person person = (Person)context.getBean("person2");
3. 实例工厂
定义一个工厂类
通过factory-bean属性指定工厂类,通过factory-method属性指定该工厂类的非静态工厂方法
spring调用工厂方法,在该工厂方法中,由程序员来创建对象
public class PersonServiceBeanFactory {
public PersonServiceBean createPersonServiceBean(){
return new PersonServiceBean()
}
}
Person person = (Person)context.getBean("person3");
Spring IoC容器注入依赖资源的方式:
1. 构造器注入。(构造器方式,静态工厂方式,实例工厂方式都可以)
通过在
配置文件中三种表示参数的方式:参数索引,参数类型,参数名称
public HelloImpl3(String message, int index) {
this.message = message;
this.index = index;
}
2. Setter注入
通过在通过构造器,静态工厂,实例工厂实例好bean后,通过调用bean类的setter方法进行注入依赖。
只有一种方式,根据名字注入。
//setter方法
public void setMessage(String message) {
this.message = message;
}
public void setIndex(int index) {
this.index = index;
}
Spring IoC容器注入集合、数组、字典
Spring不仅能注入简单类型数据,还能注入集合(Collection、Set、List)类型、数组(Array)类型、字典(Map)类型数据、Properties类型数据。
自动装配
自动装配就是指由Spring来自动地注入依赖对象,无需人工参与。
自动装配的好处是减少构造器注入和setter注入配置,减少配置文件的长度。自动装配通过配置
Eg.
autowire="byName"/>
四种可选值:“no”、“byName ”、“byType”、“constructor”
如果一个bean有很多setter注入,通过“byName”方式能减少很多