描述,制造
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容器设计主要基于BeanFactory
和ApplicationContext
两个接口(“容器基于接口”这种设计),其中ApplicationContext
是BeanFactory
的子接口之一。主要用ApplicationContext
做为IoC容器。
ApplicationContext
的子类: ClassPathXmlApplicationContext
.
IoC容器初始化和DI
初始化之后才会进行DI;
Bean的初始化:
- Resource定位;
- BeanDefinition载入: Spring根据配置获取POJO,生成对应实例
- 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包
example
实际案例:
- 创建XML文件,文件中定义bean,使得Spring IoC容器在初始化的时候能找到它们
ClassPathXmlApplicationContext
容器初始化
POJO
:
1 | package ssm.chap9.pojo; |
spring-cfg.xml
: 描述bean1
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
13package 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 dependencies1
2
3
4spring-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