Spring框架基础知识-常用的接口1
ztj100 2025-08-02 22:49 2 浏览 0 评论
BeanDefinition
基本概念
BeanDefinition是Spring框架中描述bean配置信息的核心接口,它包含了创建bean实例所需的所有元数据。
源码
核心属性
beanClassName
bean的完整类名
scope
作用域(singleton、prototype等)
lazyInit
是否延迟初始化
primary
是否为主要候选bean
dependsOn
依赖的其他bean名称
autowireCandidate
是否作为自动装配候选者
factoryBeanName
工厂bean名称
factoryMethodName
工厂方法名称
constructorArgumentValues
构造器参数
propertyValues
属性值
initMethodName
初始化方法名
destroyMethodName
销毁方法名
编程式创建BeanDefinition
使用BeanDefinitionBuilder
构造器参数设置
注意事项
1、线程安全
BeanDefinition在容器启动时被多线程访问,修改时需要注意线程安全。
2、合并处理
子BeanDefinition的属性会与父BeanDefinition合并,形成最终的配置。
3、验证规则
某些属性组合可能不兼容,如abstract bean不能有class等。
4、性能考虑
BeanDefinition的解析和处理是容器启动的重要步骤,复杂的定义会影响启动性能
总结
BeanDefinition是Spring IoC容器的基础,它将bean的配置信息抽象为对象,为Spring的依赖注入、AOP等功能提供了统一的元数据基础。理解BeanDefinition对于深入掌握Spring容器原理至关重要。
ApplicationContextInitializer
基本概念
ApplicationContextInitializer是Spring框架中用于在ApplicationContext刷新之前进行自定义初始化的回调接口。
作用
在Spring容器refresh()方法执行之前,对ApplicationContext进行编程式配置和初始化操作。它提供了一个钩子点,让开发者可以在容器完全启动前修改容器的配置。
源码
泛型参数C限定了可以处理的ApplicationContext类型,通常使用
ConfigurableApplicationContext。
执行时机
ApplicationContextInitializer的执行顺序在Spring启动流程中的位置:
1、创建ApplicationContext实例
2、执行
ApplicationContextInitializer.initialize()方法
执行
ApplicationContext.refresh()方法
容器启动完成
使用场景
1、配置属性源
2、设置活跃Profile
3、注册自定义BeanFactoryPostProcessor
注册方式
1、通过spring.factories文件
2、在SpringApplication中注册
3、通过@Order注解控制执行顺序
与其他扩展点的区别
ApplicationContextInitializer执行时机早于BeanFactoryPostProcessor和BeanPostProcessor,此时bean定义还未加载。它主要用于容器级别的配置,而不是bean级别的处理。
实际应用
在Spring Boot中,许多自动配置功能都使用
ApplicationContextInitializer来实现,比如配置文件加载、日志系统初始化等。它是Spring框架扩展性设计的重要组成部分,为框架的灵活配置提供了基础支持。
这个接口设计简洁但功能强大,是Spring容器启动过程中进行底层定制的重要入口点。
BeanPostProcessor
基本概念
BeanPostProcessor是Spring框架中用于在bean初始化前后进行自定义处理的核心扩展接口。
源码
执行时机
在Spring bean生命周期中的执行顺序:
1、实例化bean
2、设置属性值
3、调用
postProcessBeforeInitialization()
4、执行初始化方法(@PostConstruct、
InitializingBean.afterPropertiesSet()、init-method)
5、调用
postProcessAfterInitialization()
6、bean准备就绪
核心特性
1、全局作用域
一个BeanPostProcessor会处理容器中的所有bean实例,无需单独配置。
2、返回值重要性
两个方法都必须返回bean对象。可以返回原始bean,也可以返回包装后的代理对象。
3、异常处理
如果处理过程中抛出异常,会阻止bean的创建。
应用场景
1、注解处理
2、AOP代理创建
3、属性验证
注册方式
1、作为Spring Bean注册
2、通过Configuration类
3、执行顺序控制
通过实现Ordered接口或使用@Order注解
内置实现示例
Spring框架内置了许多BeanPostProcessor实现:
AutowiredAnnotationBeanPostProcessor:处理@Autowired注解
CommonAnnotationBeanPostProcessor:处理@Resource、@PostConstruct等注解
AbstractAutoProxyCreator:AOP代理创建的基础类
注意事项
1、避免循环依赖
BeanPostProcessor本身也是bean,要注意不要在处理过程中引起循环依赖。
2、性能考虑
postProcessAfterInitialization方法会被频繁调用,应避免重复的昂贵操作。
3、返回值处理
必须返回bean对象,返回null会导致异常。
与其他扩展点的区别
BeanPostProcessor作用于bean实例级别,而BeanFactoryPostProcessor作用于bean定义级别。BeanPostProcessor在每个bean初始化时都会被调用,是Spring实现各种功能(如依赖注入、AOP、注解处理)的核心机制。
这个接口是Spring框架扩展性的重要体现,大部分Spring的高级功能都是通过BeanPostProcessor实现的。
BeanFactoryPostProcessor
基本概念
BeanFactoryPostProcessor是Spring框架中用于在bean定义加载完成后、bean实例化之前修改bean定义的核心扩展接口。
源码
执行时机
在Spring容器启动流程中的位置:
1、加载bean定义到BeanFactory
2、执行
BeanFactoryPostProcessor.postProcessBeanFactory()
3、实例化BeanPostProcessor
4、实例化普通bean
5、初始化bean
核心作用
1、修改bean定义
可以修改已注册的BeanDefinition,包括属性值、作用域、依赖关系等。
2、添加新的bean定义
动态向容器中注册新的bean定义。
3、修改容器配置
调整BeanFactory的配置和行为。
应用场景
1、属性占位符替换
2、动态注册bean
3、修改bean作用域
注册方式
1、作为Spring Bean
2、Configuration类中声明
注意:在@Configuration类中声明时建议使用static方法,避免提前实例化配置类。
3、执行顺序
通过PriorityOrdered或Ordered接口控制
注意事项
1、不要提前实例化bean
此时bean还未实例化,不应该调用getBean()方法获取bean实例。
2、线程安全
可能在多线程环境下执行,需要注意线程安全问题。
3、异常处理
抛出异常会阻止容器启动。
与BeanPostProcessor的区别
1、处理对象不同
BeanFactoryPostProcessor处理BeanDefinition(bean定义)
BeanPostProcessor处理bean实例
2、执行时机不同
BeanFactoryPostProcessor在bean实例化之前执行
BeanPostProcessor在bean初始化前后执行
3、作用范围不同
BeanFactoryPostProcessor影响整个容器的bean定义
BeanPostProcessor处理单个bean实例
总结
BeanFactoryPostProcessor是Spring实现配置灵活性和扩展性的重要机制,许多Spring的核心功能都基于这个接口实现,是深度定制Spring容器行为的关键扩展点。
相关推荐
- Java的SPI机制详解
-
作者:京东物流杨苇苇1.SPI简介SPI(ServiceProvicerInterface)是Java语言提供的一种接口发现机制,用来实现接口和接口实现的解耦。简单来说,就是系统只需要定义接口规...
- 一文读懂 Spring Boot 启动原理,开发效率飙升!
-
在当今的Java开发领域,SpringBoot无疑是最热门的框架之一。它以其“约定大于配置”的理念,让开发者能够快速搭建和启动应用,极大地提高了开发效率。但是,你是否真正了解Spring...
- ServiceLoader
-
ServiceLoader是Java提供的一种服务发现机制(ServiceProviderInterface,SPI)...
- 深入探索 Spring Boot3 中的自定义扩展操作
-
在当今互联网软件开发领域,SpringBoot无疑是最受欢迎的框架之一。随着其版本迭代至SpringBoot3,它为开发者们带来了更多强大的功能和特性,其中自定义扩展操作更是为我们在项目开发中...
- Spring Boot启动过程全面解析:从入门到精通
-
一、SpringBoot概述SpringBoot是一个基于Spring框架的快速开发脚手架,它通过"约定优于配置"的原则简化了Spring应用的初始搭建和开发过程。...
- Spring Boot 3.x 自定义 Starter 详解
-
今天星期六,继续卷springboot3.x。在SpringBoot3.x中,自定义Starter是封装和共享通用功能、实现“约定优于配置”理念的强大机制。通过创建自己的Starte...
- Spring Boot 的 3 种动态 Bean 注入技巧
-
在SpringBoot开发中,动态注入Bean是一种强大的技术,它允许我们根据特定条件或运行时环境灵活地创建和管理Bean。相比于传统的静态Bean定义,动态注入提供了更高的灵活性和可...
- 大佬用4000字带你彻底理解SpringBoot的运行原理!
-
SpringBoot的运行原理从前面创建的SpringBoot应用示例中可以看到,启动一个SpringBoot工程都是从SpringApplication.run()方法开始的。这个方法具体完成...
- Springboot是如何实现自动配置的
-
SpringBoot的自动配置功能极大地简化了基于Spring的应用程序的配置过程。它能够根据类路径中的依赖和配置文件中的属性,自动配置应用程序。下面是SpringBoot实现自动配置的...
- Spring Boot3.x 应用的生命周期深度解析
-
SpringBoot应用的生命周期可以清晰地划分为三个主要阶段:启动阶段(Startup)...
- Springboot 启动流程及各类事件生命周期那点事
-
前言本文通过Springboot启动方法分析SpringApplication逻辑。从静态run方法执行到各个阶段发布不同事件完成整个应用启动。...
- Spring框架基础知识-常用的接口1
-
BeanDefinition基本概念BeanDefinition是Spring框架中描述bean配置信息的核心接口,它包含了创建bean实例所需的所有元数据。...
- Java 技术岗面试全景备战!从基础到架构的系统性通关攻略分享
-
Java技术岗的面试往往是一项多维度的能力检验。本文将会从核心知识点、项目经验到面试策略,为你梳理一份系统性的备战攻略!...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)