首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Spring源码】- 04 扩展点之BeanFactoryPostProcessor

之前分析IoC容器的启动流程时,夹杂在启动流程中我们发现Spring给我们提供了大量的扩展点,基于这些扩展点我们就可以实现很多灵活的功能定制需求。...method.getDeclaringClass() == targetClz) { return 0; } return 1; } }); /** * NoOp回调把对方法调用直接委派给这个方法在父类中的实现...BeanFactoryPostProcessor#postProcessBeanFactory这个扩展点主要用于实现将注册到IoC容器中BeanDefinition进行相关操作。...以为这个方法执行时机是在postProcessBeanDefinitionRegistry之后,这时Bean都已经以BeanDefinition样式被注册到IoC容器中,这时就可以对这些BeanDefinition...比如案例中我们获取到BeanDefinition中的beanClass属性,并使用Enhancer工具类创建AOP代理类并设置进去,就实现了Spring中的AOP功能。

29821
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Bean生命周期从了解到了断

    Bean 的创建 在常规开发中,通常使用 new 关键字创建对象。...从 XML 和 注解 扫描而来的定义信息统一封装进 BeanDefinition 中,再由容器统一读取,统一创建 Bean。...在填充属性时,属性大多是以为一对存在,通过将封装PropertyValue为 PropertyValues,在 BeanDefinition 中携带该信息,在创建 Bean...CGLIB 通过字节码技术创建目标类的子类,在子类中重写目标方法并在方法前后插入切面逻辑。 对于 Spring 来说,动态代理技术最后生成的代理对象才是运行需要的对象。即容器中最终存储的是代理对象。...在 BeanFactory 中,暴露出接口可以对 BeanDefinition 进行操作。BeanFactory 中包含 BeanDefinition。

    11110

    Spring IOC 源码解析

    我就不详细的说明了,直接开始看源码吧 ClassPathXmlApplicationContext 背景调查 在文章开始的demo工程中,我选择使用了一个xml文件来配置了接口和实现类之间的关系,然后使用了...// Bean的生命周期,默认只提供sington和prototype两种,在WebApplicationContext中还会有request, session, globalSession,... 中的配置创建 BeanDefinition,然后把配置中的信息都设置到实例中, // 这行执行完毕,一个 BeanDefinition 实例就出来了。...如果有Bean实现了BeanFactoryPostProcessor接口, 那么在容器初始化以后,Spring 会负责调用里面的 postProcessBeanFactory 方法。...具体的子类可以在这步的时候添加一些特殊的 BeanFactoryPostProcessor 的实现类或做点什么事 6. invokeBeanFactoryPostProcessors() 调用BeanFactoryPostProcessor

    47620

    SpringIOC源码解析(上)

    我就不详细的说明了,直接开始看源码吧 ClassPathXmlApplicationContext 背景调查 在文章开始的demo工程中,我选择使用了一个xml文件来配置了接口和实现类之间的关系,然后使用了...// Bean的生命周期,默认只提供sington和prototype两种,在WebApplicationContext中还会有request, session, globalSession,... 中的配置创建 BeanDefinition,然后把配置中的信息都设置到实例中, // 这行执行完毕,一个 BeanDefinition 实例就出来了。...如果有Bean实现了BeanFactoryPostProcessor接口, 那么在容器初始化以后,Spring 会负责调用里面的 postProcessBeanFactory 方法。...具体的子类可以在这步的时候添加一些特殊的 BeanFactoryPostProcessor 的实现类或做点什么事 6. invokeBeanFactoryPostProcessors() 调用BeanFactoryPostProcessor

    64120

    认识Spring中的BeanFactoryPostProcessor

    先看下AI的介绍 在Spring 5.3.x中,BeanFactoryPostProcessor是一个重要的接口,用于在Spring IoC容器实例化任何bean之前,读取bean的定义(配置元数据),...功能:在BeanFactory实例化之后、其他Bean被创建之前,执行一些自定义的修改或增强操作。这包括修改BeanDefinition(bean的定义信息),如修改属性、添加或删除bean等。...功能:除了可以修改BeanDefinition之外,它还可以注册新的bean定义到容器中。 4....继续执行,来到了处理实现了PriorityOrdered接口的类。 继续执行,下面来处理实现了Ordered接口的类 继续执行到了,循环处理部分,此处会处理在J类中增加的I类。...见:https://github.com/spring-projects/spring-framework/issues/18841 至于对BeanDefinition的修改,在G类里面将F对应的Bean

    21810

    SpringIOC原理-更加详细的源码剖析

    ); } } BeanDefinition 的覆盖问题可能会有开发者碰到这个坑,就是在配置文件中定义 bean 时使用了相同的 id 或 name,默认情况下,allowBeanDefinitionOverriding...默认情况下,Spring 允许循环依赖,当然如果你在 A 的构造方法中依赖 B,在 B 的构造方法中依赖 A 是不行的。 至于这两个属性怎么配置?...读取配置的操作在 XmlBeanDefinitionReader 中,其负责加载配置、解析。...这里涉及到了 profile 的问题,对于不了解的读者,我在附录中对 profile 做了简单的解释,读者可以参考一下。... 中的配置创建 BeanDefinition,然后把配置中的信息都设置到实例中, // 细节后面细说,先知道下面这行结束后,一个 BeanDefinition 实例就出来了。

    37040

    30个类手写Spring核心原理之Ioc顶层架构设计(2)

    package com.tom.spring.formework.beans.config; //用来存储配置文件中的信息 //相当于保存在内存中的配置 public class GPBeanDefinition...private String factoryBeanName; //保存beanName,在IoC容器中存储的key public String getBeanClassName...在Mini版本中我只做了一个简单的设计,就是定义顶层的IoC缓存,也就是一个Map,属性名字也和原生Spring保持一致,定义为beanDefinitionMap,以方便大家对比理解。...(beanClassName); beanDefinition.setFactoryBeanName(factoryBeanName); return beanDefinition...码相差32 //而且大写字母的ASCII码要小于小写字母的ASCII码 //在Java中,对char做算术运算,实际上就是对ASCII码做算术运算 chars

    46820

    Spring Boot 3.x 自动配置详解

    ,Spring Boot会读取该文件中的自动配置类,并实例化,我们以该文件为入口。...通过断点的堆栈可知加载使用到了Spring 框架refresh()中的invokeBeanFactoryPostProcessors,其作用是在实例化Bean之前加载额外定义的Bean到上下文中,我们从头开始梳理...接口,允许在初始化Bean实例之前修改、添加、删除容器中注册的Bean定义信息 在该示例的SpringBoot-Demo中,只有一个BeanDefinitionRegistryPostProcessor...cachingMetadataReaderFactory.clearCache(); } } 此处代码很长,对于配置类的解析,在parser.parse(candidates)中完成。...没有 beanClass 属性,则解析该 BeanDefinition 中的 beanClassName 所指定的类中的注解信息 parse(bd.getBeanClassName(), holder.getBeanName

    4.7K53

    Spring之BeanFactoryPostProcessor接口介绍

    BeanFactoryPostProcessor    Spring IoC容器允许BeanFactoryPostProcessor在容器实例化任何bean之前读取bean的定义(配置元数据),并可以修改它...注册一个BeanFactoryPostProcessor实例需要定义一个Java类来实现BeanFactoryPostProcessor接口,并重写该接口的postProcessorBeanFactory...implements BeanFactoryPostProcessor { /** * 本方法在Bean对象实例化之前执行, * 通过beanFactory可以获取bean的定义信息,...=bobo, beanName=null] user User 中自定义的初始化方法 A after...实例化的bean对象:User [id=0, name=bobo, beanName=null]...user User [id=0, name=bobo, beanName=null] 总结:从输出结果我们可以看出postProcessBeanFactory方法执行的顺序是在Bean实例化之前。

    4.3K42

    Spring4.3.x源码阅读-IOC

    ,可以在应用中任何地方获取到放在ApplicationContext中的东西,也就是说ApplicationContext就是应用的容器,用来装应用中的对象 这里再补充一下,接口是代表行为的,类是代表从属关系的...()是抽象类AbstractApplicationContext中的空方法,可以通过子类继承,然后重写的方式,由我们自己去扩展。...的任何设置,在默认情况下,customizeBeanFactory()方法什么也没做,这两个标志位,默认都为true,即默认允许重写BeanDefinition,允许循环引用 protected void...去读取xml文件,将其中的标签进行解析,对于bean标签,会解析出beanName和beanDefinition beanName:和bean标签中的id的值相同 beanDefinition:bean...要使用BeanFactoryPostProcessor,需要创建一个实现了BeanFactoryPostProcessor接口的类,并且重写postProcessBeanFactory(),在这个方法中

    19720

    IoC容器初始化过程(下)1 BeanDefinition的载入和解析2 BeanDefinition在IoC容器中的注册

    进行各种骚操作来完成的.这些 BeanDefinition 数据在IoC容器中通过一个 HashMap 来保持和维护....图1.2 对IoC容器执行refresh的过程 2 BeanDefinition在IoC容器中的注册 BeanDefinition 在IoC容器中完成了载入和解析后,用户定义的 BeanDefinition... 信息已经在IoC容器内建立起了自己的数据结构以及相应的数据表示,但此时这些数据还不能供IoC容器直接使用,需要在IoC容器中对这些 BeanDefinition 数据进行注册.这个注册为IoC容器提供了更友好的使用方式...,在 DefaultListableBeanFactory 中,是通过一个 ConcurrentHashMap 来持有载入的 BeanDefinition 的. ?...这些信息是容器建立依赖反转的基础,有了这些基础数据,我们下面学习一下在IoC容器中,依赖注入是怎样完成的.

    87680

    Spring扩展点总结(持续更新)

    注解的对象 BeanFactoryPostProcessor 作用和特点 Bean创建之前,读取Bean的元属性,并根据自己的需求对元属性进行改变,比如将Bean的scope从singleton改变为...prototype 例子 PropertyPlaceholderConfigurer,替换xml文件中的占位符,替换为properties文件中相应的key对应的value dubbo的AnnotationBean...方法可以修改在BeanDefinitionRegistry接口实现类中注册的任意BeanDefinition 也可以增加和删除BeanDefinition例子 mybatis中MapperScannerConfigurer...在只有接口没有实现类的情况下找到接口方法与sql之间的联系从而生成BeanDefinition并注册 spring的ConfigurationClassPostProcessor将注解@Configuration...中的相关生成bean的方法所对应的BeanDefinition进行注册 SmartInitializingSingleton 作用和特点 afterSingletonsInstantiated方法是在非

    1K20

    扒一扒Bean注入到Spring的那些姿势

    为了解决这个问题,Spring在2.x的版本中开始支持注解的方式来声明Bean。...就比如说OpenFeign在启用过程中,会为每个标注了@FeignClient注解的接口创建一个BeanDefinition,然后再往Spring中的注册的,如下是OpenFeign注册FeignClient...因为上面在提到当创建的Bean是单例的时候,会将这个创建完成的Bean保存到SingletonBeanRegistry中,需要用到直接从SingletonBeanRegistry中查找。...这种直接将创建好的Bean注入到Spring容器中在Spring框架内部使用的还是比较多的,Spring的一些内建的Bean就是通过这个方式注入到Spring中的。...,在日常业务开发中,基本上都是使用注解声明的方式注入Spring中的;在第三方框架在和Spring整合时,注册BeanDefinition和FactoryBean这些注入方式也会使用的比较多;至于配置文件和注册创建完成的

    39520
    领券