BeanFactory
Bean的定义以及构建
Bean的定义(类型class, scope, 初始化方法,销毁方法),在Spring中采用AbstractBeanDefinition来描述。
AbstractBeanDefinition有以下重要属性
- beanClass: volatile Object Bean的class对象是类的全限定名
- scope: String 作用域
- Singleton(单例):默认作用域,每个 Spring IoC 容器中只创建一个 Bean 实例,并将其存储在缓存中。
- Prototype(原型):每次请求都会创建一个新的 Bean 实例。
- Request/Session:每个 HTTP 请求都会创建一个新的 Bean 实例,仅在 Web 应用程序中有效。
- Application:在整个 ServletContext 生命周期内,只创建一个 Bean 实例,仅在 Web 应用程序中有效。
- WebSocket:在 WebSocket 生命周期内,只创建一个 Bean 实例,仅在 Web 应用程序中有效。
- abstractFlag: boolean 是否为抽象类(默认flase)
- lazyInit: boolean 是否为懒加载(默认flase)
- autowireMode: int 自动装配方法
- autowire_no(0): 默认装配模式,目前非xml配置都是使用这种方式,然后程序员使用注解(@Autowire或者@Resource)手动注入
- autowire_name: 通过set方法,并且 set方法的名称需要和bean的name一致
- autowire_type: 通过set方法,并且再根据bean的类型,注入属性,是通过类型配置
- autowire_construcor: 通过构造器注入
- initMethodName: String init函数的名字
- destroyMethodName: String destroy函数的名字
使用BeanDefinitionBuilder可以通过构造器模式对上述的属性进行定义。
通过beanFactory.registerBeanDefinition("beanName", beanDefinition)
可以把bean定义以(beanName, beanDefinition)的键值对方式存储到beanFactory中
后处理器
AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);
向Bean工厂中添加后处理器,但要注意这里只是添加,并没有使用。
同时也要注意,先要向bean容器中注册我们想要的Bean,然后再添加这些后处理器。这些后处理器都是对于已经加载(添加到Bean工厂),但是没有实例化的Bean定义进行修改。如果先添加后处理器,由于Bean工厂中没有其它Bean的定义,所以会失效。
BeanFactory后处理器
在Bean工厂的标准化定义后,对应用上下文的内部Bean工厂进行修改。此时,所有Bean定义已经加载,但还没有任何Bean被实例化。这使得我们可以在Bean实例化之前覆盖或添加属性,甚至可以修改那些急切初始化(eager-initializing)的Bean的属性。
- internalConfigurationAnnotationProcessor: 处理@Configuration注解
- internalEventListenerProcessor: 处理事件监听
private static void ActivateBeanFactoryProcessor(DefaultListableBeanFactory beanFactory){
// 获取所有的BeanFactory后处理器
Collection<BeanFactoryPostProcessor> collection = beanFactory
.getBeansOfType(BeanFactoryPostProcessor.class)
.values();
if(collection.isEmpty()){
return;
}
// 对其进行激活
collection.forEach(beanPostProcessor -> {
beanPostProcessor.postProcessBeanFactory(beanFactory);
});
}
Bean后处理器
- internalAutowiredAnnotationProcessor: 处理@Autowired注解
- internalCommonAnnotationProcessor: 处理@PostConstruct、@PreDestroy、@Resource 、@WebServiceRef等注解相关功能的
private static void ActivateBeanProcessor(DefaultListableBeanFactory beanFactory){
Collection<BeanPostProcessor> collection = beanFactory
.getBeansOfType(BeanPostProcessor.class)
.values();
if(collection.isEmpty()){
return;
}
collection.forEach(beanFactory::addBeanPostProcessor);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南