zoukankan      html  css  js  c++  java
  • BeanLiftCycle(1)

    Bean生命周期图:

    1、 创建BeanFactory(DefaultListableBeanFactory)

    2、 手动注册BeanDefinition(ImportBeanDefinitionRegistrar.registerBeanDefinitions)

    3、 BeanFactory后置处理(BeanFactoryPostProcessor.postProcessBeanFactory)

    4、 调用Bean.class的构造器实例化Bean

    5、 Bean初始化之前处理(BeanPostProcessor.postProcessBeforeInitialization)

    6、 Bean构造器后置处理(PostConstruct)

    7、 设置属性(InitializingBean .afterPropertiesSet)

    8、 执行InitMethod

    9、 Bean初始化结束之后处理(BeanPostProcessor.postProcessAfterInitialization)

    10、Bean摧毁之前处理(PreDestroy)

    11、Bean摧毁

    启动类:

    public class Start {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
            applicationContext.close();
        }
    }

    配置类:

    @Configurable
    @ComponentScan({ "com.spring.demo.beanlifecycle" })
    @Import(ImportBeanDefinitionRegistrar_.class)
    public class Config {
    }

    Bean:

    public class Bean implements InitializingBean {
        public Bean() {
            System.out.println("invoke Construct: " + this);
        }
        public void init() {
            System.out.println("init: " + this);
        }
        public void destroy() {
            System.out.println("destroy: " + this);
        }
        @PostConstruct
        public void postConstruct() {
            System.out.println("PostConstruct: " + this);
        }
        @PreDestroy
        public void preDestroy(){
            System.out.println("PreDestroy: " + this);
        }
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("afterPropertiesSet: " + this);
        }
    }
    

      

    registerBeanDefinitions:

    public class ImportBeanDefinitionRegistrar_ implements ImportBeanDefinitionRegistrar {
        @Override
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
            BeanDefinition beanDefinition =
                BeanDefinitionBuilder.rootBeanDefinition(Bean.class).setInitMethodName("init").setDestroyMethodName("destroy").getBeanDefinition();
            registry.registerBeanDefinition("bean", beanDefinition);
            System.out.println("registerBeanDefinitions: " + beanDefinition);
        }
    }
    

      

    BeanFactoryPostProcessor:

    @Component
    public class BeanFactoryPostProcessor_ implements BeanFactoryPostProcessor {
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            System.out.println("postProcessBeanFactory :" + beanFactory.getBeanDefinition("bean"));
        }
    }
    

      

    BeanPostPrcesser

    @Component
    public class BeanPostProcessor_ implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            if (bean.getClass().equals(Bean.class)) {
                System.out.println("postProcessBeforeInitialization : " + bean.toString());
            }
            return bean;
        }
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            if (bean.getClass().equals(Bean.class)) {
                System.out.println("postProcessAfterInitialization : " + bean.toString());
            }
            return bean;
        }
    }

    执行结果

    registerBeanDefinitions: Root bean: class [com.spring.demo.beanlifecycle.Bean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=init; destroyMethodName=destroy
    postProcessBeanFactory : Root bean: class [com.spring.demo.beanlifecycle.Bean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=init; destroyMethodName=destroy
    invoke Construct: com.spring.demo.beanlifecycle.Bean@74294adb
    postProcessBeforeInitialization : com.spring.demo.beanlifecycle.Bean@74294adb
    PostConstruct: com.spring.demo.beanlifecycle.Bean@74294adb
    afterPropertiesSet: com.spring.demo.beanlifecycle.Bean@74294adb
    init: com.spring.demo.beanlifecycle.Bean@74294adb
    postProcessAfterInitialization : com.spring.demo.beanlifecycle.Bean@74294adb
    PreDestroy: com.spring.demo.beanlifecycle.Bean@74294adb
    destroy: com.spring.demo.beanlifecycle.Bean@74294adb

    over

  • 相关阅读:
    vue开发(一)安装
    Ubuntu18.04安装mysql
    使用.NET Framework开发IIS 7.0模块和处理程序拦截请求实现跳转
    Mysql 清空数据后,释放硬盘文件
    依赖注入
    ubuntu 上开发.netcore
    使用python获取微医数据
    Mysql查询某字段重复值并删除重复值
    使用pyinstaller 打包python程序
    堆(heap)和栈(stack)、内存泄漏(memory leak)和内存溢出
  • 原文地址:https://www.cnblogs.com/sleepingDogs/p/11070852.html
Copyright © 2011-2022 走看看