一直在用Spring容器,读书的时候也大概看过一些实现原理,不过比较模糊。趁元旦,花个几小时debug一把,看看简单的ioc流程并且tips把。
public class ApplicationContextTest {
public static void main(String[] args){
ApplicationContext ctx=new ClassPathXmlApplicationContext("classpath:org/springframework/context/innertest/spring-context.xml");
CodeGeFactory factory=(CodeGeFactory) ctx.getBean("generatorFactory");
System.out.println(factory.getCodeGenerator().generate());
}
}
<bean id="generatorFactory" class="org.springframework.context.innertest.pojo.CodeGeFactory">
<property name="codeGenerator" ref="codeGenerator"/>
</bean>
<bean id="codeGenerator" class="org.springframework.context.innertest.pojo.JavaCodeGenerator"/>
示例代码很简单,不细说,就是一个注入,然后定义顺序颠倒。这里首先区分下ApplicationContext和BeanFactory,前者包装在BeanFactory之上,主要做一些bean定义的解析以及各种processer和特殊bean(xxxAware实现类)的初始化以及调用,而真正的bean实例化以及ioc工作都在BeanFactory中做。
初始化工作主要在实例化ClassPathXmlApplicationContext的时候。首先对路径本身做了placeHolder的占位符(${xxx})替换,并且存储这些配置文件路径。随后进入主体初始化方法refresh()方法中。refresh()主要做的事情如下:
1. 初始化placeholder并校验properties,用于配置文件(或字符串)转换到BeanDefinition的替换.
2. 创建beanFactory,读取配置文件解析xml中的信息,主要包括bean的id,对应的class全名,以及依赖的bean的名称等信息,这个时候全是文本信息,不做初始化以及注入等工作。值得一提的是,spring根据location字符串的前缀将整个资源封装成不同类型的Resource,使用对应的ResourceLoader来加载,不过说到底,最后也是通过具体的classloder(通俗点来说就是不同的文件位置)加上相对文件路径找到文件资源罢了。Spring做了层层封装,可能是为了支持其看上去过度丰富的资源类型而不得已为之。
3. 中间做了一大堆的外部processer的实例化和invoke.示例没有定义,所以全部跳过了。
4. 通过反射实例化bean,然后查找依赖的bean,没初始化的直接初始化,这也解释了在bean的定义中先后关系并不重要,因为只要定义的xml(或者其他)已经被load进来并且封装成BeanDefinition,那么肯定能够被容器查找到并实例化起来。至于注入,中间代码有一大堆(属性编辑器),没有细究,最后是通过反射拿到相关属性的write method invoke一把就完成了注入(构造器注入以及注解注入步骤也差不多)。最终放入容器。
5.使用的时候(ctx.getBean("generatorFactory"))也就是拿到容器中缓存的实例。这里值得注意的一点是,默认的spring bean都是单例。
分享到:
相关推荐
Spring通过IoC容器来管理对象及其依赖关系,从而降低组件间的耦合。开发者不再需要手动创建和管理对象,而是将对象的创建和装配工作交给IoC容器。容器根据XML或注解配置来决定如何实例化、装配和管理对象。这种方式...
mer() { customerDao.saveCustomer(); }}2.2.3.3..../*** 客户 controller 类*/...通过实际案例展示了如何在项目中使用 spring ioc 进行对象创建和管理,同时涵盖了源码层面的简要分析,为深入理解 spring 提供了基础。
Spring IoC容器和Bean的概念息息相关,Spring通过Bean来管理应用程序中各个组件的创建、配置和管理。 Bean的作用域包括单例、原型、请求、会话等,开发者可以通过XML配置文件或注解定义Bean的作用域。Bean定义的...
- **IoC容器**: Spring的IoC容器通过BeanFactory和ApplicationContext接口来实现。这些容器能够自动管理对象及其依赖关系,从而避免了在代码中硬编码这些依赖。 - **依赖注入**: Spring支持三种类型的依赖注入方式:...
核心容器包括BeanFactory和ApplicationContext,它们是Spring IoC容器的基础,负责对象的创建、管理和依赖注入。 2. 使用Spring框架的好处是什么? - 依赖注入(DI)让依赖关系清晰,便于理解和维护。 - Spring轻...
Spring框架的核心组件包括IoC容器、AOP模块、数据访问/集成层、Web层以及众多的扩展模块。以下是对Spring常用包的详细解析: 1. **spring-core**:这是Spring框架的基础,包含了核心工具类和资源处理。其中,...
Spring的IoC容器是实现DI的基础,它负责创建对象、管理对象的生命周期和对象之间的依赖关系。容器根据配置元数据(XML、注解或Java配置类)来管理对象实例及其依赖关系。 3. **面向切面编程(Aspect-Oriented ...
2. **IoC容器(控制反转Container)**:Spring的IoC容器是整个框架的中心,负责管理对象的生命周期和对象之间的关系。它通过读取XML配置文件或Java注解来创建和管理Bean。 3. **Bean的定义与实例化**:在XML配置文件...
1. **IoC容器**:Spring的核心是IoC(Inversion of Control)容器,它负责管理对象的生命周期和对象之间的依赖关系。通过XML或注解方式定义配置,容器根据这些配置创建并管理对象。 2. **AOP**:Spring的AOP模块...
1. **IoC容器**:Spring框架的核心是IoC容器,它负责创建对象、管理对象间的依赖关系以及控制对象的生命周期。容器通过XML配置文件或注解来读取对象定义。 2. **依赖注入**:DI是IoC的一种实现方式,允许对象在运行...
在整合CXF时,它帮助将Spring的IoC容器扩展到Web环境。 4. **spring-core-3.0.5.RELEASE.jar**:包含了Spring框架的基础类和核心工具,如类型转换系统、资源处理和表达式语言。 5. **spring-aop-3.0.5.RELEASE.jar...
最后一章简要展望了Spring 4.0版本的发展趋势和新特性。Spring框架一直在不断地发展和完善,以适应不断变化的技术需求。这一章为读者提供了关于未来版本的一些洞察,帮助他们了解Spring框架的演进方向。 通过上述...
2. **spring-beans**: 包含了Bean工厂,这是IoC容器的实现,负责创建、配置和管理应用对象。它支持XML和注解两种方式进行配置。 3. **spring-context**: 扩展了spring-beans,提供了更丰富的上下文支持,如事件发布...
IoC容器负责管理对象的生命周期和对象之间的关系,而依赖注入则是Spring的核心特性,它允许通过配置文件或注解来声明组件间的依赖关系。 2. **Spring Beans**:这个模块提供了定义、配置、初始化和管理对象的API。...
Spring的IoC容器管理和配置对象,使得程序更加解耦和易于维护。 **Mybatis框架**: Mybatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集。它允许开发者直接编写原生的SQL查询,将SQL与Java代码完全分离,...
`beans`包中的`BeanFactory`是Spring IoC容器的基础,它负责管理对象的生命周期和依赖关系。通过`BeanFactory`,开发者可以实现依赖注入,使得对象间的耦合度降低,提高代码的可测试性和可维护性。`...
以上简要介绍了Spring3.0中核心的IOC和DI概念,以及配置文件的解析和容器的实例化。Spring3.0还支持Java Persistence API (JPA),用于处理数据库持久化,以及懒加载(lazy-init)特性,这使得单例Bean可以在实际使用时...
这个Jar包包含了Spring框架的基础部分,是所有Spring应用的基础,提供了IoC容器的基础实现。它还包含了核心工具类,如BeanFactory,它是工厂模式的一种实现,也是Spring IoC容器的基础。 2. **spring-beans.jar** ...
- **IoC容器**:是Spring的核心,负责管理对象的生命周期和对象之间的依赖关系。 - **Bean**:在Spring中,一个Java对象被称为Bean,由IoC容器管理。Bean可以通过XML、注解或Java配置类进行定义。 - **AOP**:...