17、生命周期-BeanPostProcessor在Spring底层的使用

前提说明:

      上一篇提到的,BeanPostProcessor两个方法其实就是分别在init、afterProperties方法前后执行。

而spirng内部定义了几个BeanPostProcessor,如下图。这里我用ApplicationContextAwareProcessor来说明processor在spring底层的使用。

测试代码:

package com.lei.study_09_16.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 
 * 
 * @author LeiLei
 * @date 2019/9/16
 */
public class Dog implements ApplicationContextAware {

    ApplicationContext context;

    public Dog() {
        System.out.println("Dog.Dog");
        System.out.println("context21111111111111111111111111111111111111:"+context);
    }

    public void init() {
        System.out.println("Dog.init");
        System.out.println("context23333333333333333333333333333333333333333333:"+context);
    }

    public void destory() {
        System.out.println("Dog.destory");
        System.out.println("context244444444444444444444444444444444444444444444:"+context);
    }

    /**
     * 实现的ApplicationContextAware的方法,获取到IOC容器
     *
     * @param applicationContext IOC
     * @throws BeansException
     */
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }

}

 

@Test
public void BeanPostProcessor() {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(com.lei.study_09_16.config.BeanConfig.class);
    System.out.println("容器初始化完成。。。");
    Dog bean = context.getBean(Dog.class);
    System.out.println(bean);
    context.close();
}

测试结果:

Dog.Dog
context21111111111111111111111111111111111111:null
dog:MyBeanPostProcessor.postProcessBeforeInitialization123123
Dog.init
context23333333333333333333333333333333333333333333:org.springframework.context.annotation.AnnotationConfigApplic
dog:MyBeanPostProcessor.postProcessAfterInitialization123132
容器初始化完成。。。
Dog.destory
context244444444444444444444444444444444444444444444:org.springframework.context.annotation.AnnotationConfigAppli
 

因为是在init方法前执行,在创建对象和注入值之后执行postProcessBeforeInitialization123123,因此构造器中还没有对IOC赋值,拿到的为null。

 

总结:

1.BeanPostProcessor两个方法在init方法前后执行。

2.postProcessBeforeInitialization方法中对实现ApplicationContextAware接口做了判断,如果实现了该接口则调用该接口的方法,从而达到在Dog中注入IOC容器对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值