SpringIoC容器的初始化 【打通refresh方法的全链路】

本章节目录:

  (一)后 置 处 理 器  PostProcessor

  (二)Aware 接  口  及  其  子  接  口


(一)后 置 处 理 器  PostProcessor

PostProcessor:

  本身也是一种需要注册到容器里的Bean

      其里面的方法会在特定的时机被容器调用

      实现不改变容器或者Bean核心逻辑的情况下对Bean进行拓展

      对Bean进行包装,影响其行为、修改Bean的内容等

PostProcessor的种类:

  大类分为容器级别的后置处理器以及Bean级别的后置处理器

      BeanDefinitionRegistryPostProcessor

     BeanFactoryPostProcessor

     BeanPostProcessor

BeanDefinitionRegistryPostProcessor的使用:

  下面代码意为:在BeanDefinitionRegistry注册BeanDefinition之前调用方法。执行完方法后我们就可以在容器中获取到该Bean


@Configuration
public class CustomizedBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        Class<?> clazz = User.class;//新建User的Class对象
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(clazz);//将Class对象获取到创建BeanDefinition的工具类
        GenericBeanDefinition definition = (GenericBeanDefinition)builder.getRawBeanDefinition();//通过工具类创建BeanDefinition
        registry.registerBeanDefinition("user",definition);//调用注册器 注册BeanName为“user”,BeanDefinition为刚刚新建的对象。

    }
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {}
}

BeanPostProcessor的使用:

  下面代码意为:在Bean注册创建之前(之后)调用方法。

@Configuration
public class CustomizedBeanPostProcessor implements BeanPostProcessor {
    //Bean创建前调用
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName + "调用了postProcessBeforeInitialization()");
        return bean;//返回Bean提供后续创建
    }

    //Bean初始化好之后调用
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName + "调用了postProcessAfterInitialization()");
        return bean;
    }
}

(二)Aware  接  口  及  其  子  接  口

Aware:

   从Bean里获取到的容器实例并对其进行操作

  该接口是个空的接口,并没有什么作用,只能当作标签使用

  该接口的主要作用体现在它的子类中

Aware的关系图:(常用的子接口)

ApplicationContextAware接口主要一个方法setApplicationContext() :实现了该接口的Bean在容器创建这个Bean的实例时,将容器本身的实例作为参数传递给这个Bean使用

BeanFactory接口:获取当前的BeanFactory提供调用服务

ResourceLoaderAware:主要就是用来获取资源加载器的

BeanNameAware接口主要一个方法setBeanName(String name):实现了该接口的Bean,可以将Bean的名字传递进来供该接口使用。


(三)事 件 监 听 器 模 式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kerry_x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值