zoukankan      html  css  js  c++  java
  • Spring核心知识点

    Spring Bean生命周期流程图

    生命周期流程图

    概念

    1. 四个阶段:实例化(Instantiation) -> 依赖注入(populate) -> 初始化(Initializing) --(运行时)-> 销毁(destory)
    2. 两种作用域:
    • Bean级别:在Bean上声明,只作用于该Bean
      • Aware类接口(BeanNameAware等):可以通过该接口注册一些特殊的属性
      • InitializingBean#afterPropertiesSet():用于依赖注入完成后自行修改属性值
      • DisposableBean#destroy()
      • 配置定义:@Bean(initMethod = "_init", destroyMethod = "_destory") - 等效于@PostConstruct@PreDestroy注解
    • 容器级别:在容器中声明,作用于容器中所有的Bean

    InstantiationAwareBeanPostProcessor

    public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
        // 用于实例化之前,如果该方法返回了一个beanClass的对象,则返回该对象而不进入之后的CreateBean阶段(依然会执行BeanPostProcessor.postProcessAfterInitialization)
        @Nullable
        default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
            return null;
        }
    
        // 完成实例化后执行,如果该方法返回了false,则跳过依赖注入阶段
        default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
            return true;
        }
    
        @Nullable
        // 依赖注入之前执行,用于自定义的注值
        default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
            return null;
        }
    }
    

    BeanPostProcessor:

    public interface BeanPostProcessor {
        @Nullable
        // 为Bean实例初始化前做一些处理(ApplicationAware类型接口及在此处完成赋值调用)
        default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    
        @Nullable
        // 完成初始化后执行,(AOP代理即在此方法中执行 - 实现子类:AbstractAutoProxyCreator)
        default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    }
    

    示例

    /* Test - Spring Bean的生命周期
     *  实例化:InstantiationAwareBeanPostProcessor(before + after)
     *  依赖注入:InstantiationAwareBeanPostProcessor.postProcessPropertyValues() + Aware接口
     *  初始化:BeanPostProcessor(before + after),InitializingBean,init-method
     *  销毁:DisposableBean,destory-method
     */
    public class Test {
        public static void main(String[] args) {
            ApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class);
    
            Car car = context.getBean("car", Car.class);
            car.run();
    
            ((AnnotationConfigApplicationContext) context).removeBeanDefinition("car");
        }
    }
    
    // 0   InstantiationAware处理器 - postProcessBeforeInstantiation() - 对象实例化之前执行
    // 1   构造方法
    // 2   InstantiationAware处理器 - postProcessAfterInstantiation() - 对象实例化之后执行
    
    // 3   InstantiationAware处理器 - postProcessPropertyValues() - 实现自定义属性注入
    // 4   依赖注入
    // 5   Obj - 特殊属性(Aware:BeanName,BeanFactory)注入
    
    // 6   BeanPostProcessor处理器 - postProcessBeforeInitialization() - 初始化前执行
    // 7   Obj - InitializingBean#afterPropertiesSet()
    // 8   Obj - init-method()
    // 9   BeanPostProcessor后置处理 - postProcessAfterInitialization() - 初始化后执行
    
    // 10  运行时
    
    // 11  Obj - DisposableBean#destroy()
    // 12  Obj - destroy-method()
    
    // InstantiationAwareBeanPostProcessor.class
    @Component
    public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
        @Override
        public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
            if(beanClass == Car.class){
                System.out.println("0   InstantiationAware处理器 - postProcessBeforeInstantiation() - 对象实例化之前执行");
            }
            return null;
        }
    
        @Override
        public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
            if(bean instanceof Car){
                System.out.println(((Car) bean).index.getAndIncrement() + "   InstantiationAware处理器 - postProcessAfterInstantiation() - 对象实例化之后执行");
            }
            return true;
        }
    
        @Override
        public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
            if(bean instanceof Car){
                System.out.println(((Car) bean).index.getAndIncrement() + "   InstantiationAware处理器 - postProcessPropertyValues() - 实现自定义属性注入");
            }
            return pvs;
        }
    }
    
    // BeanPostProcessor.class
    @Component
    public class MyBeanPostProcessor implements BeanPostProcessor {
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            if(bean instanceof Car){
                System.out.println(((Car) bean).index.getAndIncrement() + "   BeanPostProcessor处理器 - postProcessBeforeInitialization()前置处理");
            }
            return bean;
        }
    
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            if(bean instanceof Car){
                System.out.println(((Car) bean).index.getAndIncrement() + "   BeanPostProcessor后置处理 - postProcessAfterInitialization()后置处理");
            }
            return bean;
        }
    }
    
    @Bean(initMethod = "init_method", destroyMethod = "destory_method")
    public class Car implements InitializingBean, DisposableBean, BeanNameAware {
        public final AtomicInteger index = new AtomicInteger(1);
    
        private String beanName;
        private Person person;
    
        public Car() {
            System.out.println(index.getAndIncrement() + "   Obj - 构造方法");
        }
    
        @Autowired
        public void setPerson(Person person) {
            System.out.println(index.getAndIncrement() + "   Obj - 依赖注入");
            this.person = person;
        }
    
        @Override
        public void setBeanName(String beanName) {
            System.out.println(index.getAndIncrement() + "   Obj - 特殊属性(Aware:BeanName,BeanFactory)注入");
            this.beanName = beanName;
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println(index.getAndIncrement() + "   Obj - InitializingBean#afterPropertiesSet()");
        }
    
        public void init_method(){
            System.out.println(index.getAndIncrement() + "   Obj - init-method");
        }
    
        public void run(){
            System.out.println(index.getAndIncrement() + "   Obj - 运行时");
        }
    
        public void destory_method(){
            System.out.println(index.getAndIncrement() + "   Obj - destory-method");
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println(index.getAndIncrement() + "   Obj - DisposableBean#destroy()");
        }
    }
    

    欢迎疑问、期待评论、感谢指点 -- kiqi,愿同您为友

    -- 星河有灿灿,愿与之辉

  • 相关阅读:
    boost::asio在VS2008下的编译错误
    Java集合框架——接口
    ACM POJ 3981 字符串替换(简单题)
    ACM HDU 1042 N!(高精度计算阶乘)
    OneTwoThree (Uva)
    ACM POJ 3979 分数加减法(水题)
    ACM HDU 4004 The Frog's Games(2011ACM大连赛区第四题)
    Hexadecimal View (2011ACM亚洲大连赛区现场赛D题)
    ACM HDU 4002 Find the maximum(2011年大连赛区网络赛第二题)
    ACM HDU 4001 To Miss Our Children Time (2011ACM大连赛区网络赛)
  • 原文地址:https://www.cnblogs.com/kiqi/p/14346775.html
Copyright © 2011-2022 走看看