Spring Bean 生命周期示意图:

了解Spring的生命周期非常重要,我们可以利用Spring机制来定制Bean的实例化过程。

---------------------------------------------------------------------------------------------------------------------------------------------------

spring-service.xml:

<?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.xsd">
<!-- 定义一个bean -->
     <bean id="narCodeService" class="com.test.service.impl.NarCodeServiceImpl">
     </bean>
   
    <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
 
    <bean id="beanLifecycle" class="com.test.spring.BeanLifecycle" init-method="init" destroy-method="close">
        <property name="name" value="张三"></property>
        <property name="sex" value="男"></property>
    </bean>
    
    <bean id="postProcessor" class="com.test.spring.PostProcessor"/>
</beans>

Service Class:

package com.test.spring;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.annotation.ImportAware;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.type.AnnotationMetadata; import com.sun.org.apache.xml.internal.security.Init; /**
* 测试Spring Bean的生命周期
* @author zss
*
*/
public class BeanLifecycle implements InitializingBean,DisposableBean
,BeanFactoryAware,BeanNameAware,ApplicationContextAware{
private String name;
private String sex; public String getName() {
return name;
} public void setName(String name) {
System.out.println("》》》调用BeanLifecycle对象"+this.getName()+"属性set方法,设值为:"+name);
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
System.out.println("》》》调用BeanLifecycle对象"+this.getSex()+"属性set方法,设值为:"+sex);
this.sex = sex;
}
/**
* 依次开始调用初始化回调方法
*/
@PostConstruct
public void initPostConstruct(){
System.out.println("》》》注解初始化方法被调用");
} @Override
public void afterPropertiesSet() throws Exception {
System.out.println("》》》BeanLifecycle调用了InitailizingBean的afterPorpertiesSet方法了.....");
} public void init (){
System.out.println("》》》init方法被调用");
} /**
* 依次开始调用销毁回调方法
*/ @PreDestroy
public void preDestroy(){
System.out.println("》》》注解销毁方法被调用");
} @Override
public void destroy() throws Exception {
System.out.println("》》》BeanLifecycle从Spring IoC容器中移除了.......");
}
public void close() {
System.out.println("》》》close方法被调用");
} @Override
public void setApplicationContext(ApplicationContext paramApplicationContext)
throws BeansException {
System.out.print("》》》调用ApplicationContextAware接口setApplicationContext方法:");
System.out.println(paramApplicationContext); } // @Override
// public void setResourceLoader(ResourceLoader paramResourceLoader) {
// System.out.print("》》》调用ResourceLoaderAware接口setResourceLoader方法:");
// System.out.println(paramResourceLoader);
// } // @Override
// public void setImportMetadata(AnnotationMetadata paramAnnotationMetadata) {
// System.out.println(333333);
// } // @Override
// public void setEnvironment(Environment paramEnvironment) {
// System.out.print("》》》调用EnvironmentAware接口setEnvironment方法:");
// System.out.println(paramEnvironment);
// } @Override
public void setBeanName(String paramString) {
System.out.println("》》》调用BeanNameAware接口setBenaName方法: "+paramString); } @Override
public void setBeanFactory(BeanFactory paramBeanFactory)
throws BeansException { System.out.print("》》》调用BeanFactoryAware接口setBeanFactory方法:");
System.out.println(paramBeanFactory); } // @Override
// public void setBeanClassLoader(ClassLoader paramClassLoader) {
// System.out.print("》》》调用BeanClassLoaderAware接口setBeanClassLoader方法:");
// System.out.println(paramClassLoader);
// } // @Override
// public void setApplicationEventPublisher(
// ApplicationEventPublisher paramApplicationEventPublisher) {
// System.out.print("》》》调用ApplicationEventPublisherAware接口setApplicationEventPublisher方法:");
// System.out.println(paramApplicationEventPublisher);
// } @Override
public String toString() {
return "BeanLifecycle [name=" + name + ", sex=" + sex + "]";
} }

