`

spring 延迟加载与 init-method,afterPropertiesSet和BeanPostProcessor

    博客分类:
  • SSIH
 
阅读更多
ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化。提前实例化意味着作为初始化过程的一部分,ApplicationContext实例会创建并配置所有的singleton bean。通常情况下这是件好事,因为这样在配置中的任何错误就会即刻被发现(否则的话可能要花几个小时甚至几天)。

有时候这种默认处理可能并不是你想要的。如果你不想让一个singleton bean在ApplicationContext实现在初始化时被提前实例化,那么可以将bean设置为延迟实例化。一个延迟初始化bean将告诉IoC 容器是在启动时还是在第一次被用到时实例化。

在XML配置文件中,延迟初始化将通过<bean/>元素中的lazy-init属性来进行控制。例如:

<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true">
    <!-- various properties here... -->
</bean>
  <bean name="not.lazy" class="com.foo.AnotherBean">
    <!-- various properties here... -->
</bean>当ApplicationContext实现加载上述配置时,设置为lazy的bean将不会在ApplicationContext启动时提前被实例化,而not.lazy却会被提前实例化。

需要说明的是,如果一个bean被设置为延迟初始化,而另一个非延迟初始化的singleton bean依赖于它,那么当ApplicationContext提前实例化singleton bean时,它必须也确保所有上述singleton 依赖bean也被预先初始化,当然也包括设置为延迟实例化的bean。因此,如果Ioc容器在启动的时候创建了那些设置为延迟实例化的bean的实例,你也不要觉得奇怪,因为那些延迟初始化的bean可能在配置的某个地方被注入到了一个非延迟初始化singleton bean里面。


在容器层次中通过在<beans/>元素上使用'default-lazy-init'属性来控制延迟初始化也是可能的。如下面的配置:

<beans default-lazy-init="true">
    <!-- no beans will be eagerly pre-instantiated... -->
</beans>


1、init-method方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。init-method需要在applicationContext.xml配置文档中bean的定义里头写明。例如:

    这样,当TestBean在初始化的时候会执行TestBean中定义的init方法。

    2、afterPropertiesSet方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。afterPropertiesSet 必须实现 InitializingBean接口。实现 InitializingBean接口必须实现afterPropertiesSet方法。

    3、BeanPostProcessor,针对所有Spring上下文中所有的bean,可以在配置文档applicationContext.xml中配置一个BeanPostProcessor,然后对所有的bean进行一个初始化之前和之后的代理。BeanPostProcessor接口中有两个方法: postProcessBeforeInitialization和postProcessAfterInitialization。 postProcessBeforeInitialization方法在bean初始化之前执行, postProcessAfterInitialization方法在bean初始化之后执行。

    总之,afterPropertiesSet 和init-method之间的执行顺序是afterPropertiesSet 先执行,init-method 后执行。从BeanPostProcessor的作用,可以看出最先执行的是postProcessBeforeInitialization,然后是afterPropertiesSet,然后是init-method,然后是postProcessAfterInitialization。

some  mark from http://mojianpo.iteye.com/blog/803707
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    架构师面试题系列之Spring面试专题及答案(41题).docx

    Spring 框架生命周期和 Bean 实例化过程 Spring 框架是一个非常流行的 Java Web 应用...同时,init-method 和 destroy-method 属性、BeanPostProcessor 接口也是非常重要的概念,它们可以用来动态扩展和修改 Bean。

    Spring.pdf

    前者是Spring提供的用于Bean定义加载和处理的类,后者则是支持自动装配功能的BeanFactory的默认实现,这个类实现了Spring框架核心的Bean生命周期方法。 在实际开发过程中,了解和掌握Bean的生命周期有助于我们更好...

    Spring Bean 加载顺序 .

    如果Bean定义了初始化回调方法,如`init-method`属性指定的方法,Spring会在初始化后执行这个方法。 9. **Bean的销毁**: 对于Singleton Bean,Spring在容器关闭时会调用`@PreDestroy`注解的方法和实现...

    spring相关面试题.docx

    BeanFactory是Spring的基本容器,采用延迟加载策略,只有在调用`getBean`方法时才会初始化Bean。而ApplicationContext不仅包含了BeanFactory的所有功能,还支持国际化、事件广播、资源加载等功能,并且在启动时就...

    Spring Bean 生命周期之“我从哪里来?”.docx

    例如,我们可以创建一个`ApplicationContext`实例,如`ClassPathXmlApplicationContext`,并传入包含配置信息的XML文件路径,如`"spring.xml"`和`"spring1.xml"`,来启动容器并加载Bean的定义。 Spring提供了多种...

    spring容器初始化bean和销毁bean之前进行一些操作的方法

    此外,Spring提供了BeanPostProcessor接口,允许我们在Bean初始化前后进行自定义处理。通过实现`postProcessBeforeInitialization()`和`postProcessAfterInitialization()`方法,可以在Bean实例化和初始化之后进行...

    Spring bean 加载执行顺序实例解析

    Spring bean 加载执行顺序实例解析 在 Spring 框架中,Bean 的加载和执行顺序是一个非常重要的...通过这个示例,我们可以看到 Spring Bean 的加载和执行顺序,并了解了 InitializingBean 和 init-method 的使用方法。

    spring bean life cycle

    3. **初始化**:在属性注入完成后,Spring会执行Bean实现的初始化回调方法,这些方法可以通过实现`InitializingBean`接口的`afterPropertiesSet()`方法或者使用`init-method`属性来指定。此外,还可以通过配置`@...

    bean的生命周期1

    Spring允许我们为Bean定义初始化方法(init-method)和销毁方法(destroy-method)。在Bean实例化后,Spring会调用指定的初始化方法进行进一步的配置或准备。同样,在容器关闭前,如果Bean声明了销毁方法,Spring会...

    Spring Bean生命周期.pdf

    在Spring 3.0之前,初始化主要通过实现InitializingBean接口的afterPropertiesSet方法或在XML配置文件中指定init-method属性来完成。从Spring 3.0开始,推荐使用Java配置类中的@Bean注解来指定初始化方法。 4. 销毁...

    Spring笔记(第三次)1

    使用注解的方式,可以在配置类中通过`@Bean(initMethod="init", destroyMethod="destroy")`来指定。对于单例bean,Spring会在容器关闭时调用销毁方法;而对于多例bean,Spring只负责初始化,不管理其销毁。 其次,...

    6.1、框架—Spring(14题)1

    - 或者,如果在配置中指定了 `init-method`,Spring 也会调用相应的自定义初始化方法。 - `BeanPostProcessor` 的 `postProcessAfterInitialization` 方法在 Bean 初始化之后运行,进一步增强 Bean。 - **Bean ...

    Spring Bean生命周期&BeanDefinitions1

    Spring的BeanDefinition是用来存储Bean的配置信息,包括Bean的类名、作用域、属性值、依赖的其他Bean、是否为单例、是否延迟加载等。这些信息在容器启动时解析并转化为BeanDefinition对象,后续的Bean实例化和管理都...

    Spring系列面试题129道(附答案解析)

    而ApplicationContext是BeanFactory的子接口,除了继承BeanFactory的所有功能外,还提供了一些企业级的支持,例如消息源、资源加载和国际化支持。 16、SpringIoC的实现机制。 Spring IoC容器通过依赖注入模式实现了...

    Spring注解驱动开发.pdf

    - `@Bean`中的`initMethod`属性:指定初始化方法。 - **销毁**: - `DisposableBean`接口:实现该接口的类会在bean销毁前调用`destroy()`方法。 - `@PreDestroy`:用于标记在销毁前执行的方法。 - `@Bean`中的`...

    day38 09-Spring类的完整生命周期及后处理Bean

    Bean可以通过实现InitializingBean接口并覆盖`afterPropertiesSet()`方法,或者定义一个`init-method`属性指定初始化方法。此外,如果Bean实现了ApplicationContextAware接口,Spring会在初始化时注入...

    Spring管理的Bean的生命周期

    2. **BeanPostProcessor接口**:实现这个接口的类可以定义两个方法`postProcessBeforeInitialization()`和`postProcessAfterInitialization()`,分别在Bean初始化前和后进行处理。 3. **@PostConstruct注解**:在...

    深入解析Spring IoC:源码与实践指南

    此外,还可以通过实现`InitializingBean`接口的`afterPropertiesSet()`方法或指定`init-method`属性来定义初始化方法。 在示例中,`Car`类被标记为`@Component`,因此Spring会自动管理和初始化这个Bean。`@...

    Spring Bean Lifecycle Control

    此外,如果Bean实现了`InitializingBean`接口,Spring会调用`afterPropertiesSet()`方法。另外,还可以通过`init-method`属性指定一个非注解的方法作为初始化方法。 2. **依赖注入**:Spring会根据Bean定义中的属性...

Global site tag (gtag.js) - Google Analytics