1.IoC容器初始化:
Spring的IoC容器初始化包括:Bean定义资源文件的定位、载入和注册3个基本过程。
(1).Bean定义资源文件的定位:
Bean定义资源文件定位由ResourceLoader通过统一的Resource接口来完成,Resource接口将各种形式的Bean定义资源文件封装成统一的、IoC容器可进行载入操作的对象。
(2).Bean定义资源文件的载入:
Bean定义资源文件载入的过程是将Bean定义资源文件中配置的Bean转换成IoC容器中所管理Bean的数据结构形式。SpringIoC中管理的Bean的数据结构是BeanDefinition,BeanDefinition是POJO对象在IoC容器中的抽象。
(3).Bean定义的注册:
通过调用BeanDefinitionRegistry接口把从Bean定义资源文件中解析的Bean向IoC容器进行注册,在IoC容器内部,是通过一个HashMap来存储这些Bean对象数据的。
注意:IoC容器和上下文初始化一般不包含Bean依赖注入的实现。一般而言,依赖注入发送在应用第一次通过getBean方法向容器获取Bean时。但是有个特例是:IoC容器预实例化配置的lazyinit属性,如果某个Bean设置了lazyinit属性,则该Bean的依赖注入在IoC容器初始化时就预先完成了。
Spring4.1源代码包
以这个例子开始:
public class UserServiceTest {
private ApplicationContext ctx;
@Test
public void testAdd() throws Exception {
ctx = new ClassPathXmlApplicationContext("beans.xml" );
UserService userService = (UserService)ctx.getBean("userService" );
userService.add( new User());
}
}
static{
// Eagerly load the ContextClosedEvent class to avoid weird classloader issues
// on application shutdown in WebLogic 8.1. (Reported by Dustin Woods.)
ContextClosedEvent.class.getName();
}
public ClassPathXmlApplicationContext(String configLocation ) throws BeansException {
this(new String[] {configLocation}, true, null);
}
这个构造方法通过this()方法又调用了同类下的正真的入口方法:public ClassPathXmlApplicationContext(String[] configLocations , boolean refresh , ApplicationContext parent )throws BeansException {
super(parent );
setConfigLocations(configLocations);
if ( refresh) {
refresh();
}
}
这个才是真正的入口方法:
public AbstractXmlApplicationContext(ApplicationContext parent) {
super(parent );
}
public AbstractApplicationContext(ApplicationContext parent ) {
this ();
setParent( parent);
}
也是两步:public AbstractApplicationContext() {
this. resourcePatternResolver = getResourcePatternResolver();
}
这个构造方法,通过getResourcePatternResolver来获得了一个resourcePatternResolver,这是一个Spring Source的加载器。
getResourcePatternResolver的方法实现是这样的:
protected ResourcePatternResolver getResourcePatternResolver() {
return new PathMatchingResourcePatternResolver(this);
}
直接new了一个PathMatchingResourcePatternResolver对象,这个对象创建了spring的资源加载器。public PathMatchingResourcePatternResolver(ResourceLoader resourceLoader) {
Assert.notNull(resourceLoader, "ResourceLoader must not be null");
this. resourceLoader = resourceLoader;
}
b 然后setParent(parent);