一、IOC介绍
IOC:Inversion of Control 控制反转
spring核心容器也可以称为IOC容器,该容器主要负责管理各种对象,主要包括项目的生命周期(对象的创建、初始化、销毁等)、不同对象之间依赖关系的建立、将不同的对象及对象代码在程序运行期间动态的结合在一起等等。
IOC容器并没有实现更多的功能,但它的存在使我们不需要很多代码、不需要考虑对象间复杂的耦合关系就能从IOC容器中获取合适的对象,而且提供了各种对象的可靠的管理,极大地降低了开发的复杂性。
控制反转:是一种编程思想,或者说是一种新的设计模式,由于推出较晚,所以没有纳入GoF23种设计模式当中。
控制反转了什么呢?
- 不需要使用硬编码的方式创建对象;
- 不需要使用硬编码的方式维护对象之间的关系;
DI:Dependency Injection 依赖注入
DI的概念的提出是用来代替IOC的,表示让调用类对某一接口实现类的依赖关系由容器注入,以移除调用类对某一接口实现类的依赖。
依赖注入 这个名词显然比 控制反转 更直接明了,并且易于理解。 它是控制反转的一种实现方式,并不是唯一的方式,例如:依赖查找、服务定位器、容器注入、策略模式和观察者模式等,也可以实现控制反转。
二、IOC容器
Spring的IoC(Inversion of Control,控制反转)之所以又称为IoC容器,主要是因为IoC在Spring框架中承担了一个核心的角色——作为容器来管理应用程序中的对象(通常称为Bean)。
Spring提供了两种主要的IoC容器实现:BeanFactory
和ApplicationContext
- BeanFactory:
- 是Spring中最基础的IoC容器接口,提供了IoC服务的基本支持。
- 主要用于访问容器中的Bean,但功能相对简单,不提供诸如国际化、事件发布等高级功能。
- ApplicationContext:
- 是
BeanFactory
的子接口,提供了更丰富的功能,如国际化、资源访问、事件发布等。 - 是Spring框架推荐使用的IOC容器实现,因为它提供了比
BeanFactory
更全面的服务支持。
- 是
核心API
// 根据指定名称返回一个Bean实例
Object getBean(String name)
// 判断名称为name的Bean是否是原型,即是否总是返回一个新实例(非单例)
boolean isPrototype(String name)
// 判断名称为name的Bean是否是单例
boolean isSingleton(String name)
// 判断容器中是否包含给定名称的Bean实例
boolean containsBean(String name)
// 如果名称为name的Bean有别名则返回其别名
String[] getAliases(String name)
三、IOC的注入功能
1. set方式注入(必须依靠set方法)
1)基本类型的装配
XML配置
<bean id="student" class="com.it.bean.Student">
<property name="id" value="001"></property>
<property name="age">
<value>23</value>
</property>
</bean>
java配置类
@Bean
public Student student() {
Student student = new Student();
student.setName("name");
student.setAge(18);
return student;
}
注意:
-
id:是Bean的唯一标识,要求在整个配置文件中要唯一,也可使用name属性,bean标签里面的id和name属性都可以用来标识这个配置的对象,但是id会帮我们检查给对象起的名字是否规范(名字不能重复、不能用数字开头、不能有空格等等),如果检查出来了就会报错,而name属性不会检查这些东西;
XML配置
<bean name="t1 t2" class="com.it.bean.Teacher"></bean> <bean id="t1 t2" class="com.it.bean.Teacher"></bean>
java配置类
@Bean(name = { "stu", "student", "s"}) public Student student() { return new Student(); }
-
property:对于所有用set方式来注入的必须使用该标签。
-
value:基本数据类型,都用value(标签/属性)来注入,可以实现自动的数据类型转换。
2)对象类型的装配
-
引用对象在当前配置文件中:
<property name="student"> <ref local="objName"/> </property>
-
引用对象不在当前配置文件中:
<property name="student"> <ref bean="objName"/> </property>
-
使用property的ref属性引用:
<property name="student" ref="objName"></property>
3)集合的装配
-
List集合:
<!-- 使用value注入 --> <property name="list"> <list> <value>hello1</value> <value>hello2</value> <value>hello3</value> </list> </property> <!-- 使用ref引用spring容器中的其他对象 --> <property name="list"> <list> <ref bean="t1"/> <ref bean="t2"/> </list> </property>
-
Set集合:
<property name="set"> <set> <va