`
hz_chenwenbiao
  • 浏览: 1007990 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

spring bean的生命周期(转)

阅读更多

分为定义,初始化,使用,消亡
写个例子测试一下:
第一步:建一个类User,代码如下:
java 代码
  1. package test.lyx;   
  2. publicclass User {   
  3.     private String userName;   
  4.     public String getUserName() {   
  5.         returnuserName;   
  6.     }   
  7.     publicvoid setUserName(String userName) {   
  8.         this.userName = userName;   
  9.     }   
  10. }   
第二步:将User注入.applicationContext.xml配置如下:
xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3. <beans>  
  4.         <bean id="user" class="test.lyx.User" abstract="false"  
  5.         singleton="true" lazy-init="default" autowire="byType"  
  6.         dependency-check="default">  
  7.         <property name="userName">  
  8.             <value>liuyuanxi</value>  
  9.         </property>  
  10.     </bean>  
  11. </beans>  
第三步:建一个类TestMain测试一下:
java 代码
  1. package test.lyx;   
  2. import org.springframework.context.ApplicationContext;   
  3. import org.springframework.context.support.FileSystemXmlApplicationContext;   
  4. publicclass TestMain {   
  5.     publicstaticvoid main(String[] args) {   
  6.     ApplicationContext context=new FileSystemXmlApplicationContext("test/lyx/applicationContext.xml");   
  7.         User user1=(User)context.getBean("user");   
  8.         System.out.println(user1.getUserName());   
  9.     }   
  10. }  
这样运行该类会打出liuyuanxi.那么这几步就是bean的定义和使用.
接下来我们在User类中加上两个方法:init clear,当然方法明任你起.
java 代码
  1. publicvoid init(){   
  2.        this.userName="zhangsan";   
  3.    }   
  4.    publicvoid clear(){   
  5.        this.userName=null;   
  6.    }   
然后将配置文件修改如下:
xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3. <beans>  
  4.         <bean id="user" class="test.lyx.User" abstract="false"  
  5.         singleton="true" lazy-init="default" autowire="byType"  
  6.         dependency-check="default" init-method="init" destroy-method="clear">  
  7.         <property name="userName">  
  8.             <value>liuyuanxi</value>  
  9.         </property>  
  10.     </bean>  
  11. </beans>  
这里面的红线部分就是修改的内容.如果init-method属性设置了方法,那么就会在bean初始化的时候被执行.而destroy-method在消毁之前执行.
第二种方法:(实现初始化,和消毁的两个接口)
可以不在配置文件中指定init-methoddestroy-method两个方法.
我们把User类修改一下:代码如下:
java 代码
  1. package test.lyx;   
  2. import org.springframework.beans.factory.InitializingBean;   
  3. import org.springframework.beans.factory.DisposableBean;   
  4. publicclass User implements InitializingBean,DisposableBean{   
  5.     private String userName;   
  6.     public String getUserName() {   
  7.         returnuserName;   
  8.     }   
  9.     publicvoid setUserName(String userName) {   
  10.         this.userName = userName;   
  11.     }   
  12.     publicvoid init(){   
  13.         this.userName="zhangsan";   
  14.     }   
  15.     publicvoid clear(){   
  16.         this.userName=null;   
  17.     }   
  18.     publicvoid afterPropertiesSet() throws Exception {   
  19.         this.userName="wangwu";// TODO Auto-generated method stub   
  20.     }   
  21.     
  22.     publicvoid destroy() throws Exception {   
  23.         this.userName=null;// TODO Auto-generated method stub   
  24.         }   
  25. }   
修改过后的类,就是在原来的基础上,实现两个接口InitializingBean,DisposableBean也就是初始化和消毁的接口,这里我们要把InitializingBean接口里的afterPropertiesSet方法给覆盖掉,也就是将初始化的东西写在这个方法以里面.同时也要把DisposableBean接口的destroy方法覆盖掉,
消毁的东西写在这个方法里.这样的话,就无需在配置文件中配置init-methoddestroy-method两个方法.
整个的过程就是bean的生命周期.

另转:
Spring中Bean的生命周期 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生
一个新的对象
使用Singleton模式产生单一实例,对单线程的程序说并不会有什么问题,但对于多线程的程序,就必须注意安全(Thread-safe)的议题,防止多个线程
同时存取共享资源所引发的数据不同步问题。
然而在spring中 可以设定每次从BeanFactory或ApplicationContext指定别名并取得Bean时都产生一个新的实例:例如:
<bean singleton="false">
在spring中,singleton属性默认是true,只有设定为false,则每次指定别名取得的Bean时都会产生一个新的实例
一个Bean从创建到销毁,如果是用BeanFactory来生成,管理Bean的话,会经历几个执行阶段:
    1:Bean的建立:
          有BeanFactory读取Bean定义文件,并生成各个Bean实例
    2:属性注入:
          执行相关的Bean属性依赖注入
    3:BeanNameAware的setBeanName():
          如果Bean类有实现org.springframework.beans.BeanNameAware接口,则执行它的setBeanName()方法
    4:BeanFactoryAware的setBeanFactory():
          如果Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口,则执行它的setBeanFactory()方法
    5:BeanPostProcessors的ProcessBeforeInitialization()
          如果任何的org.springframework.beans.factory.config.BeanPostProcessors实例与Bean实例相关。则执行BeanPostProcessors实例
          的processBeforeInitialization()方法
    6:initializingBean的afterPropertiesSet():
          如果Bean类已实现org.springframework.beans.factory.InitializingBean接口,则执行他的afterProPertiesSet()方法
    7:Bean定义文件中定义init-method:
          可以在Bean定义文件中使用"init-method"属性设定方法名称例如:
          <bean calss="onlyfun.caterpillar.HelloBean" init-method="initBean">
          如果有以上设置的话,则执行到这个阶段,就会执行initBean()方法
    8:BeanPostProcessors的ProcessaAfterInitialization()
          如果有任何的BeanPostProcessors实例与Bean实例关联,则执行BeanPostProcessors实例的ProcessaAfterInitialization()方法
    9:DisposableBean的destroy()
          在容器关闭时,如果Bean类有实现org.springframework.beans.factory.DisposableBean接口,则执行他的destroy()方法
    10:Bean定义文件中定义destroy-method
          在容器关闭时,可以在Bean定义文件中使用"destroy-method"属性设定方法名称,例如:
          <bean destroy-method="destroyBean">
          如果有以上设定的话,则进行至这个阶段时,就会执行destroyBean()方法,如果是使用ApplicationContext来生成并管理Bean的话
          则稍有不同,使用ApplicationContext来生成及管理Bean实例的话,在执行BeanFactoryAware的setBeanFactory()阶段后,若Bean
          类上有实现org.springframework.context.ApplicationContextAware接口,则执行其setApplicationContext()方法,接着才执行
          BeanPostProcessors的ProcessBeforeInitialization()及之后的流程 

分享到:
评论

相关推荐

    spring bean的生命周期

    - **XML配置**:在传统的Spring应用中,Bean的定义通常写在XML配置文件中,如`springbean-xml`中的配置。 - **注解配置**:使用`@Component`,`@Service`,`@Repository`和`@Controller`注解标记类,配合`@...

    Spring bean生命周期demo

    接下来,我们将深入探讨Spring Bean生命周期的各个阶段,并通过具体的示例来演示。 1. **配置阶段** 在Spring容器初始化时,它会读取配置文件(如XML或Java配置),解析Bean定义,包括其依赖关系、初始化方法、...

    Spring Bean生命周期.pdf

    其中,Spring Bean生命周期的管理是Spring框架的核心功能之一,它涉及Spring容器如何创建、配置以及销毁Bean的整个过程。理解Spring Bean的生命周期对于开发高效和可维护的Java应用至关重要。 Spring Bean生命周期...

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

    Spring Bean 生命周期是 Spring 框架中的一个核心概念,了解 Spring Bean 的生命周期对我们了解整个 Spring 框架会有很大的帮助。本文将详细介绍 Spring Bean 生命周期的概念、生命周期图、生命周期阶段、生命周期...

    详解Spring中Bean的生命周期和作用域及实现方式

    Spring中Bean的生命周期和作用域及实现方式 Spring是一个非常流行的Java应用程序框架,它提供了一个灵活的机制来管理Bean的生命周期和作用域。Bean的生命周期和作用域是Spring框架中两个非常重要的概念,它们决定了...

    spring bean的生命周期测试代码

    本资源提供了在Spring 4.2环境下关于Bean生命周期的测试代码,帮助我们深入理解这一关键概念。 首先,让我们了解Spring Bean的生命周期主要包含以下几个阶段: 1. **实例化**:Spring容器通过`Class`对象或`...

    SpringBean的生命周期.mdj

    SpringBean的生命周期.mdj

    Spring Bean生命周期&BeanDefinitions1

    Spring框架是Java应用开发中的一个核心组件,尤其在企业级应用中广泛使用。Spring通过其IoC(Inversion of Control,控制反转)容器管理Bean的生命周期,...理解Bean生命周期对于有效管理和优化Spring应用至关重要。

    Spring的bean生命周期

    Bean生命周期的理解对于优化应用性能和理解Spring内部工作原理至关重要。这里我们将深入探讨Spring的Bean生命周期、容器周期以及工厂周期。 首先,让我们从Bean生命周期开始。在Spring中,Bean的生命周期包括以下几...

    Spring Bean 的生命周期

    本篇将详细阐述Spring Bean生命周期的各个阶段,以及如何记忆和深入理解这一过程。 首先,Spring Bean的生命周期可以分为两个主要阶段:容器初始化阶段和容器销毁阶段。 在容器初始化阶段,Spring Bean会经历以下...

    spring bean life cycle

    在Spring框架中,Bean生命周期是核心概念之一,它涉及到Bean的创建、初始化、使用和销毁等阶段。了解和掌握Bean生命周期对于开发高质量的Spring应用至关重要。以下是对Spring Bean生命周期的详细解析。 首先,Bean...

    Spring中Bean的生命周期 applicationcontext的应用(实现国际化,事件的传递)

    在Spring框架中,Bean的生命周期管理和ApplicationContext的应用是两个核心概念,它们对于理解Spring如何管理和协调应用中的对象至关重要。本文将深入探讨这两个主题,并结合国际化(i18n)和事件传递来阐述它们在...

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

    在Spring框架中,Spring Bean的生命周期始于其创建过程,即"我从哪里来?"的问题。首先,要明确几个核心概念:Java Bean、Spring Bean和Spring IoC(控制反转)容器。Java Bean是一种遵循特定规范的Java类,而Spring...

    Spring框架中Bean的生命周期 Spring中Bean有几种作用域

    Spring中的Bean生命周期主要分为两个阶段:容器管理阶段和用户自定义阶段。在容器管理阶段,Spring容器负责Bean的实例化、属性注入、初始化、使用和销毁。而在用户自定义阶段,开发者可以通过定义回调方法或使用特定...

    Spring Bean 的生命周期.docx

    这两个后处理器接口提供了灵活的扩展点,允许开发者在Bean生命周期的关键点进行自定义操作。 ApplicationContext是BeanFactory的升级版,提供了更丰富的功能,包括事件发布、国际化等。在ApplicationContext中,...

    Spring Bean的生命周期详细介绍

    下面以一个简单的Person类为例,展示Spring Bean生命周期的各个阶段: ```java public class Person implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean { // 省略属性和构造器 @...

    SpringBean生命周期详解版

    在Spring框架中,在IOC容器中管理的Bean分为单例和原型两种,单例Bean在容器启动时就实例化,原型Bean则是每次从容器中请求时才会实例化。

    spring bean XML配置入门

    一旦XML配置加载到Spring容器中,容器将根据配置创建Bean实例,并按照定义进行初始化、依赖注入,最后完成Bean的生命周期管理。 10. **实践操作**: 在实际开发中,我们可以使用Eclipse的Spring插件来简化Bean...

    Spring Bean重复执行两次(实例被构造两次)问题分析

    解决这个问题的关键在于深入理解Spring的Bean生命周期和配置机制,检查配置文件、注解使用、依赖关系等,确保每个Bean的定义都是唯一的,且作用域设置正确。同时,对源码进行调试也是一个有效的排查手段,可以追踪到...

Global site tag (gtag.js) - Google Analytics