1.Spring源码系列-BeanPostProcessor与BeanFactoryPostProcessor
2.SpringIoc 容器之 Aware | 京东云技术团队
3.Spring源码- 02 Spring IoC容器启动之refresh方法
4.SpringIoc和Aop底层原理
Spring源码系列-BeanPostProcessor与BeanFactoryPostProcessor
在Spring框架中,码分BeanPostProcessor与BeanFactoryPostProcessor各自承担着不同的码分职责,它们在IoC容器的码分工作流程中起着关键作用。
BeanFactoryPostProcessor作用于BeanDefinition阶段,码分对容器中Bean的码分定义进行处理。这个过程发生在BeanFactory初始化时,码分外卖软件源码对BeanDefinition进行修改或增强,码分提供了一种在不修改源代码的码分情况下定制Bean的机制。相比之下,码分BeanPostProcessor则在Bean实例化之后生效,码分对已经创建的码分Bean对象进行进一步处理或替换,提供了更晚、码分更灵活的码分扩展点。
以制造杯子为例,码分BeanFactoryPostProcessor相当于在选择材料和形状阶段进行定制,码分而BeanPostProcessor则在杯子制造完成后,进行诸如加花纹、抛光等深加工。
在Spring框架中,BeanPostProcessor的使用场景较为广泛,尤其在实现AOP(面向切面编程)时,通过使用代理类替换原始Bean,山西在线教育系统源码实现如日志记录、事务管理等功能。
此外,容器在启动后,还会进行消息源初始化、广播器初始化及监听器初始化,为Bean实例化做好准备。完成这些准备工作后,容器会调用registerBeanPostProcessors方法注册BeanPostProcessor,对已创建的Bean进行进一步处理。同时,初始化消息源、广播器和监听器,为后续事件处理做好基础。
总结,BeanFactoryPostProcessor与BeanPostProcessor在Spring IoC容器中的作用各有侧重。前者侧重于对BeanDefinition的定制,后者则是在Bean实例化后的进一步加工,两者共同为构建灵活、可扩展的IoC容器提供了强大的支持。
在深入分析Spring框架的指标之王蔡有江的指标源码源码时,我们发现refresh()方法的实现中包含了对BeanFactoryPostProcessor和BeanPostProcessor的注册与处理。这些处理步骤确保了容器能够在启动时对Bean进行正确的配置和初始化。
文章中通过一个例子展示了如何使用BeanFactoryPostProcessor替换已注册Bean的实现,以及对其源码的分析。通过例子和源码的结合,读者能够更直观地理解这些后置处理器在Spring框架中的应用和工作原理。
SpringIoc 容器之 Aware | 京东云技术团队
Aware 是 Spring 提供的一个标记超接口,它允许 bean 通过回调式方法接受 Spring 容器的通知,进而获取到容器中特定对象的实例。方法的具体实现由各个子接口决定,通常包含一个接收单个参数并返回 void 的方法。
Spring 中包含了 9 个内置的 Aware 实现,这些实现大致分为两类。前三个实现通过直接调用完成,而后六个则通过 ApplicationContextAwareProcessor 后置处理器间接回调。
实现 BeanNameAware 接口的 bean 需要实现 setBeanName() 方法。此接口的主要作用在于让实现该接口的 bean 知道自己在 Spring 容器中的名称。官方建议实际开发中不建议使用此接口,因为 bean 名称在 Spring 容器中可能仅作为唯一标识,与 bean 的联系并不紧密。
BeanClassLoaderAware 接口在 bean 属性填充后初始化前提供类加载器的数控系统开发源码图书回调,用于让受管理的 bean 了解其是由哪个类加载器负责装载的。
BeanFactoryAware 接口在 bean 属性填充后初始化前提供 bean 工厂的回调,实现该接口的 bean 可以直接访问 Spring 容器,根据传入参数动态获取被 Spring 工厂加载的 bean。
EnvironmentAware 接口让所有注册到 Spring 容器内的 bean,在启动时能够获取 application.properties 配置文件的属性值,避免将魔法值写入代码中。
EmbeddedValueResolverAware 接口用于基于 Spring 解析 properties 文件属性值,适用于抽象类中基于 Spring 解析 @Value 的方式。
ResourceLoaderAware 接口希望拥有 ResourceLoader 引用的对象,允许实现该接口的 bean 在被 Spring 管理时,通过 application context 载入资源,但通常建议使用特定的满足所有需求的 ResourceLoader 实现。
ApplicationEventPublisherAware 接口提供了一个用于为 Service 注入 ApplicationEventPublisher 事件发布器的接口,使 Service 可以发布事件。
MessageSourceAware 接口让 bean 获得 message source,用于在国际化场景中获取文本信息。
ApplicationContextAware 接口允许 bean 方便地获取 Spring 容器ApplicationContext,从而获取容器内的 Bean。Spring 在创建实现类时自动执行此接口的方法,将 ApplicationContext 注入。通达信框架副图指标源码
Spring 中的 Aware 接口在 AbstractAutowireCapableBeanFactory.initializeBean() 方法中,通过调用 invokeAwareMethods() 和 applyBeanPostProcessorsBeforeInitialization() 方法触发 Aware 方法的调用。
invokeAwareMethods() 方法直接回调,而 applyBeanPostProcessorsBeforeInitialization() 方法通过 ApplicationContextAwareProcessor.postProcessBeforeInitialization() 间接调用,并在方法 invokeAwareInterfaces() 中进行回调。
总结而言,Spring 使用两种方式调用 Aware 接口,旨在在 Spring 容器生命周期中提供灵活的回调机制,允许 bean 在初始化前获取不同上下文信息。通过理解这 9 种内置实现,开发者可以更好地利用 Spring 提供的灵活性和功能。
Spring源码- Spring IoC容器启动之refresh方法
在注册阶段,AnnotationConfigApplicationContext构造方法中的第一个方法被分析过。接下来,我们关注第二个方法:register(componentClasses)。在使用XML配置方式时,通过new ClassPathXmlApplicationContext("classpath:spring.xml")来创建实例,其中需要指定xml配置文件路径。使用注解方式时,也需要为ApplicationContext提供起始配置源头,这里使用配置类代替xml配置文件,按照配置类中的注解(如@ComponentScan、@Import、@Bean)解析并注入Bean到IoC容器。
通过配置类,Spring解析注解实现Bean的注入。使用@Configuration注解定义的配置类相当于xml配置文件,但目前Spring推荐使用注解方式,xml配置的使用概率正在降低。
register(componentClasses)方法的核心逻辑在AnnotatedBeanDefinitionReader#doRegisterBean中,将传入的配置类解析为BeanDefinition并注册到IoC容器。ConfigurationClassPostProcessor这个BeanFactory后置处理器在IoC初始化时,获取配置类的BeanDefinition集合,开始解析。
真正启动IoC容器的流程在refresh()方法中,这是了解IoC容器启动流程的关键步骤。refresh方法在AbstractApplicationContext中定义,采用模板模式,提供IoC初始化流程的基本实现,子类可以扩展。
下面分析refresh()方法的每个步骤,以了解IoC容器的启动流程。
prepareRefresh方法主要在refresh执行前进行准备工作,如设置Context的启动时间、状态,以及扩展系统属性相关。
initPropertySources()方法主要用于扩展配置来源,如网络、物理文件、数据库等加载配置信息。StandardEnvironment默认只提供加载系统变量和应用变量的功能,用于子类扩展。
❝initPropertySources方法常见扩展场景包括:❞
getEnvironment().validateRequiredProperties()确保设置的必要属性在环境中存在,否则抛出异常终止应用。
BeanFactory是Spring的基本IoC容器,ApplicationContext包装了BeanFactory,提供更智能、更便捷的功能。ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();获取的BeanFactory是IoC容器初始化工作的基础。
上面获取的BeanFactory还不能直接使用,需要填充必要的配置信息。至此,IoC容器的启动流程基本完成。
这里对IoC启动流程有个大致、直观的印象。主要步骤包括:准备阶段、配置来源扩展、初始化BeanFactory、填充配置、解析配置类、注册Bean、实例化BeanPostProcessor、初始化国际化和事件机制、以及创建内嵌Servlet容器(在SpringBoot中实现)。这些步骤确保了IoC容器顺利启动并管理Bean。
SpringIoc和Aop底层原理
文章内容
本文深入解析Spring框架中的Ioc和Aop底层原理。
首先,Ioc(依赖注入)通过Spring配置文件实现对象的创建,而不是传统的new方式。实现Ioc,主要有两种方法:配置文件和注解。Ioc底层原理包括:使用xml配置文件创建类,通过dom4j解析配置,工厂设计模式配合使用,以及反射技术。通过Ioc,开发者只需修改bean配置属性,就能更换UserService类,有效降低类间的耦合度。
与DI(依赖注入)相比,Ioc更加关注控制反转,将对象创建权交由Spring管理;而DI则着重于在对象内部注入属性值。Ioc与DI相辅相成,DI必须在Ioc的基础上进行操作,即先创建对象后进行属性注入。
文章接下来解释了Spring整合web项目原理,包括加载Spring核心配置文件、服务器启动时动态加载配置和创建对象,以及使用ServletContext和监听器实现这一过程。具体操作包括为每个项目创建ServletContext对象、监听对象创建事件,并在contextInitialized()方法中加载配置文件和创建对象,最后将对象存储在ServletContext域对象中以便于获取。
Aop(面向切面编程)在Spring中实现,通过动态代理扩展功能,无需修改源代码。动态代理分为两种情况:有接口时使用jdk动态代理,无接口时使用cglib动态代理。Aop提供多种增强类型,包括前置、后置、异常、最终和环绕增强。
文章最后建议读者关注学习资源,通过扫描二维码获取更多知识和学习资料。