描述,制造

IoC理解: Java代码中已经有类的定义:进行制造; 而IoC的精髓在于用XML描述信息,让spring容器制造需要的对象

XML: IoC创建Objects, bean的id对应类名,property对应类属性

XML进行配置描述创建对象的需求,写java代码直接调用通过IoC创建对象

我: 并不关心创建过程, 只关心对Object的描述,以及委托制造(下订单)

Achtung: 这个对对象的描述,可以是通过XML或者annotation

IoC: 通过描述(XML/annotation),通过第三方产生/获取特定对象的方式

IoC的实现方法是DI

过程

每个熟悉特定板块的部分,由熟悉那个板块的人完成,并将其service发布到Spring IoC容器中

e.g. 测试人员,已经测试完成了财务模块;现在需要测试交易模块,不用细致地了解交易模块,只需要从Spring IoC容器中获取就行了. 因为IoC所以获取对象只需要从IoC容器中获取就行了, 实现了模块之间的解耦。

IoC容器的设计

Spring IoC容器设计主要基于BeanFactoryApplicationContext两个接口(“容器基于接口”这种设计),其中ApplicationContextBeanFactory的子接口之一。主要用ApplicationContext做为IoC容器。

ApplicationContext的子类: ClassPathXmlApplicationContext.

IoC容器初始化和DI

初始化之后才会进行DI;

Bean的初始化:

  1. Resource定位;
  2. BeanDefinition载入: Spring根据配置获取POJO,生成对应实例
  3. BeanDefinition注册: 前面的POJO往Spring IoC容器注册, 从此各种人员都可以通过描述从容器中获取bean;

Bean在Spring IoC容器中得到了初始化,但是没有完成DI; i.e. 没有注入配置的资源给bean:还是不能完成使用; DI: Spring Bean的配置选项: lazy-init, i.e. 是否初始化SpringBean. 在没有任何配置的情况下,默认值是default, 实际值是false, i.e. Spring IoC自动初始化Bean. 如果设置为true,那么只有使用Spring IoC容器的getBean方法获取的时候才会完成DI.

关于依赖jar包

spring核心框架体系:各个jar包作用

example

实际案例:

  1. 创建XML文件,文件中定义bean,使得Spring IoC容器在初始化的时候能找到它们
  2. ClassPathXmlApplicationContext容器初始化

POJO:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package ssm.chap9.pojo;

public class Source {
private String fruit;
private String sugar;
private Integer size;

// getters and setters
}

public class JuiceMaker2 {

private String beverageShop = null;
private Source source = null;

public String makeJuice() {
String juice = "this is a cup of juice made by " + beverageShop + source.getSize()
+ source.getSugar() + source.getFruit();
return juice;
}

// getters and setters
}

spring-cfg.xml: 描述bean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd ">
<bean id="source" class="com.ssm.chap9.pojo.Source">
<property name="fruit" value="orange"/>
<property name="sugar" value="little"/>
<property name="size" value="large"/>
</bean>

<bean id="juiceMaker2" class="com.ssm.chap9.pojo.JuiceMaker2">
<property name="beverageShop" value="Gong Cha"/>
<property name="source" ref="source" />
</bean>
</beans>

test:

1
2
3
4
5
6
7
8
9
10
11
12
13
package ssm.chap9.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import ssm.chap9.pojo.JuiceMaker2;

public class DemoContainer {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-cfg.xml"); // container
JuiceMaker2 juiceMaker2 = (JuiceMaker2) ctx.getBean("juiceMaker2"); // object
System.out.println(juiceMaker2.makeJuice());
}
}

Dependencies: 4 core Spring dependencies

1
2
3
4
spring-beans-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar
spring-context-4.2.4.RELEASE.jar
spring-expression-4.2.4.RELEASE.jar