SpringBean生命周期全解析

图解

SpringBoot Bean Lifecycle

代码示例:

MyTestBean

package com.james.example;

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;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Component
public class MyTestBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware,
        InitializingBean, DisposableBean {


    public MyTestBean() {
        System.out.println("MyTestBean construct...");
    }


    /**
     * PostConstruct
     */
    @PostConstruct
    public void postConstruct() {
        System.out.println("MyTestBean postConstruct...");
    }

    /**
     * preDestroy
     */
    @PreDestroy
    public void preDestroy() {
        System.out.println("MyTestBean preDestroy...");
    }

    /**
     * xml中或者@Bean中指定的initMethod
     */
    public void initMethod() {
        System.out.println("MyTestBean initMethod...");
    }

    /**
     * xml中或者@Bean中指定的destroyMethod
     */
    public void destroyMethod() {
        System.out.println("MyTestBean destroyMethod...");
    }

    /**
     * DisposableBean
     *
     * @throws Exception
     */
    @Override
    public void destroy() throws Exception {
        System.out.println("MyTestBean DisposableBean destroy...");
    }

    /**
     * InitializingBean
     *
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("MyTestBean InitializingBean afterPropertiesSet...");
    }

    /**
     * ApplicationContextAware
     *
     * @param applicationContext
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("MyTestBean ApplicationContext applicationContext..." + applicationContext);
    }

    /**
     * BeanNameAware
     *
     * @param beanName
     */
    @Override
    public void setBeanName(String beanName) {
        System.out.println("MyTestBean BeanNameAware setBeanName..." + beanName);
    }

    /**
     * BeanFactoryAware
     *
     * @param beanFactory
     * @throws BeansException
     */
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("MyTestBean BeanFactoryAware setBeanFactory..." + beanFactory);
    }
}

MyTestFactoryBean

package com.james.example;

import org.springframework.beans.factory.FactoryBean;


public class MyTestFactoryBean implements FactoryBean<MyTestFactoryBean> {


    /**
     * FactoryBean
     *
     * @return
     * @throws Exception
     */
    @Override
    public MyTestFactoryBean getObject() throws Exception {
        System.out.println("MyTestFactoryBean getObject...");
        return new MyTestFactoryBean();
    }

    /**
     * FactoryBean
     *
     * @return
     */
    @Override
    public Class<?> getObjectType() {
        return MyTestFactoryBean.class;
    }

    /**
     * FactoryBean
     *
     * @return
     */
    @Override
    public boolean isSingleton() {
        return true;
    }


}

MyTestBeanBeanPostProcessor

package com.james.example;

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

public class MyTestBeanBeanPostProcessor implements BeanPostProcessor {

    /**
     * BeanPostProcessor
     *
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof MyTestBean) {
            System.out.println("MyTestBean BeanPostProcessor postProcessBeforeInitialization...");
        }
        return bean;
    }

    /**
     * BeanPostProcessor
     *
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof MyTestBean) {
            System.out.println("MyTestBean BeanPostProcessor postProcessAfterInitialization...");
        }
        return bean;
    }

}

applicationContext.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd" default-lazy-init="false">
    <!-- 开启Spring的Annotation支持 -->
    <context:annotation-config/>
    <!-- 指定Spring Annotation的扫描包 -->
    <context:component-scan base-package="com.james.example"/>
    <bean id="myTestBean" class="com.james.example.MyTestBean" init-method="initMethod" destroy-method="destroyMethod"
          factory-bean="myTestFactoryBean">
    </bean>
    <bean id="myTestFactoryBean" class="com.james.example.MyTestFactoryBean"></bean>
    <bean id="myTestBeanBeanPostProcessor" class="com.james.example.MyTestBeanBeanPostProcessor"></bean>
</beans>

BeanLifecycleTest

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        Object myTestBean = context.getBean("myTestBean");
        System.out.println(myTestBean);
        /**
         * 调用此方法,为了观察bean的销毁
         */
        context.close();

输出结果

MyTestBean construct...
MyTestBean BeanNameAware setBeanName...myTestBean
MyTestBean BeanFactoryAware setBeanFactory...org.springframework.beans.factory.support.DefaultListableBeanFactory@23e028a9: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,myTestBean,myTestFactoryBean,myTestBeanBeanPostProcessor]; root of factory hierarchy
MyTestBean ApplicationContext applicationContext...org.springframework.context.support.ClassPathXmlApplicationContext@7106e68e
MyTestBean BeanPostProcessor postProcessBeforeInitialization...
MyTestBean postConstruct...
MyTestBean InitializingBean afterPropertiesSet...
MyTestBean initMethod...
MyTestBean BeanPostProcessor postProcessAfterInitialization...
com.james.example.MyTestBean@17695df3
MyTestBean preDestroy...
MyTestBean DisposableBean destroy...
MyTestBean destroyMethod...
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值