zoukankan      html  css  js  c++  java
  • 【Spring源码解析】Bean生命周期

    Bean创建过程

    1. 实例化bean 设置bean属性
    2. Aware(注入Bean ID、BeanFactory和AppCtx)
    3. BeanPostProcessor(s).postProcessBeforeInitialization
    4. InitializingBean(s).afterPropertiesSet
    5. 定制的Bean init方法
    6. BeanPostProcessor(s).postProcessAfterInitialization
    7. Bean初始化完毕

    Bean销毁过程

    1. 若实现了DisposableBean接口,则会调用destory方法
    2. 若配置了destory-method属性,则会调用其配置的销毁方法

    各种接口方法分类

    1. Bean自身的方法
      • Bean本身调用的方法
      • 通过配置文件中的init-method和destroy-method指定的方法
    2. Bean级生命周期接口方法
      • BeanNameAware
      • BeanFactoryAware
      • InitializingBean
      • DiposableBean
    3. 容器级生命周期接口方法
      • BeanPostProcessor
      • InstantiationAwareBeanPostProcessor
    4. 工厂后处理器接口方法(容器级,在应用上下文装配配置文件之后立即调用)
      • AspectJWeavingEnabler
      • ConfigurationClassPostProcessor
      • CustomAutowireConfigure

    测试Demo

    • LifeCycleBean
    package com.example.spring.bean;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.*;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    
    public class LifeCycleBean implements BeanPostProcessor, BeanNameAware,
            BeanClassLoaderAware, BeanFactoryAware, InitializingBean, DisposableBean {
    
        private String name;
    
        public LifeCycleBean() {
            System.out.println("-----------------------1.Bean构造器");
        }
        public void setName(String name) {
            System.out.println("-----------------------2.Bean属性注入");
            this.name = name;
        }
        @Override
        public void setBeanName(String name) {
            System.out.println("-----------------------3.BeanNameAware的setBeanName()");
        }
    
        @Override
        public void setBeanClassLoader(ClassLoader classLoader) {
            System.out.println("-----------------------4.BeanClassLoaderAware的setBeanClassLoader()");
        }
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            System.out.println("-----------------------5.BeanFactoryAware的setBeanFactory()");
        }
    
    
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("-----------------------6.[初始化之前]BeanPostProcessor的postProcessBeforeInitialization()");
            return bean;
        }
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("-----------------------7.[初始化中,属性注入后]InitializingBean的afterPropertiesSet()");
        }
        public void initMethod() {
            System.out.println("-----------------------8.调用<bean>的init-method属性自定义的初始化方法");
        }
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("-----------------------9.[初始化之后]BeanPostProcessor的postProcessAfterInitialization()");
            return bean;
        }
    
        public void normalMethod() {
            System.out.println("-----------------------10.[容器初始化完成]程序运行,当JVM关闭时,销毁容器");
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println("-----------------------11.[容器销毁]DisposableBean的destroy()");
        }
    
        public void destroyMethod() {
            System.out.println("-----------------------12.[容器销毁]调用<bean>的destory-method属性自定义的销毁方法");
        }
    
        public String getName() {
            return name;
        }
    }
    
    • spring-bean-life-cycle.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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="lifeCycleBean" class="com.example.spring.bean.LifeCycleBean" destroy-method="destroyMethod" init-method="initMethod">
            <property name="name" value="name"/>
        </bean>
    
    </beans>
    
    • Test
    public class SpringTest {
        /**
         * 测试Bean生命周期
         * */
        @Test
        public void testBeanLifeCycle() {
            ClassPathResource resource = new ClassPathResource("spring-bean-life-cycle.xml");
            DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
            factory.addBeanPostProcessor(new LifeCycleBean());
            XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
            reader.loadBeanDefinitions(resource);
    
            LifeCycleBean lifeCycleBean = (LifeCycleBean) factory.getBean("lifeCycleBean");
            lifeCycleBean.normalMethod();
    
            factory.destroySingleton("lifeCycleBean");
        }
    }
    
  • 相关阅读:
    男人只说三分话、留的七分打天下。
    sqlmap实例拿站
    sqlmap使用笔记
    rpm安装删除简介
    Zookeeper技术介绍
    linux下各文件夹的结构说明及用途介绍:
    每个系统管理员都要知道的 30 个 Linux 系统监控工具
    常用命令
    安装gitlab管理自己的代码
    速成Git
  • 原文地址:https://www.cnblogs.com/zendwang/p/spring-bean-life-cycle.html
Copyright © 2011-2022 走看看