spring bean 生命周期事件

整体流程图

程序示例

maven依赖

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.12.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

</dependencies>

配置类

@Configuration
@ComponentScan("per.ym.processor, per.ym.service")
public class LifeCycleConfig {

    @Bean(initMethod = "init", destroyMethod = "destroy")
    public LifeCycleBean lifeCycleBean() {
        return new LifeCycleBean();
    }
}

实例bean

public class LifeCycleBean implements InitializingBean, BeanNameAware, BeanFactoryAware, BeanClassLoaderAware {

    public LifeCycleBean() {
        System.out.println("consturctor......");
    }

    public void init() {
        System.out.println("init......");
    }

    @Autowired
    public void setService(PersonService service) {
        System.out.println("setService......");
    }

    public void destroy() {
        System.out.println("destroy......");
    }

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

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("setBeanFactory......");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("setBeanName......");
    }

    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("setBeanClassLoader......");
    }

}

InstantiationAwareBeanPostProcessor

package per.ym.processor;

@Component
public class MyInstantiationBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {

    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean")) {
            System.out.println("postProcessBeforeInstantiation......");
        }
        return null;
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean")) {
            System.out.println("postProcessAfterInstantiation......");
        }
        return true;
    }

    @Override
    public PropertyValues postProcessPropertyValues(
            PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean")) {
            System.out.println("postProcessPropertyValues......");
        }
        return pvs;
    }

}

BeanPostProcessor

package per.ym.processor;

@Component
public class MyPostProcess implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean")) {
            System.out.println("postProcessBeforeInitialization......");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("lifeCycleBean")) {
            System.out.println("postProcessAfterInitialization......");
        }
        return bean;
    }

}

service

package per.ym.service;

@Service
public class Service {
}

测试类

public class Test_Normal {

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(LifeCycleConfig.class);

    @Test
    public void test() {
        applicationContext.getBean("lifeCycleBean");
        applicationContext.close();
    }
}

测试结果:

postProcessBeforeInstantiation......
consturctor......
postProcessAfterInstantiation......
postProcessPropertyValues......
setService......
setBeanName......
setBeanClassLoader......
setBeanFactory......
postProcessBeforeInitialization......
afterPropertiesSet......
init......
postProcessAfterInitialization......
destroy......

原文地址:https://blog.51cto.com/9587581/2401791

时间: 2024-10-06 13:20:57

spring bean 生命周期事件的相关文章

Spring点滴四:Spring Bean生命周期

Spring Bean 生命周期示意图: 了解Spring的生命周期非常重要,我们可以利用Spring机制来定制Bean的实例化过程. --------------------------------------------------------------------------------------------------------------------------------------------------- spring-service.xml: <?xml version=

一步步剖析spring bean生命周期

关于spring bean的生命周期,是深入学习spring的基础,也是难点,本篇文章将采用代码+图文结论的方式来阐述spring bean的生命周期, 本篇文章将阐述清楚下图. 一  项目结构及源码 1.程序目录结构 2.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/sc

Spring Bean生命周期

1.Bean的建立:BeanFactory容器寻找Bean的定义信息,读取Bean定义文件,并将其实例化,生成各个Bean实例.2.属性注入:使用依赖注入,Spring按照Bean定义信息配置Bean所有属性.3.BeanNameAware的setBeanName():传递Bean的ID.4.BeanFactoryAware的setBeanFactory():工厂调用setBeanFactory()方法传入工厂自身.如果是使用ApplicationContext来生成并管理Bean的话则稍有不同

Spring Bean 生命周期

转自:也谈Spring Bean的生命周期 开篇先用一张老图描述下Spring中Bean容器的生命周期. 插叙一下,记得某个博文中提到:“Spring的Bean容器只管理非单例Bean的生命周期,单例Bean的生命周期不在管理范围内”,其实我认为这句话恰好说反了.首先明确一点,并非Spring容器中所有的Bean都有生命周期行为,只有接受容器管理生命周期的Bean才具有生命周期行为:而单例(Singleton)Bean接受容器管理,非单例(non-singleton)Bean在实例化后,完全交给

Spring Bean生命周期详解

对象生命周期:创建(实例化----初始化)---使用----销毁,而在Spring中,Bean对象周期当然遵从这一过程,但是Spring提供了许多对外接口,允许开发者对三个过程(实例化.初始化.销毁)的前后做一些操作.在Spring Bean中,实例化是为Bean对象开辟空间(构造函数),初始化则是对属性的初始化,属性注入(setter方法注入属性). 1.Bean自身方法:init-method/destroy-method,通过为配置文件bean定义中添加相应属性指定相应执行方法. 2.Be

11张流程图帮你搞定 Spring Bean 生命周期

在网上已经有跟多Bean的生命周期的博客,但是很多都是基于比较老的版本了,最近吧整个流程化成了一个流程图.待会儿使用流程图,说明以及代码的形式来说明整个声明周期的流程.注意因为代码比较多,这里的流程图只画出了大概的流程,具体的可以深入代码 一.获取Bea 第一阶段获取Bean 这里的流程图的入口在 AbstractBeanFactory类的 doGetBean方法,这里可以配合前面的 getBean方法分析文章进行阅读.主要流程就是 1.先处理Bean 的名称,因为如果以“&”开头的Bean名称

Spring Bean生命周期回调方法

参阅官方文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-lifecycle 第一种方式:使用@PostConstruct注解,进行标注当前非init()名称的方法,进行bean声明周期的初始化操作:@PostConstruct和@PreDestroy是当前Bean声明周期的初始化回调和销毁时回调 第二种方式:当前类实现InitializingBean和

Spring Bean生命周期回调

参阅官方文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-lifecycle 第一种方式:使用@PostConstruct注解,进行标注当前非init()名称的方法,进行bean声明周期的初始化操作:@PostConstruct和@PreDestroy是当前Bean声明周期的初始化回调和销毁时回调 第二种方式:当前类实现InitializingBean和

spring bean生命周期和上下文初始化

第一阶段: 1 准备阶段根据BeanDefintionReader去初始化Bean的定义,那么在bean的定义中通常有两种一个是注解Bean定义读取器,一个是xmlBean定义读取器. BeanDefinition是spring中Bean的元数据定义: 包括:(1)bean的Scope:(2)是否懒加载:(3)simpleName:(4)parentName,(5)DependsOn 在doCreateBean中的4个方法 1 createBeanInstance2 populateBean3