spring中bean的生命周期

bean的生命周期如图所示:

下面通过代码示例说明:

bean:

package com.beanlifecycle;

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.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class Person
        implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {

    private String name;

    public Person() {
        System.out.println("*********");
        System.out.println("调用构造方法");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + "]";
    }

    // BeanNameAware的接口方法
    @Override
    public void setBeanName(String name) {
        System.out.println("*********");
        System.out.println("BeanNameAware的接口方法setBeanName");
    }

    // BeanFactoryAware的接口方法
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("*********");
        System.out.println("BeanFactoryAware的接口方法setBeanFactory");
    }

    // ApplicationContextAware的接口方法
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("*********");
        System.out.println("ApplicationContextAware的接口方法setApplicationContext");
    }

    // InitializingBean的接口方法
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("*********");
        System.out.println("InitializingBean的接口方法afterPropertiesSet");
    }

    // 配置文件配置的init-method
    private void initMethod() {
        System.out.println("*********");
        System.out.println("配置文件配置的init-method");
    }

    // DisposableBean的接口方法
    @Override
    public void destroy() throws Exception {
        System.out.println("*********");
        System.out.println("DisposableBean的接口方法destroy");
    }

    // 配置文件配置的destroy-method
    private void destroyMethod() {
        System.out.println("*********");
        System.out.println("配置文件配置的destroy-method");
    }

}

CustomInstantiationAwareBeanPostProcessor:

package com.beanlifecycle;

import java.beans.PropertyDescriptor;

import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;

public class CustomInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {

    // 实例化bean之前调用此方法
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        System.out.println("*********");
        System.out.println("实例化bean之前调用此方法:postProcessBeforeInstantiation");
        return super.postProcessBeforeInstantiation(beanClass, beanName);
    }

    // 实例化bean之后调用此方法
    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        System.out.println("*********");
        System.out.println("实例化bean之后调用此方法:postProcessAfterInstantiation");
        return super.postProcessAfterInstantiation(bean, beanName);
    }

    // 设置某个属性值时调用
    @Override
    public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean,
            String beanName) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("*********");
        System.out.println("设置某个属性值时调用:postProcessPropertyValues:" + pvs);
        return super.postProcessPropertyValues(pvs, pds, bean, beanName);
    }

}

CustomBeanPostProcessor:

package com.beanlifecycle;

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

public class CustomBeanPostProcessor implements BeanPostProcessor {

    // 初始化bean之前调用此方法
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("*********");
        System.out.println("初始化bean之前调用此方法:postProcessBeforeInitialization");
        return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    }

    // 初始化bean之后调用此方法
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("*********");
        System.out.println("初始化bean之后调用此方法:postProcessAfterInitialization");
        return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    }

}

配置文件:

<?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"
    xsi:schemaLocation="
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-2.5.xsd  
     http://www.springframework.org/schema/beans
     https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean class="com.beanlifecycle.Person" scope="singleton"
        init-method="initMethod" destroy-method="destroyMethod">
        <property name="name" value="tim"></property>
    </bean>
    <bean class="com.beanlifecycle.CustomInstantiationAwareBeanPostProcessor"></bean>
    <bean class="com.beanlifecycle.CustomBeanPostProcessor"></bean>
</beans>

 

测试类:

package com.beanlifecycle;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.test.database.JdbcPooledService;
import com.test.database.JdbcService;
import com.test.database.mybatis.TestDao;
import com.test.properties.PropertiesDemo;

public class Main {

    public static void main(String[] args) throws BeansException, Exception {
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring-context-beanlifecycle.xml");
        context.getBean(Person.class);
        Thread.sleep(5000);
        context.close();

    }
}

测试结果:

*********
实例化bean之前调用此方法:postProcessBeforeInstantiation
*********
调用构造方法
*********
实例化bean之后调用此方法:postProcessAfterInstantiation
*********
设置某个属性值时调用:postProcessPropertyValues:PropertyValues: length=1; bean property 'name'
*********
BeanNameAware的接口方法setBeanName
*********
BeanFactoryAware的接口方法setBeanFactory
*********
ApplicationContextAware的接口方法setApplicationContext
*********
初始化bean之前调用此方法:postProcessBeforeInitialization
*********
InitializingBean的接口方法afterPropertiesSet
*********
配置文件配置的init-method
*********
初始化bean之后调用此方法:postProcessAfterInitialization
*********
DisposableBean的接口方法destroy
*********
配置文件配置的destroy-method

 

posted @ 2020-04-15 23:28  一首简单的歌  阅读(154)  评论(0编辑  收藏  举报