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);
}

参考网站

https://blog.csdn.net/qq_27409289/article/details/100753656

posted @   自来人  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示