`

编程方式实现sping bean延迟初始化

阅读更多

在实际开发中, 碰到如下需求场景:
在线上需要spring容器管理的所有bean能在加载之后立即进行初始化, 而在单元测试的时候则希望根据需要使用的bean来进行初始化, 而测试和线上使用的是同一套配置, 开始我们决定在配置中通过import的方式, 在最外层中指定延迟初始化为false, 比如这样:

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-lazy-init="true">
    <import resource="classpath*:spring-config.xml"/>
    <import resource="classpath*:spring-jdbc.xml"/>
    <import resource="classpath*:spring-mock.xml"/>
    <import resource="./../../../..//spring-sharding.xml"/>
    <import resource="./../../../..//spring-sqlmap-client.xml"/>
    <import resource="./../../../..//spring-tx.xml"/>
</beans>

 结果失败了:(, 原因是最外层的dafault-lazy-init设置对import的bean配置无效.
后来经过查看bean factory初始化的源代码, 终于找到了解决办法, 可以通过编程方式来实现在测试的时候延迟初始化所有的bean, 做法如下:

            ctx = new FileSystemXmlApplicationContext(locations.toArray(a)) {
                @Override
                protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
                    reader.setEventListener(new EmptyReaderEventListener() {
                        
                        @Override
                        public void defaultsRegistered(DefaultsDefinition defaultsDefinition) {
                            ((DocumentDefaultsDefinition) defaultsDefinition).setLazyInit("true");
                        }
                    });
                    super.loadBeanDefinitions(reader);
                }
            };
 

 

分享到:
评论
2 楼 elicer 2011-11-13  
这是一种侵入性的改法,如果这样的code太多,你在spring 升级时就会知道有多么痛苦了。
1 楼 ssuupv 2010-11-10  
修改spring源代码

相关推荐

    Sping学习笔记(2)----实例化Bean的三种方式

    这篇“Spring学习笔记(2)----实例化Bean的三种方式”着重讲解了如何在Spring应用上下文中初始化Bean。以下是这三种方式的详细说明: 1. **XML配置方式** 在早期的Spring版本中,XML配置是最常见的实例化Bean的...

    SpingIOC注入实例化bean

    在传统的编程模式中,开发者需要手动创建和管理对象,而在Spring IOC中,这个过程被反转,由Spring容器负责对象的创建、初始化、装配以及管理,开发者只需声明对象间的依赖,无需关心具体的实例化过程。 1. **Bean...

    sping代码sping代码

    Spring提供了各种生命周期回调方法,如`@PostConstruct`和`@PreDestroy`注解,以及InitializingBean和DisposableBean接口,供开发者自定义Bean的初始化和销毁逻辑。 3. **AOP(面向切面编程)**:Spring的AOP模块...

    sping的架包

    2. **Bean的定义与管理**:Bean在Spring中是可配置的,可以设置属性值、构造函数参数、初始化方法等。可以通过`@Component`、`@Service`、`@Repository`和`@Controller`等注解来声明bean,或者使用XML配置文件。 3....

    sping相关学习总结

    - `lazy-init`属性可将Bean的初始化延迟到第一次调用`getBean`时进行。 - `init-method`和`destroy-method`属性分别指定初始化和销毁方法,对于`singleton`作用域的Bean,销毁方法会在容器关闭时调用。 4. **IOC...

    sping面向切面编程简单示例

    sping面向切面编程简单示例,希望给予初学者帮助

    Sping翻转控制器

    - **定义**:由Spring IoC容器初始化、装配及管理的对象称为Bean。 - **特点**:除了被Spring容器管理外,Bean没有特别之处,与其他对象无异。 - **依赖管理**:Bean之间的依赖关系通过配置元数据来描述。 ##### ...

    详解SpringBoot程序启动时执行初始化代码

    SpringBoot程序启动时...我们可以使用ApplicationListener接口、CommandLineRunner接口和EnvironmentAware接口来实现初始化代码,并在SpringBootApplication中注册我们刚创建的类,以便在程序启动时执行初始化代码。

    Sping定时器的使用

    1. **基于注解的定时任务 (@Scheduled)**:这是最常用的定时任务实现方式,只需要在方法上添加`@Scheduled`注解,并配置相应的调度参数,如cron表达式或固定延迟。例如: ```java import org.springframework....

    sping配置jar包

    这个 jar 包包含了 Bean 定义、配置元数据解析以及 Bean 工厂的实现。它支持 XML 和注解方式的配置,使得对象的创建和管理变得简单。 2. **spring-context-2.5.6.jar**:Spring 上下文模块提供了一个更高级别的应用...

    谈谈我对Spring Bean 生命周期的理解

    Spring Bean 生命周期是指 Spring 容器中 Bean 的创建、初始化、销毁等整个生命周期的过程。掌握 Spring Bean 生命周期可以帮助我们更好地理解 Spring 框架的工作机制。 二、 生命週期圖 下面是一个 Spring Bean ...

    spingAOP注解方式

    Spring AOP注解方式是Spring框架提供的一种面向切面编程的实现方式,它允许开发者在不修改原有业务代码的情况下,插入额外的功能,如日志记录、性能监控、安全控制、事务管理和异常处理等。这种方式极大地简化了代码...

    sping applicationcontext中的一些例子demo

    在Spring框架中,`ApplicationContext`是核心容器的重要接口,它负责管理Bean...通过这些示例代码,我们可以深入理解Spring容器如何加载和管理Bean,以及如何通过编程方式与容器交互,进一步提升我们的Spring开发能力。

    sping的jar包

    Bean工厂负责创建、配置和管理对象(即Bean),而ApplicationContext则提供了更高级别的服务,如国际化、事件传播和资源加载。XML配置和基于注解的配置都是Spring中定义Bean的方式。 2. **依赖注入(Dependency ...

    Sping视频2 Sping视频2Sping视频2Sping视频2

    Sping视频2Sping视频2Sping视频2Sping视频2Sping视频2Sping视频2Sping视频2Sping视频2Sping视频2Sping视频2Sping视频2Sping视频2Sping视频2Sping视频2

    Sping最新资源包

    在Spring框架中,核心模块包括IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented Programming,面向切面编程)。IoC容器是Spring的核心,它负责管理对象的生命周期和依赖关系。通过XML配置或者基于...

    Spring5.0中文开发手册

    - BeanPostProcessor接口允许开发者在bean初始化前后执行自定义操作。 - **3.8.2 使用BeanFactoryPostProcessor定制配置元数据** - 可以修改Spring容器中的bean定义。 - **3.8.3 使用FactoryBean定制实例化逻辑*...

    Sping框架的参考资料

    开发者可以通过XML、注解或Java配置类定义Bean的实例化、初始化、装配和销毁过程。 Spring框架提供了多种模块,包括Spring Core、Spring MVC、Spring AOP、Spring JDBC、Spring ORM等。Spring Core是整个框架的基础...

    Sping的jar包

    Spring框架是Java开发中不可或缺的一部分,它以其模块化、易用性和灵活性著称。这个"Spring的jar包"包含了Spring框架的核心组件以及两个重要的日志库:commons-logging-1.2和log4j-1.2.17。下面我们将深入探讨这些...

    sping技术内幕

    IoC容器通过XML或注解配置来读取bean定义,创建并初始化bean实例。在处理bean的依赖时,Spring支持构造器注入、setter注入以及基于注解的注入。 在Spring Boot中,自动配置(Auto Configuration)和起步依赖...

Global site tag (gtag.js) - Google Analytics