`

Spring知识整理(六)—— IoC容器扩展(上)

阅读更多

在了解了BeanFactoryApplication这两个IoC容器之后,我们从整体上对IoC容器进行一下总结。首先SpringIoC容器可以分为两个部分,其核心是IoC Service Provider,用于提供基本的IoC支持。此外还有一些其它的功能,包括线程管理、对象生命周期管理、企业服务集成和AOP支持等等。

 

IoC Service Provider

先来看下IoC Service Provider,它的主要功能就是对象的构建管理和依赖绑定。IoC Service Provider是一个抽象概念,它可以指任何将IoC中的业务对象绑定到一起的实现方式。IoC Service Provider需要依赖如配置文件、注解或者直接编码的方式来完成依赖管理。

 

IoC Service Provider只是一个概念,如果想了解依赖绑定究竟是怎么完成的,可以去看下DefaultListableBeanFactory类中的getBean方法的原码,这里就不多说了。

 

Bean scope

对于Bean来说,也有scope的概念。对于简单的应用,Spring提供了两种beanscopesingleton(单例)和prototype(原型)。这两个scope都很好理解,单例就是多个调用共享一个对象,原型就是每次引用都重新声称新的对象。配置也十分简单,直接在bean标签中加入scope="prototype/singleton"属性即可。对于Web应用,Spring2.0开始新加入了三个scoperequestsessionglobal session,这个放到以后再说。

 

IoC容器功能实现过程

SpringIoC容器实现构建管理和依赖绑定功能的过程,可以划分为两个阶段,即容器启动阶段和Bean实例化阶段:

 

在容器的启动阶段,加载配置、分析配置信息和装配都是容器内部已经规划好的,也就是说这部分代码我们只能拿过来用。分析好的配置信息会保存在BeanDefinition中,再注册到对应的BeanDefinitionRegistryDefaultListableBeanFactory实现的接口之一)以完成装配。

 

那么对于容器的启动,我们可以做一些自定义处理的就是后处理阶段了。Spring提供了BeanFactoryPostProcessor接口作为容器扩展机制。该机制允许我们在容器实例化对象之前,对BeanDefinition的信息做相应的修改。一个容器可以有多个BeanFactoryPostProcessor,它们的顺序由Ordered接口决定(多个BeanFactoryPostProcessor时必须实现Ordered接口)。

 

Spring提供了三种比较常用的BeanFactoryPostProcessor实现:

PropertyPlaceholderConfigurer:名字一目了然,可以在Spring配置文件中使用占位符(形式为${xxx.xxx})代替属性的值,这些值可以在properties文件中找到,方便维护和更新。

所要做的就是在代码中为BeanFactory装配:

 

// 声明将被后处理的BeanFactory实例
ConfigurableListableBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("..."));
// 声明要使用的BeanFactoryPostProcessor 
PropertyPlaceholderConfigurer propertyPostProcessor = new PropertyPlaceholderConfigurer();
propertyPostProcessor.setLocation(new ClassPathResource("..."));
// 执行后处理操作 
propertyPostProcessor.postPro 4cessBeanFactory(beanFactory);

 

 

或者在配置文件中指明(仅适用于ApplicationContext):

 

 

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
     <property name="locations">
           <list>
                <value>conf/jdbc.properties</value>
                <value>conf/mail.properties</value> 
           </list>
      </property>
</bean>

 

同时,PropertyPlaceholderConfigurer还会检查JavaSystem类中的Properties,可以通过setSystemPropertiesMode()或者setSystemPropertiesModeName()来控制是否加载或者覆盖System相应Properties的行为。PropertyPlaceholderConfigurer提供了SYSTEM_PROPERTIES_MODE_FALLBACKSYSTEM_PROPERTIES_MODE_NEVERSYSTEM_PROPERTIES_MODE_OVERRIDE三种模式,默认采用的是SYSTEM_PROPERTIES_ MODE_FALLBACK

 

PropertyOverrideConfigurer:相对于上面一种BeanFactoryPostProcessorPropertyOverrideConfigurer的做法就很难在Spring的配置文件中观察出来,因为只要你用了PropertyOverrideConfigurer,那么它只会根据其properties文件内容对属性进行覆盖,其properties文件内容的格式如下

beanName.propertyName=value

也就是说你在properties文件中配了某一个属性的值,那么在此之前,你无论是用写死的值还是占位符,最后的值都会被这个文件中对应的值覆盖掉。

 

CustomEditorConfigurer:这个BeanFactoryPostProcessor只是辅助性地将后期会用到的信息注册到容器,对BeanDefinition不会做任何变动。它是帮助传达一种转换规则,就是将XML中的字符串转换到对应类型的规则。当然Spring提供了一系列的PropertyEditor,用于转换String,大部分在于org.springframework.beans.propertyeditors包内,可自行参考。

 

我们可以自定义PropertyEditor,首先需要的是继承PropertyEditorSupport,复写setAsText方法,然后通过类似如下的代码通过CustomEditorConfigurer将自定义的PropertyEditor注册到容器:

 

XmlBeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource(…));

CustomEditorConfigurer ceConfigurer = new CustomEditorConfigurer();
Map customerEditors = new HashMap();
customerEditors.put(java.util.Date.class, new XXXPropertyEditor());
ceConfigurer.setCustomEditors(customerEditors);

ceConfigurer.postProcessBeanFactory(beanFactory);

 

当然,使用ApplicationContex时会自动识别BeanFactoryPostProcessor,所以只要在配置文件中定义对应的Bean即可。

  • 大小: 25.9 KB
分享到:
评论

相关推荐

    Spring的IoC容器初始化源码解析

    #### 一、Spring框架的核心——IoC容器 Spring框架是一个开源的轻量级Java开发框架,其核心功能是IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented Programming,面向切面编程),这些功能大大...

    Spring基础:IoC容器(1)

    在“Spring基础:IoC容器(1)”这个主题中,我们将深入探讨Spring的核心组件——IoC容器,以及它如何管理对象的生命周期和依赖关系。 IoC(Inversion of Control),也称为控制反转,是一种设计模式,它将对象的创建...

    Spring源码分析_Spring_IOC

    ### Spring源码分析_Spring_IOC:深入理解Spring的IOC容器机制 #### 基本概念与核心作用 在探讨Spring框架的核心组件之一——IOC(Inversion of Control,控制反转)容器之前,首先需要理解它在Spring框架中的角色...

    Spring——IOC(控制反转)与DI(依赖注入).docx

    控制反转是一种设计思想,它改变了传统的对象创建方式,将对象的创建和管理权从应用程序自身转移到一个外部的容器,比如Spring的IOC容器。在没有IOC的情况下,开发者需要在代码中直接创建对象并管理它们的依赖关系,...

    第四章 在Ioc容器中装配Bean

    综上所述,本章通过介绍IoC容器的概念、Bean的定义、依赖注入、作用域、生命周期管理以及自动装配等知识点,为开发者深入理解Spring框架如何管理和装配应用中的Bean提供了重要的理论基础,并且指导开发者如何在实际...

    Spring3.1.3 Ioc在Web容器中的建立

    综上所述,"Spring3.1.3 Ioc在Web容器中的建立"涵盖了Spring的核心特性之一——IoC,以及在Web环境下的具体配置和使用方法。这个过程涉及到Spring容器的初始化、bean的定义与依赖注入,以及Web应用的结构配置。通过...

    一个简单的IOC容器实现

    Spring的IOC容器在这一基础上进行了大量的扩展和优化,使得我们可以轻松地管理和组合复杂的系统组件。通过深入学习和实践,我们可以更好地利用Spring的IOC容器来构建更加健壮和灵活的软件系统。

    spring ioc

    标题 "Spring IOC" 描述了我们讨论的核心主题——Spring 框架中的依赖注入(Inversion of Control,简称 IOC)机制。Spring 是一个广泛应用的 Java 应用开发框架,其核心特性之一就是IOC,它极大地简化了软件组件...

    springioc和spring aop

    这样,对象不再负责创建和管理依赖,而是由IoC容器负责。Spring通过反射机制来实现这一过程,比如在上述的`TestIOC`例子中,Spring能够根据类名动态地创建对象,并通过setter方法注入属性值,实现了对象的实例化和...

    Spring.net二----初探IOC容器.rar源代码

    总的来说,Spring.NET的IOC容器提供了一种强大的方式来组织和管理.NET应用中的对象,使得代码更加模块化、易于测试和扩展。通过学习和实践,开发者能够充分利用这个框架来构建健壮的企业级应用程序。

    Spring开发指南——中文版

    - Spring框架的核心组件包括IoC容器、AOP、数据访问/集成、Web、工具类和模块化扩展。 2. **依赖注入(DI)** - DI是Spring框架的核心特性,它允许开发者将对象之间的依赖关系解耦,提高代码的灵活性和可测试性。...

    关于spring框架中的ioc的幽默解释.

    在Spring框架中,IoC容器是实现这一原则的关键组件。 ### IoC的核心思想 IoC的核心思想是将对象的创建和依赖关系的管理交由外部容器完成,而不是在对象内部进行。这与传统的编程方式相反,在传统方式中,对象自己...

    Java EE 框架整合开发⼊⻔到实战——Spring+Spring MVC+MyBatis(微课版)课后习题答案.pdf

    Spring通过BeanFactory接口和ApplicationContext接口实现IoC容器。BeanFactory提供了基础的IoC支持,而ApplicationContext是BeanFactory的子接口,为Spring应用提供配置服务,并且支持国际化和资源访问。 通过这...

    小读spring ioc源码(一)——整体介绍

    Spring的核心就是IOC容器,它负责管理应用程序中的对象,通过反转控制权,使得对象的创建和依赖关系的维护不再由代码直接操控,而是交由容器来处理。这种方式提高了代码的可测试性和可维护性。接下来,我们将围绕...

    Sping翻转控制器

    ### Sping翻转控制器知识点详解 #### 一、Spring IoC 容器概述 ...在实际项目开发中,合理选择和利用Spring的IoC容器可以帮助我们更好地管理应用程序中的对象及其依赖关系,提高代码的可维护性和可扩展性。

    Spring IOC:找对象的一次革命(1)

    Spring IoC提供了BeanFactory和ApplicationContext两种容器类型,其中BeanFactory是基础的IoC容器,而ApplicationContext则提供了更多高级功能,如资源加载、事件发布等。 Spring IoC的配置主要通过XML或注解的方式...

    Spring IoC简单示例-注解配置-Maven构建

    Spring IoC容器通过解析XML配置文件或使用注解来识别对象及其依赖关系,并在运行时自动装配这些对象,这就是依赖注入。 在Spring中,注解配置是取代传统XML配置的一种方式,它使得代码更加简洁、易读。例如,我们...

    spring 源码中文注释

    首先,我们来看看Spring的核心组件——IoC容器。IoC容器是Spring的核心,它负责管理对象的生命周期和对象之间的依赖关系。通过XML配置或基于注解的方式,我们可以告诉IoC容器如何创建和装配对象。在源码中,`...

    Spring的IoC实现案例

    在Spring框架中,IoC容器负责创建对象、管理它们之间的依赖关系,并在需要时注入这些依赖。 让我们开始分析“Priter”类。这个类代表了打印机,它可能有一个或多个方法用于执行打印操作。为了实现灵活性,我们不...

Global site tag (gtag.js) - Google Analytics