`
yinghuayu1324117
  • 浏览: 70513 次
  • 性别: Icon_minigender_2
  • 来自: 保定
文章分类
社区版块
存档分类

Spring中bean的生命周期

阅读更多

Springbean的生命周期

一个Bean从创建到销毁如果是用BeanFactory来生成,管理Bean的话会经历几个执行阶段
 1
Bean的建立
         
BeanFactory读取Bean定义文件并生成各个Bean实例
  2
属性注入
         
执行相关的Bean属性依赖注入
  3
BeanNameAwaresetBeanName()
         
如果Bean类有实现org.springframework.beans.BeanNameAware接口则执行它的setBeanName()方法
  4
BeanFactoryAwaresetBeanFactory()
         
如果Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口则执行它的setBeanFactory()方法
  5
BeanPostProcessorsProcessBeforeInitialization()
         
如果任何的org.springframework.beans.factory.config.BeanPostProcessors实例与Bean实例相关。则执行BeanPostProcessors实例

         
processBeforeInitialization()方法
  6
initializingBeanafterPropertiesSet()
         
如果Bean类已实现org.springframework.beans.factory.InitializingBean接口,则执行他的afterProPertiesSet()方法
  7
Bean定义文件中定义init-method
         
可以在Bean定义文件中使用"init-method"属性设定方法名称例如:
          <bean id="helloBean" calss="onlyfun.caterpillar.HelloBean" init-method="initBean">
         
如果有以上设置的话,则执行到这个阶段,就会执行initBean()方法
  8
BeanPostProcessorsProcessaAfterInitialization()
         
如果有任何的BeanPostProcessors实例与Bean实例关联,则执行BeanPostProcessors实例的ProcessaAfterInitialization()方法

  9
DisposableBeandestroy()
         
在容器关闭时,如果Bean类有实现org.springframework.beans.factory.DisposableBean接口,则执行他的destroy()方法

  10
Bean定义文件中定义destroy-method
         
在容器关闭时,可以在Bean定义文件中使用"destroy-method"属性设定方法名称,例如:

          <bean id="helloBean" class="onlyfun.caterpillar.HelloBean" destroy-method="destroyBean">
         
如果有以上设定的话,则进行至这个阶段时,就会执行destroyBean()方法,如果是使用ApplicationContext来生成并管理Bean的话
         
则稍有不同,使用ApplicationContext来生成及管理Bean实例的话,在执行BeanFactoryAwaresetBeanFactory()阶段后,若Bean
         
类上有实现org.springframework.context.ApplicationContextAware接口,则执行其setApplicationContext()方法,接着才执行

          BeanPostProcessors
ProcessBeforeInitialization()及之后的流程

具体案例:

package cn.csdn.cyclelift;

public class TeacherService {
    private String name;
    private Integer age;

//1、5
    //name的set方法
    public void setName(String name) {
       System.out.println("========name的set方法");
       this.name = name;
    }

//2
    //含有age参数的构造器
    public TeacherService(Integer age) {
       System.out.println("---------含有age参数的构造器");
       this.age = age;
    }
//7
    public void init(){
    System.out.println("+++++++++++init方法");
}

//9
    public void display(){
    System.out.println(this.name+"@@@@@@@@@@"+this.age);
    }
}

  

 

 

package cn.csdn.cyclelift;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class StudentService implements BeanPostProcessor{
//在初始化bean之前执行的方法,在init之前执行,在set方法之后执行
@Override
public Object postProcessBeforeInitialization(Object arg0, String arg1)
           throws BeansException {
//3
    System.out.println("下面改变TeacherService中的属性值");
    //判断前者是否是后者的实例
    if(arg0 instanceof TeacherService){
//4
      System.out.println("$$$$$$$$$$$$$");
           //改变TeacherServpostProcessBeforeInitializationice中的name属性的值为yinghuayu
//5
           ((TeacherService)arg0).setName("yinghuayu");
       }
//6
       System.out.println("postProcessBeforeInitialization");
       return arg0;
    }
//8
    //初始化之后调用的方法
    @Override
    public Object postProcessAfterInitialization(Object arg0, String arg1)
          throws BeansException {
       System.out.println("postProcessAfterInitialization");
       return arg0;
    }
}

 

 

//junit测试

package cn.csdn.cyclelift;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;

 public class CycleTest {
    @Test
    public void test(){
//1、先解析xml文件,获取Spring容器
    ApplicationContext ac=new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
    TeacherService ts=(TeacherService)ac.getBean("teacherService");
//销毁
       ts.display();
       //关闭
       AbstractApplicationContext aac=(AbstractApplicationContext)ac;
       aac.close();
    }
}

  

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
        //2、
      <bean id="teacherService" class="cn.csdn.cyclelift.TeacherService" init-method="init">
          //2.2
             <property name="name">
                <value>kouxiaolin</value>
             </property>
//2.1
             <constructor-arg type="java.lang.Integer"  index="0">
               <value>22</value>
             </constructor-arg>
      </bean>
      <bean id="studentService" class="cn.csdn.cyclelift.StudentService">
</bean>
</beans>

 

注:上面标注了它的运行顺序

 

 

 

运行结果:

---------含有age参数的构造器

========nameset方法

下面改变TeacherService中的属性值

$$$$$$$$$$$$$

========nameset方法

postProcessBeforeInitialization

+++++++++++init方法

postProcessAfterInitialization

yinghuayu@@@@@@@@@@22

1
2
分享到:
评论

相关推荐

    spring bean的生命周期

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

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

    在整个生命周期中,Spring提供了多种方式来实现Bean的初始化,例如使用init-method参数、InitializingBean接口等。 二、Bean的作用域 Bean的作用域是指Bean的生命周期和可用性。Spring框架提供了多种作用域,例如 ...

    详解Spring中bean生命周期回调方法

    Spring 中 Bean 的生命周期回调方法是指在 Bean 的生命周期中, Spring 框架提供了多种方式来实现对 Bean 的生命周期的管理。这些回调方法可以在 Bean 的初始化、销毁等阶段被调用,从而实现对 Bean 的管理和资源的...

    Spring的bean生命周期

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

    spring bean的生命周期测试代码

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

    Spring bean生命周期demo

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

    SpringBean的生命周期.mdj

    SpringBean的生命周期.mdj

    Spring Bean生命周期.pdf

    Spring Bean生命周期中的扩展接口主要包括: - 容器级扩展接口 - InstantiationAwareBeanPostProcessor:这个接口允许在Bean实例化之前和之后以及属性赋值之后进行扩展。这使得它可以在Bean的生命周期中多个点进行...

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

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

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

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

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

    容器会在 Bean 的整个生命周期中执行不同的方法,包括实例化、设置属性、依赖注入、初始化、使用和销毁等阶段。 六、 小结 Spring Bean 生命周期是 Spring 框架中的一个核心概念,掌握 Spring Bean 生命周期可以...

    Spring Bean 的生命周期

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

    Spring Bean生命周期&BeanDefinitions1

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

    spring中bean的生命周期详解

    在Bean的生命周期中,还有一个非常重要的概念:Bean后置处理器。Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理。Bean后置处理器对IOC容器里的所有Bean实例逐一处理,而非单一实例。其典型应用是:...

    Spring 的 Bean 生命周期,11 张高清流程图及代码,深度解析.docx

    Spring 的 Bean 生命周期,11 张高清流程图及代码,深度解析

    Spring Bean 的生命周期.docx

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

    spring中service生命周期(xml/annotation)

    在Spring的IoC(Inversion of Control)容器中,Bean的生命周期管理是非常重要的一部分。通过合理地控制Service的生命周期,可以确保应用程序的稳定性和资源的有效利用。无论是XML配置还是注解方式,Spring都提供了...

    spring bean life cycle

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

    SpringBoot Bean的生命周期demo.zip

    一般情况下,我们只是关心如何正确地将Bean装配到容器中,并不关心Ioc容器是如何装配和销毁Bean的过程。但是恰恰有时候,我们需要自定义初始化或销毁Bean的过程,以满足一些“特殊的”需求。比如,数据源在关闭的...

Global site tag (gtag.js) - Google Analytics