IOC是Spring的两大核心功能之一。

IoC是什么?

Ioc—Inversion of Control,控制反转,是一种设计思想,在以往的Java开发中对象等都是通过程序内部去控制、主动获取的,而IoC的思想意味着将你设计好的对象交给容器控制。

想要了解好Ioc的关键是要明确 谁控制谁?控制什么?为何是反转?哪些方面反转了?

  • 谁控制谁?控制什么?

    传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

  • 在哪里反转了?

    传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

这是也是spring的核心,贯穿始终。

所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。

如何使用Spring框架的IOC

  1. 至少导入Spring的beans/core/context/expression以及commons-logging的Jar

  2. 编写配置文件:applicationContext.xml

  3. 编写一个实体类

  4. 在Spring的配置文件中通过标签实例化类

  5. 在测试类中,通过ClasspathXmlApplicationContext对象的getBean()方法来获取对象

使用IOC的方式

设值注入

使用标签来给对象赋值,其原理是Spring通过setter防蚊器实现了对属性的赋值。

1
2
3
4
<bean id="命名" class="类的全名">
<property name = "属性名" value="简单类型的值" />
<property name = "属性名" ref="引用类型的beanId" />
</bean>

设值注入时,Spring通过JavaBean的无参构造方法实例化对象。当我们编写带参构造方法后,JVM不会再默认提供无参构造方法,保证使用的灵活性,可自行添加一个无参构造方法。

构造注入

使用构造函数给属性赋值。

1
2
3
4
5
6
<bean id="命名" class="类的全名">
<!-- 通过定义的单参构造为属性赋值 -->
<constructor-arg>
<ref bean="DAO的beanId" />
</constructor-arg>
</bean>

每一个元素表示狗咋熬方法的一个参数,且使用时不分先后顺序。当构造方法的参数出现混淆,无法区分时,可以通过元素的index属性置顶参数的位置索引(0开始)。元素还提供type属性来通过数据类型来指定。

构造注入的方法比设值注入的时效性强,在对象实例化时就得到所依赖的对戏那个,便于在对象的初始化方法中使用依赖对象;但受限于要使用方法重载的方式,使用不够如设值注入灵活。故所因情况而定。

p命名空间注入

从Spring2.0开始,支持了p命名空间的属性注入方式。更加快捷 减轻了许多工作量。

1
2
3
4
<bean id="user"  class="com.sw.pojo.User"
p:属性名="属性值" <!-- 属性名 -->
p:属性名-ref="bean的Id" <!-- 引用bean的属性 -->
/>
更多类型注入
  • 简单类型/直接量
      整数 小数 字符串
                   value