Spring的Bean的生命周期

参考资料

Spring Bean的生命周期(非常详细) https://www.cnblogs.com/zrtqsk/p/3735273.html
请别再问Spring Bean的生命周期了! https://www.jianshu.com/p/1dec08d290c1

正文

App.java

package com.example.demoorder;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        System.out.println("#现在开始初始化Spring容器");
        ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
        System.out.println("#Spring容器初始化成功");
        User user = context.getBean("user", User.class);
        System.out.println("#User业务逻辑调用");
        user.show();
        System.out.println("#现在开始关闭Spring容器!");
        context.close();
    }
}

User.java

package com.example.demoorder;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.support.BeanDefinitionReader;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * xxxAware类型的接口的作用就是让我们能够拿到Spring容器中的一些资源。
 */
@Component
public class User implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean {
    @Value("${name:wm}")
    private String name;
    @Value("${address:beijing}")
    private String address;

    public String getName() {
        System.out.println("#User getName()");
        return name;
    }

    public void setName(String name) {
        System.out.println("#User setName()注入属性");
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        System.out.println("#User setAddress()注入属性");
        this.address = address;
    }

    public void show() {
        System.out.println("#User{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}');
    }

    public User() {
        System.out.println("#User 构造方法,实例化对象");
    }

    @PostConstruct //初始化方法的注解方式  等同与init-method=init
    public void initMethod() {
        System.out.println("#User init-method 执行对象初始化函数");
    }

    @PreDestroy //销毁方法的注解方式  等同于 destory -method=destory222
    public void destoryMethod() {
        System.out.println("#User destory-method");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("#User BeanFactoryAware.setBeanFactory beanFactory=" + beanFactory + " 获取生成Bean的工厂");
    }

    @Override
    public void setBeanName(String s) {
        System.out.println("#User BeanNameAware.setBeanName s=" + s + " 设置bean名称");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("#User InitializingBean.afterPropertiesSet");

    }

    @Override
    public void destroy() throws Exception {
        System.out.println("#User DisposableBean.destroy");
    }
}

UserBeanFactoryPostProcessor.java
 

package com.example.demoorder;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;

@Component
public class UserBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    public UserBeanFactoryPostProcessor() {
        super();
        System.out.println("#UserBeanFactoryPostProcessor 构造方法");
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        System.out.println("#UserBeanFactoryPostProcessor postProcessBeanFactory。获取BeanDefinition并添加age属性");
        BeanDefinition beanDefinition = configurableListableBeanFactory.getBeanDefinition("user");
        beanDefinition.getPropertyValues().addPropertyValue("name","cgm");
    }
}

UserBeanPostProcessor.java

package com.example.demoorder;

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

@Component
public class UserBeanPostProcessor implements BeanPostProcessor {
    public UserBeanPostProcessor() {
        super();
        System.out.println("#UserBeanPostProcessor 构造方法");
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("user")) {
            System.out.println("#UserBeanPostProcessor postProcessBeforeInitialization 在对象初始化函数前对bean属性进行修改");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("user")) {
            System.out.println("#UserBeanPostProcessor postProcessAfterInitialization 在对象初始化函数后对bean属性进行修改");
        }
        return bean;
    }
}

UserInstantiationAwareBeanPostProcessorAdapter.java

package com.example.demoorder;

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

import java.beans.PropertyDescriptor;

@Component
public class UserInstantiationAwareBeanPostProcessorAdapter extends InstantiationAwareBeanPostProcessorAdapter {
    public UserInstantiationAwareBeanPostProcessorAdapter() {
        super();
        System.out.println("#UserInstantiationAwareBeanPostProcessorAdapter 构造方法");
    }

    //接口方法、实例化Bean之前调用
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        if (beanName.equals("user")) {
            System.out.println("#UserInstantiationAwareBeanPostProcessorAdapter postProcessBeforeInstantiation 实例化Bean之前调用");
        }
        return null;
    }

    //接口方法、实例化Bean之后调用
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("user")) {
            System.out.println("#UserInstantiationAwareBeanPostProcessorAdapter postProcessAfterInitialization 实例化Bean之后调用");
        }
        return bean;
    }

    // 接口方法、设置某个属性时调用
    public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
        if (beanName.equals("user")) {
            System.out.println("#UserInstantiationAwareBeanPostProcessorAdapter postProcessPropertyValues 设置某个属性时调用");
        }
        return pvs;
    }
}

运行结果

#现在开始初始化Spring容器
#UserBeanFactoryPostProcessor 构造方法
#UserBeanFactoryPostProcessor postProcessBeanFactory。获取BeanDefinition并添加age属性
#UserBeanPostProcessor 构造方法
#UserInstantiationAwareBeanPostProcessorAdapter 构造方法
#UserInstantiationAwareBeanPostProcessorAdapter postProcessBeforeInstantiation 实例化Bean之前调用
#User 构造方法,实例化对象
#UserInstantiationAwareBeanPostProcessorAdapter postProcessPropertyValues 设置某个属性时调用
#User setName()注入属性
#User BeanNameAware.setBeanName s=user 设置bean名称
#User BeanFactoryAware.setBeanFactory beanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@36fc695d: 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,app,org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory,user,userBeanFactoryPostProcessor,userBeanPostProcessor,userInstantiationAwareBeanPostProcessorAdapter,org.springframework.boot.autoconfigure.AutoConfigurationPackages,org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,org.springframework.boot.autoconfigure.condition.BeanTypeRegistry,propertySourcesPlaceholderConfigurer,org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServl...
#UserBeanPostProcessor postProcessBeforeInitialization 在对象初始化函数前对bean属性进行修改
#User init-method 执行对象初始化函数
#User InitializingBean.afterPropertiesSet
#UserBeanPostProcessor postProcessAfterInitialization 在对象初始化函数后对bean属性进行修改
#UserInstantiationAwareBeanPostProcessorAdapter postProcessAfterInitialization 实例化Bean之后调用
#Spring容器初始化成功
#User业务逻辑调用
#User{name='cgm', address='beijing'}
#现在开始关闭Spring容器!
#User destory-method
#User DisposableBean.destroy

生命周期流程图
Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,这其中包含了一系列关键点。

Spring Bean的生命周期只有这四个阶段。实例化和属性赋值对应构造方法和setter方法的注入,初始化和销毁是用户能自定义扩展的两个阶段。
1实例化 Instantiation
2属性赋值 Populate
3初始化 Initialization
4销毁 Destruction

在这四步之间穿插的各种扩展点,就是各类接口的方法。

各种接口方法分类
Bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类:
1、Bean自身的方法  :  这个包括了Bean本身调用的方法和通过配置文件中<bean>的init-method和destroy-method指定的方法
2、Bean级生命周期接口方法  :  这个包括了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法
3、容器级生命周期接口方法  :  这个包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现,一般称它们的实现类为“后处理器”。
4、工厂后处理器接口方法  :  这个包括了AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer等等非常有用的工厂后处理器  接口的方法。工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cgm625637391

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值