zoukankan      html  css  js  c++  java
  • spring学习9-bean的初始化过程

    spring学习9-bean的初始化过程

    三、spring bean的初始化过程

    1.得到BeanDefinition

    2.实例化前

    org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
    

    3.实例化

    4.实例化后

    org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
    

    实例化后这个方法如果返回了false,就不会走后续的spring逻辑

    5.属性填充

    这个阶段进行自动装配,属性赋值

    6.初始化前

    org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization
    

    这个方法如果返回了null,表示跳过其余的BeanPostProcessor处理逻辑,一搬情况这里应该返回当前的bean对象

    7.初始化

    spring提供了一个接口InitializingBean,实现这个接口中的afterPropertiesSet()方法来实现初始化逻辑

    public interface InitializingBean {
        void afterPropertiesSet() throws Exception;
    }
    

    @PostConstruct注解也可以实现初始化,这个注解的处理是在初始化前进行处理的。

    属性注入完成后才会执行初始化

    8.初始化后

    重写这个方法

    org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization
    

    通过bean的后置处理器BeanPostProcessor 及其子接口对这个过程进行干预

    9.自定义后置处理器举例

    
    @Component
    public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
    
        @Override
        public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
            if (beanClass.getName().equals("com.lyy.service.UserService")) {
                System.out.println("UserService--实例化前方法");
            }
            return null;
        }
    
        @Override
        public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
            if (bean.getClass().getName().equals("com.lyy.service.UserService")) {
                System.out.println("UserService--实例化后方法");
                //return false;//return false表示跳过后续的spring逻辑
            }
            return true;
        }
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            if (bean.getClass().getName().equals("com.lyy.service.UserService")) {
                System.out.println("UserService--初始化前方法");
                //return null;//return null表示跳过后续的处理器处理逻辑
            }
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            if (beanName.equalsIgnoreCase("UserService")) {
                System.out.println("UserService--初始化后方法");
            }
            return bean;
        }
    }
    

    执行顺序

    UserService--实例化前方法
    UserService--无参构造方法
    UserService--实例化后方法
    UserService--set方法注入
    UserService--初始化前方法
    UserService--PostConstruct注解初始化
    UserService--初始化方法
    UserService--初始化后方法
    
  • 相关阅读:
    2014第5周一
    2014第4周日
    2014第4周六
    underscore.js
    2014第4周四
    2014第4周三
    2014年第2周二
    POj 3126 Prime Path
    Oracle EBS 入门
    HDU1698_Just a Hook(线段树/成段更新)
  • 原文地址:https://www.cnblogs.com/chengxuxiaoyuan/p/15394864.html
Copyright © 2011-2022 走看看