Spring之bean的生命周期
Posted onsim
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring之bean的生命周期相关的知识,希望对你有一定的参考价值。
这篇博文是spring生命周期的详解,目前限于作者自身的水平对于一些内容可能只知其然不知其所以然,所以博文中如果出现错误欢迎各位指出,同时我也会逐步提升自己的水平,争取能够多发布一些能让大家获益的博文。
活不多少,先贴代码。
1,类文件
person类用于演示bean生命周期的基础类。
package com.spring.beanlife.beans; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class Person implements BeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean { private String name; public Person(){ System.out.println("无参数构造器"); } public Person(String name){ System.out.println("有参数构造器"); name = this.name; } public String getName() { return name; } public void setName(String name) { System.out.println("setName(String name) method run!!!!!"); this.name = name; } public void sayHi() { System.out.println("hi " + name); } @Override /** *bean名称关注接口可以通过该方法获取到bean的id,xml中配置的bean的id */ public void setBeanName(String arg0) { System.out.println("bean---------> " + arg0); } @Override /** * bean工厂关注接口通过该方法可以获取到beanfactory */ public void setBeanFactory(BeanFactory arg0) throws BeansException { System.out.println(arg0); } @Override /** * ApplicationContext关注接口通过该方法可以获取到ApplicationContext */ public void setApplicationContext(ApplicationContext arg0) throws BeansException { System.out.println(arg0); } @Override /** * 调用afterPropertiesSet */ public void afterPropertiesSet() throws Exception { System.out.println("afterPropertiesSet"); } /** *@调用自定义的init方法 */ public void init(){ System.out.println("调用自定义的init方法"); } /** *@调用自定义的destory方法 */ public void destory(){ System.out.println("调用自定义的destory方法"); } }
MyBeanPostProcessor实现了BeanPostProcessor后置处理器的类
package com.spring.beanlife.beans; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException { System.out.println("后置处理器的after方法"); return arg0; } @Override public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException { System.out.println("后置处理器的before方法"); return arg0; } }
app测试生命周期的main函数方法
package com.spring.beanlife.test; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import com.spring.beanlife.beans.Person; public class App { public static void main(String[] args) { /*@通过核心容器的方式 * */ /*ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/spring/beanlife/beans.xml"); Person person = (Person) applicationContext.getBean("person"); person.sayHi();*/ BeanFactory factory = new XmlBeanFactory( new ClassPathResource("com/spring/beanlife/beans.xml")); Person person = (Person) factory.getBean("person"); person.sayHi(); } }
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" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <bean id="person" init-method="init" destroy-method="destory" class="com.spring.beanlife.beans.Person"> <property name="name" value="liukun" /> </bean> <bean id="myBeanPostProcessor" class="com.spring.beanlife.beans.MyBeanPostProcessor" /> </beans>
2,bean生命周期步骤(以AppliccationContext容器演示)
1,实例化(当我们的程序加载beans.xml文件),把我们的bean(前提是scope=singlton)实例化到内存
2,调用set方法设置属性
3,如果你实现了bean名字关注接口(BeanNameAware)则可以通过setBeanName获取id号
4,如果你实现了bean工厂关注接口(BeanFactoryAware)则可以通过setBeanFactory获取BeanFactory
5,如果你实现了ApplicationContextAware关注接口(ApplicationContextAware)则可以通过setApplicationContext获取ApplicationContext
6,如果bean和一个后置处理器关联(BeanPostProcessor),则会调用postProcessBeforeInitialization(Before)方法
7,如果你实现了InitializingBean关注接口(InitializingBean)则可以调用afterPropertiesSe
8,如果自定义了初始化方法则调用自定义的初始化方法(注自定义初始化方法在bean中通过init-method方法配置)
9,如果bean和一个后置处理器关联(BeanPostProcessor),则会调用postProcessAfterInitialization(After)方法
10,bean可以使用了
11,容器关闭
12,如果实现DisposableBean接口则可以调用其destory()方法,也可以定制自定义的销毁方法(注自定义初始化方法在bean中通过init-method方法配置)
ps:开发中常见操作步骤1>2>6>10>9>11
执行操作结果
利用BeanFactory操作执行的结果
结论:BeanFactory和ApplicationContext的生命周期不一样,BeanFactory生命周期较为简单,没有使用到后置处理器的相关功能,以及没有获取核心容器相关方法。
以上是关于Spring之bean的生命周期的主要内容,如果未能解决你的问题,请参考以下文章