Spring之bean的生命周期

本文内容纲要:Spring之bean生命周期" title="bean的生命周期">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的生命周期

原文链接:https://www.cnblogs.com/onsim/p/9039040.html

以上是 Spring之bean的生命周期 的全部内容, 来源链接: utcz.com/z/362454.html

回到顶部