方法获取的接口实现类就是这个字节码生成的代理类 定义代理类RpcInvocationHandler,继承InvocationHandler接口,并重写invoke()方法。...需要借助Spring的其他扩展点: 1、BeanFactoryPostProcessor,在Spring 容器加载 Bean 的定义之后以及 Bean 实例化之前执行,方便用户对 Bean 的配置元数据进行二次修改...通过ApplicationContext可以查找Spring容器中的Bean对象。...= beanDefinition.getBeanClassName(); if (beanClassName !...(), beanDefinition); } } } RpcConsumerPostProcessor 从 beanFactory 中获取所有 Bean 的定义信息,然后对每个
之前分析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功能。
Bean 的创建 在常规开发中,通常使用 new 关键字创建对象。...从 XML 和 注解 扫描而来的定义信息统一封装进 BeanDefinition 中,再由容器统一读取,统一创建 Bean。...在填充属性时,属性大多是以为一对存在,通过将封装PropertyValue为 PropertyValues,在 BeanDefinition 中携带该信息,在创建 Bean...CGLIB 通过字节码技术创建目标类的子类,在子类中重写目标方法并在方法前后插入切面逻辑。 对于 Spring 来说,动态代理技术最后生成的代理对象才是运行需要的对象。即容器中最终存储的是代理对象。...在 BeanFactory 中,暴露出接口可以对 BeanDefinition 进行操作。BeanFactory 中包含 BeanDefinition。
我就不详细的说明了,直接开始看源码吧 ClassPathXmlApplicationContext 背景调查 在文章开始的demo工程中,我选择使用了一个xml文件来配置了接口和实现类之间的关系,然后使用了...// Bean的生命周期,默认只提供sington和prototype两种,在WebApplicationContext中还会有request, session, globalSession,... 中的配置创建 BeanDefinition,然后把配置中的信息都设置到实例中, // 这行执行完毕,一个 BeanDefinition 实例就出来了。...如果有Bean实现了BeanFactoryPostProcessor接口, 那么在容器初始化以后,Spring 会负责调用里面的 postProcessBeanFactory 方法。...具体的子类可以在这步的时候添加一些特殊的 BeanFactoryPostProcessor 的实现类或做点什么事 6. invokeBeanFactoryPostProcessors() 调用BeanFactoryPostProcessor
1、Spring 扩展点 BeanFactoryPostProcessor 使用技巧方法void postProcessBeanFactory(ConfigurableListableBeanFactory...void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException...一般可以使用以下方式去获取 BeanDefinition。...RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Test.class);public RootBeanDefinition(String beanClassName...yml 的配置文件,但是在当前对象中,直接使用注入的方式是获取不到配置文件的:@Value("${test.case}")private String name; @Autowiredprivate
先看下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
registry:这个是将来 BeanDefinition 的注册器。...的介绍(七种 BeanDefinition,各显其能!)...例如如果我们在类上添加的是 @Configuration,那么 @Configuration 的元注解有两个,分别是 @Component 和 @Indexed。...= null, "No bean class name set"); return beanClassName; } 重写后的方法就是获取类的完整路径返回。...这个在最近录制的 Spring 源码视频中已经详细介绍过了,这里就不再啰嗦了,感兴趣的小伙伴戳这里:Spring源码应该怎么学?。 5.
在此系列文章中,我总结了Spring几乎所有的扩展接口,以及各个扩展点的使用场景。并整理出一个bean在spring中从被加载到最终初始化的所有可扩展点的顺序调用图。...这样,我们也可以看到bean是如何一步步加载到spring容器中的。...最后,将propertyValues设置到beanDefinition中,并使用beanRegistry注册了一个名为"user"的BeanDefinition。...在postProcessBeanFactory方法中,通过beanFactory获取了名为"user"的BeanDefinition,并输出了其beanClassName。...红框中5步都是在springboot中进行,最后super.refresh()是调用大家熟悉的spring的AbstractApplicationContext的refresh方法。
); } } BeanDefinition 的覆盖问题可能会有开发者碰到这个坑,就是在配置文件中定义 bean 时使用了相同的 id 或 name,默认情况下,allowBeanDefinitionOverriding...默认情况下,Spring 允许循环依赖,当然如果你在 A 的构造方法中依赖 B,在 B 的构造方法中依赖 A 是不行的。 至于这两个属性怎么配置?...读取配置的操作在 XmlBeanDefinitionReader 中,其负责加载配置、解析。...这里涉及到了 profile 的问题,对于不了解的读者,我在附录中对 profile 做了简单的解释,读者可以参考一下。... 中的配置创建 BeanDefinition,然后把配置中的信息都设置到实例中, // 细节后面细说,先知道下面这行结束后,一个 BeanDefinition 实例就出来了。
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
,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
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实例化之前。
概述 在Small Spring系列一:BeanFactory(一)中,我们用DefaultBeanFactory读取bean.xlm中的bean信息,并且也实现了BeanFactory的getBean...这里我们可以在BeanFactory接口中增加registerBeanDefinition(String beanID, BeanDefinition bd)方法,将XmlBeanDefinitionReader...解析的BeanDefinition注册到BeanFactory中。...(此时XmlBeanDefinitionReader中需要持有一个BeanFactory的实例)。类图如下: ?...在 ClassPathXmlApplicationContext和FileSystemXmlApplicationContext的 的构造方法中有冗余代码,因此我们可以考虑使用模板方法来处理一下。
MapperScannerRegistrar @MapperScan上面注解@Import(MapperScannerRegistrar.class),说明具体逻辑在MapperScannerRegistrar...{ processPropertyPlaceHolders(); } // 构建一个ClassPathMapperScanner,以下都是进行设置前文注解中的信息...beanDefinitions = new LinkedHashSet(); for (String basePackage : basePackages) { // 扫描路径获取路径下的BeanDefinition...doScan方法,主要是扫描路径,并将扫描的信息转为beanDefinition,设置其为MapperFactoryBean。...总结 @MapperScan 实际做的事情: 1.扫描指定路径,并将路径下的信息记录为BeanDefinition; 2.将获取的BeanDefinition,设置为MapperFactoryBean
,可以在应用中任何地方获取到放在ApplicationContext中的东西,也就是说ApplicationContext就是应用的容器,用来装应用中的对象 这里再补充一下,接口是代表行为的,类是代表从属关系的...()是抽象类AbstractApplicationContext中的空方法,可以通过子类继承,然后重写的方式,由我们自己去扩展。...的任何设置,在默认情况下,customizeBeanFactory()方法什么也没做,这两个标志位,默认都为true,即默认允许重写BeanDefinition,允许循环引用 protected void...去读取xml文件,将其中的标签进行解析,对于bean标签,会解析出beanName和beanDefinition beanName:和bean标签中的id的值相同 beanDefinition:bean...要使用BeanFactoryPostProcessor,需要创建一个实现了BeanFactoryPostProcessor接口的类,并且重写postProcessBeanFactory(),在这个方法中
它只有一个方法:postProcessBeanFactory,用它可以在bean实例化前修改BeanDefinition的相关信息。...可以在该方法中修改BeanDefinition中的属性 和 scope。...可以在postProcessBeforeInitialization方法中setXXX一些参数,某个业务类如果实现XXXAware接口时,就可以拿到这些参数,做进一步的逻辑处理了。 ?...5.BeanFactoryPostProcessor和BeanPostProcessor的区别 BeanFactoryPostProcessor是在spring容器实例化bean之前读取bean的定义...然后在调用applicationContext.getBean("name")方法时 ,在initializeBean(初始化bean)方法中调用BeanPostProcessor的postProcessBeforeInitialization
进行各种骚操作来完成的.这些 BeanDefinition 数据在IoC容器中通过一个 HashMap 来保持和维护....图1.2 对IoC容器执行refresh的过程 2 BeanDefinition在IoC容器中的注册 BeanDefinition 在IoC容器中完成了载入和解析后,用户定义的 BeanDefinition... 信息已经在IoC容器内建立起了自己的数据结构以及相应的数据表示,但此时这些数据还不能供IoC容器直接使用,需要在IoC容器中对这些 BeanDefinition 数据进行注册.这个注册为IoC容器提供了更友好的使用方式...,在 DefaultListableBeanFactory 中,是通过一个 ConcurrentHashMap 来持有载入的 BeanDefinition 的. ?...这些信息是容器建立依赖反转的基础,有了这些基础数据,我们下面学习一下在IoC容器中,依赖注入是怎样完成的.
注解的对象 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方法是在非
为了解决这个问题,Spring在2.x的版本中开始支持注解的方式来声明Bean。...就比如说OpenFeign在启用过程中,会为每个标注了@FeignClient注解的接口创建一个BeanDefinition,然后再往Spring中的注册的,如下是OpenFeign注册FeignClient...因为上面在提到当创建的Bean是单例的时候,会将这个创建完成的Bean保存到SingletonBeanRegistry中,需要用到直接从SingletonBeanRegistry中查找。...这种直接将创建好的Bean注入到Spring容器中在Spring框架内部使用的还是比较多的,Spring的一些内建的Bean就是通过这个方式注入到Spring中的。...,在日常业务开发中,基本上都是使用注解声明的方式注入Spring中的;在第三方框架在和Spring整合时,注册BeanDefinition和FactoryBean这些注入方式也会使用的比较多;至于配置文件和注册创建完成的
领取专属 10元无门槛券
手把手带您无忧上云