Test:

package com.test.spring;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class T {
ClassPathXmlApplicationContext applicationcontext=null;
@Before
public void before() {
System.out.println("》》》Spring ApplicationContext容器开始初始化了......");
applicationcontext= new ClassPathXmlApplicationContext(new String[]{"test1-service.xml"});
System.out.println("》》》Spring ApplicationContext容器初始化完毕了......");
}
@Test
public void test() {
BeanLifecycle beanLifecycle =applicationcontext.getBean("beanLifecycle",BeanLifecycle.class);
//applicationcontext.close();
applicationcontext.registerShutdownHook();
}
}

测试结果:

》》》Spring ApplicationContext容器开始初始化了......
2017-03-19 00:08:01  INFO:ClassPathXmlApplicationContext-Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6c7e6b26: startup date [Sun Mar 19 00:08:01 CST 2017]; root of context hierarchy
2017-03-19 00:08:01  INFO:XmlBeanDefinitionReader-Loading XML bean definitions from class path resource [test1-service.xml]
》》》调用BeanLifecycle对象null属性set方法,设值为:张三
》》》调用BeanLifecycle对象null属性set方法,设值为:男
》》》调用BeanNameAware接口setBenaName方法: beanLifecycle
》》》调用BeanFactoryAware接口setBeanFactory方法:org.springframework.beans.factory.support.DefaultListableBeanFactory@75a6bd5: defining beans [narCodeService,org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#0,beanLifecycle,postProcessor]; root of factory hierarchy
》》》调用ApplicationContextAware接口setApplicationContext方法:org.springframework.context.support.ClassPathXmlApplicationContext@6c7e6b26: startup date [Sun Mar 19 00:08:01 CST 2017]; root of context hierarchy
后置处理器处理bean=【beanLifecycle】开始
》》》注解初始化方法被调用
BeanLifecycle [name=张三, sex=男]
》》》BeanLifecycle调用了InitailizingBean的afterPorpertiesSet方法了.....
BeanLifecycle [name=张三, sex=男]
》》》init方法被调用
后置处理器处理bean=【beanLifecycle】完毕!
》》》Spring ApplicationContext容器初始化完毕了......
2017-03-19 00:08:03  INFO:ClassPathXmlApplicationContext-Closing org.springframework.context.support.ClassPathXmlApplicationContext@6c7e6b26: startup date [Sun Mar 19 00:08:01 CST 2017]; root of context hierarchy
》》》注解销毁方法被调用
》》》BeanLifecycle从Spring IoC容器中移除了.......
》》》close方法被调用

关于Spring BeanPostProcessor(后置处理器)讲解请查看:http://www.cnblogs.com/sishang/p/6576665.html

Spring点滴四:Spring Bean生命周期的更多相关文章

  1. Spring(四)之Bean生命周期、BeanPost处理

    一.Bean 生命周期 Spring bean的生命周期很容易理解.当bean被实例化时,可能需要执行一些初始化以使其进入可用状态.类似地,当不再需要bean并从容器中移除bean时,可能需要进行一些 ...

  2. Spring源码系列 — Bean生命周期

    前言 上篇文章中介绍了Spring容器的扩展点,这个是在Bean的创建过程之前执行的逻辑.承接扩展点之后,就是Spring容器的另一个核心:Bean的生命周期过程.这个生命周期过程大致经历了一下的几个 ...

  3. Spring之BeanFactory及Bean生命周期

    1.spring通过BeanFactory灵活配置.管理bean,Spring对管理的bean没有任何特别的要求,完全支持对POJO的管理: 2.BeanFactory有个ApplicationCon ...

  4. Spring源码 21 Bean生命周期

    参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...

  5. Spring BeanFactory 初始化 和 Bean 生命周期

    (version:spring-context-4.3.15.RELEASE) AbstractApplicationContext#refresh() public void refresh() t ...

  6. Spring源码之Bean生命周期

    https://www.jianshu.com/p/1dec08d290c1 https://www.cnblogs.com/zrtqsk/p/3735273.html 总结 将class文件加载成B ...

  7. 【不懂】spring bean生命周期

    完整的生命周期(牢记): 1.spring容器准备 2.实例化bean 3.注入依赖关系 4.初始化bean 5.使用bean 6.销毁bean Bean的完整生命週期可以認為是從容器建立初始化Bea ...

  8. 金三银四,还在为spring源码发愁吗?bean生命周期,看了这篇就够了

    第一,这绝对是一个面试高频题. 比第一还重要的第二,这绝对是一个让人爱恨交加的面试题.为什么这么说?我觉得可以从三个方面来说: 先说会不会.看过源码的人,这个不难:没看过源码的人,无论是学.硬背.还是 ...

  9. spring(二、bean生命周期、用到的设计模式、常用注解)

    spring(二.bean生命周期.用到的设计模式.常用注解) Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的. ...

随机推荐

  1. Jmeter性能指标分析

    以下是下载了服务器监控插件的各个组件的功能介绍,有助于以后jmeter的性能测试 1.jp@gc - Actiive Threads Over Time:不同时间的活动用户数量展示(图表) 当前的时间 ...

  2. Float浮点数的使用和条件

    在这里简单的说一下,我对浮点数的理解,可能说的比较浅,老师也没有说,只是略微的提了一下,完全是我自己个人的理解. 我觉得float浮点数的用法和int的用法有些雷同,浮点数用于计算小数点单位,我们先可 ...

  3. php从入门到放弃系列-04.php页面间值传递和保持

    php从入门到放弃系列-04.php页面间值传递和保持 一.目录结构 二.两次页面间传递值 在两次页面之间传递少量数据,可以使用get提交,也可以使用post提交,二者的区别恕不赘述. 1.get提交 ...

  4. 【CentOS 7】scp示例

    1,从远端拷贝到本地 /tmp路径 root@raspberrypi:/download/api_weather# scp root@123.207.xxx.xxx:/xxx/* /tmp 2,从本地 ...

  5. 比较语义分割的几种结构:FCN,UNET,SegNet,PSPNet和Deeplab

    简介 语义分割:给图像的每个像素点标注类别.通常认为这个类别与邻近像素类别有关,同时也和这个像素点归属的整体类别有关.利用图像分类的网络结构,可以利用不同层次的特征向量来满足判定需求.现有算法的主要区 ...

  6. textarea拖拽控制

    一.用处 textarea默认时允许用户以拖拽形式来改变textarea大小,但textarea的大小变化会撑大其父节点,有时会破坏整体布局,有时我们并不希望textarea随意拖拽. forklif ...

  7. JQuery ajax请求struts action实现异步刷新的小实例

    这个样例是用JQuery ajax和struts来做的一个小样例,在这个样例中采用两种方式将java Util中的list转换成支json的格式,第一种是用json-lib.jar这个jar包来转换, ...

  8. 转载---VisualStudioCode通过SSH远程编辑文件

    最近需要长期修改远端服务器上的代码,调试.vim操作又不是很6,想到了远程操作的办法,找到一篇好用的bolg,记录一下. 原文链接:https://blog.csdn.net/qq_38401919/ ...

  9. Daily Scrum 11.18

    今日完成任务: 1.在提问问题的时候为问题创建索引 2.解决了修改个人资料后刷新没有更新的问题 3.初步加入了采纳功能(没完善UI设计) 遇到困难:创建索引之后,跳转到主页,需要重新登录,找了半天不知 ...

  10. Spring笔记⑤--整合hibernate代码测试

    String整合hibernate代码测试 在上节生成的表中插入数据:   注意:使用myeclipse2014生成的整合项目可能存在问题需要我们自己导入.   第一步 我们写dao接口 packag ...