一、一切从手动启动IoC容器开始
ClassPathResource resource = new ClassPathResource("bean.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(resource);
第一行代码:ClassPathResource的作用是起到了资源定位的作用。通常情况下,Spring的配置信息使用文件来描述,通过这样一行代码,指明了需要加载的资源的位置,并且使用Spring能够理解的Resource接口的形式将资源描述出来。
第二行代码:DefaultListableBeanFactory是一个纯粹的IoC容器类,它是这个Spring的一个基础的IoC容器类,其他的一个IoC容器都是以这个类为基础进行扩展的。这样代码只是定义了一个IoC容器,它不具有任何其他的能力。
第三行代码:XmlBeanDefinitionReader是一个配置文件读取器。它实现了BeanDefinitionReader接口,它能够按照Spring配置文件,将其中的配置信息转换为spring内部可以识别的信息(BeanDefinition)。注意,在这里它的构造函数需要一个BeanDefinitionRegistry类型的参数,BeanDefinitionRegistry接口提供了一个回调函数,通过这个回调函数可以向IoC容器注册bean的定义信息。DefaultListableBeanFactory实现了这个接口。
第四行代码:调用loadeBeanDefinitions方法,通过给定的Resource资源,从中读取出spring的配置信息,转换为BeanDefinition,然后再调用BeanDefinitionRegistry的回调函数进行注册。
通过以上的四行代码,完成了spring容器的启动。
二、容器启动过程
1. 定位
在spring中,使用统一的资源表现方式Resource。根据不同的情况进行不同的选择。上述程序中,采用了编程式的资源定位方法,使用ClassPathResource定位位于classpath下的资源文件。
2. 加载
在加载这个过程中,主要工作是读取spring配置文件,解析配置文件中的内容,将这些信息转换成为Spring内容可以理解、使用的BeanDefinition。
3. 注册
加载过配置文件后,就将BeanDefinition信息注册到BeanDefinitionRegistry中,通常情况下Spring容器的实现类都实现这个接口。
三、资源加载实现
首先看一下XmlBeanDefinitionReader中的loadBeanDefinitions方法的实现
public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
Assert.notNull(encodedResource, "EncodedResource must not be null");
if (logger.isInfoEnabled()) {
logger.info("Loading XML bean definitions from " + encodedResource.getResource());
}
Set<EncodedResource> currentResources = this.resourcesCurrentlyBeingLoaded.get();
if (currentResources == null) {
currentResources = new HashSet<EncodedResource>(4);
this.resourcesCurrentlyBeingLoaded.set(currentResources);
}
if (!currentResources.add(encodedResource)) {
throw new BeanDefinitionStoreException(
"Detected cyclic loading of " + encodedResource + " - check your import definitions!");
}
try {
InputStream inputStream = encodedResource.getResource().getInputStream();
try {
InputSource inputSource = new InputSource(inputStream);
if (encodedResource.getEncoding() != null) {
inputSource.setEncoding(encodedResource.getEncoding());
}
return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
}
finally {
inputStream.close();
}
}
catch (IOException ex) {
throw new BeanDefinitionStoreException(
"IOException parsing XML document from " + encodedResource.getResource(), ex);
}
finally {
currentResources.remove(encodedResource);
if (currentResources.isEmpty()) {
this.resourcesCurrentlyBeingLoaded.set(null);
}
}
}
分享到:
相关推荐
Spring IOC 容器启动流程分析 Spring IOC 容器是 Java 企业级应用程序的核心组件之一,它提供了一个统一的依赖注入机制,使得应用程序的组件之间能够松耦合。Spring IOC 容器的启动流程是整个 Spring 框架的核心...
在Spring容器的启动过程中,会执行以下步骤:首先,会检查是否已经存在根应用程序上下文,如果不存在,则创建一个新的应用程序上下文。然后,会创建一个新的spring容器,并将其添加到ServletContext中。最后,会将...
然而,在某些情况下,我们可能需要在非Spring注解的类中访问Spring容器中的Bean,或者在这些类中使用YAML配置文件中的配置信息。本篇将详细介绍如何在这样的场景下实现这一目标。 首先,让我们来理解如何在非Spring...
- **BeanPostProcessors** 和 **BeanFactoryPostProcessors**:允许开发者在Spring容器启动过程中对Bean定义进行修改。 - **PropertyPlaceholderConfigurer** 和 **PropertyOverrideConfigurer**:用于在运行时动态...
这样,在Spring容器启动时,它会自动调用`setApplicationContext`方法,将`ApplicationContext`实例注入到实现了`ApplicationContextAware`的类中。 ### 结论 选择哪种方法获取Spring容器主要取决于具体的应用场景...
在Spring容器启动过程中,IoC容器会先创建对象,然后调用invokeBeanFactoryPostProcessors方法来执行所有的BeanFactoryPostProcessor。 其次,BeanDefinitionRegistryPostProcessor(BDPP)的作用是在所有bean定义...
在Spring框架中,当一个基于Servlet的Web应用启动时,Spring容器的初始化过程是至关重要的。这个过程涉及到多个组件和步骤,让我们详细探讨一下。 首先,我们在`web.xml`配置文件中看到了`<context-param>`和`...
Spring Bean 加载过程源码解析文档 Spring Bean 加载过程是 Spring 框架中最核心的部分之一,涉及到 ApplicationContext 的初始化、Bean 的加载和注册等过程。在 Spring Boot 应用程序中,SpringApplication 负责...
总的来说,Spring在Web容器中的启动过程涉及到`WebApplicationContext`的创建、配置文件的解析、bean定义的加载和bean的实例化。通过这种方式,Spring能够紧密地集成到Web环境中,提供全面的依赖注入和控制反转功能...
首先,`@ComponentScan`注解用于指示Spring容器在指定的包及其子包下搜索带有特定注解(如`@Component`、`@Service`、`@Repository`和`@Controller`)的类,将这些类注册为Bean。在启动过程中,Spring会执行以下步骤...
在Spring Boot启动过程中,createEmbeddedServletContainer方法扮演着重要的角色,该方法用于创建内嵌的Servlet容器。在该方法中,首先判断localContainer和localServletContext是否为空,如果为空,则创建一个新的...
1. Spring 容器启动过程: 在Spring框架中,当容器启动时,它会解析配置文件(如XML或Java配置),并将其中定义的bean实例化并初始化。这些bean通常代表应用程序中的对象,如服务、数据访问对象(DAO)或其他组件。...
本文将深入探讨Spring容器中Bean的初始化过程。 首先,Spring容器根据XML配置文件(如`applicationContext.xml`)来解析Bean的定义。在示例中,我们定义了一个名为`people`的Bean,它对应于`People`类。默认情况下...
Spring Boot启动过程(五)之Springboot内嵌Tomcat对象的start教程详解 Spring Boot启动过程(五)之Springboot内嵌Tomcat对象的start教程详解是Spring Boot启动过程的重要组件之一,本文将详细介绍Springboot内嵌...
2. **容器初始化**:当Spring容器启动时,会读取配置信息并构建Bean的定义。这个过程包括解析配置文件、实例化Bean定义、处理依赖注入等。 3. **依赖注入(DI)**:是IOC的核心。Spring容器负责管理Bean的生命周期...
该配置文件定义了一个名为 `ApplicationEventListener` 的 Bean,类型为 `ioc.test.ApplicationEventListener`,当 Spring 容器启动时会自动实例化这个 Bean。 #### 六、事件监听器实现 ```java package ioc.test;...
-- 当Spring容器关闭时,是否等待所有正在运行的任务完成 --> ``` 3. **创建Job和Trigger**:定义一个实现了`org.quartz.Job`接口的类,该类表示要执行的任务。然后创建一个`org.quartz.Trigger`,指定任务的...
在Spring框架中,动态注册Bean是一项非常实用的功能,它允许我们在应用运行时向Spring容器添加新的Bean定义。这种能力在很多场景下都是极其有用的,比如根据不同的环境配置加载不同的服务实现,或者在运行时根据某些...