Spring中一些重要接口的总结

BeanFactory

通过BeanFactory对象直接注册给spring

bean5他的实例化方式是通过beanFactory对象直接注册给spring

调用registerSingleton( "name " , object) 调用registerSingleton("bean5", new Bean5)

特点:

1.存在spring容器当中(单例)

2.不具备spring bean的很多特点

2.1没有spring的生命周期

2.1.1处理不了@PostConstruct

2.1.2 处理不了@Autowird注解

2.1.3无法回调setApplicationContext

之所以bean5没有经历spring的生命周期,是因为我们自己new出来的

BeanFactory和ApplicationContext 是使用过Spring的同学耳熟能详的两个接口,其中BeanFactory是Spring框架最核心的接口,之前学习Spring开发的时候接触多的是ApplicationContext 这个面向应用的功能,当然要搭建Spring环境也可以不用了解BeanFactory这个接口,简而言之:

BeanFactor:提供了高级的IoC的配置机制,完成了对bean的基本管理,是Spring框架的基础设施,面向的是Spring本身。

ApplicationContext:是建立在BeanFactory基础之上的,是它的扩展,它提供了更多的面向应用的功能,诸如国际化支持,框架事件体系,易于创建实际应用,面向使用Spring的开发者。

beanDefinition

用来描述bean的,为了spring容器实例化bean的时候知道怎么实例化它,需要做什么。

它定义了bean的属性、依赖关系和其他配置信息。

BeanDefinition包含了以下重要的属性:

  1. 类型(Type):指定要创建的bean的类或接口。
  2. 作用域(Scope):定义bean的作用域,如单例(Singleton)、原型(Prototype)等。
  3. 初始化方法(Initialization method):指定bean实例化后要调用的方法。
  4. 销毁方法(Destruction method):指定bean销毁前要调用的方法。
  5. 属性值(Property values):设置bean的属性值,包括基本类型、引用类型和集合类型。
  6. 依赖关系(Dependencies):定义bean与其他bean之间的依赖关系。

BeanFactoryPostProcrssor

beanFactoryPostProcrssor 工厂后处理器, 实现扩展功能

实例化时会提前实例化放进单例池,比其他的spring的bean要早

实现了该接口的类只要交给Spring容器管理的话,那么Spring就会回调该接口的方法,用于对BeanDefinition注册和修改功能

BeanFactoryPostProcessor定义如下:
​
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory);
}

BeanDefinitionRegistryPostProcessor

BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor`的子接口,用于在BeanFactoryPostProcessors之前触发,对Bean定义的注册过程进行后置处理。它可以修改、添加或删除Bean的定义,甚至可以根据需要动态注册新的Bean定义。

BeanDefinitionRegistryPostProcessor`在Spring容器加载Bean的定义之后、BeanFactoryPostProcessors之前被调用。这样可以在BeanFactoryPostProcessors执行前进行更早的Bean定义的处理。

需要注意的是,BeanFactoryPostProcessorBeanDefinitionRegistryPostProcessor是在Spring容器启动过程中调用的,它们对已经实例化的Bean没有直接的影响。如果需要对已经实例化的Bean进行修改或增强,可以使用BeanPostProcessor接口

BeanPostProcessor

Bean后处理器-BeanPostProcessor

Bean被实例化后,到最终缓存到名为singletonObjects单例池之前,中间会经过Bean的初始化过程,例如:属性的填充、初始方法init的执行等,其中有一个对外进行扩展的点BeanPostProcessor,我们称为Bean后处理。跟上面的Bean工厂后处理器相似,它也是一个接口,实现了该接口并被容器管理的BeanPostProcessor

会在流程节点上被Spring自动调用。

使用实例:

FactoryBean

1、本身MyFactoryBean实现了FactoryBean接口,是一个bean可以通过getBean获取

2、可以返回一个被spring识别的bean

3、如果通过getBean(beanName)获取,返回的是getObject返回的对象

4.&beanname获取的是本身的bean

5.通过type可以得到本身的bean

6.当你实现了 FactoryBean 接口的类并将其注册为 Spring 容器中的一个 Bean 时,Spring 会自动回调 FactoryBean 的方法来创建和管理实际的 Bean 实例。

FactoryBean 接口定义了以下三个方法:

  1. getObject(): 这个方法返回实际的 Bean 对象,它负责创建或返回你想要的对象实例。

  2. getObjectType(): 这个方法返回 getObject() 方法创建的对象的类型。它允许 Spring 在需要的时候确定所创建的对象的类型,并进行相应的类型检查和处理。

  3. isSingleton(): 这个方法指示返回的对象是否是单例。如果返回 true,则对象是单例,Spring 将缓存并重用 getObject() 方法返回的对象;如果返回 false,则对象是每次请求都会创建一个新的实例。

一些常用的Aware接口

ApplicationContextAware使用例子:

ApplicationContextAware 接口是 Spring 框架提供的一个扩展接口,用于在自定义组件(如 Bean、类)中获取 Spring 应用上下文(ApplicationContext)的引用。

当一个类实现了 ApplicationContextAware 接口并注册为 Spring 容器中的 Bean时,Spring 在初始化该 Bean 实例时会自动调用 ApplicationContextAware 接口的 setApplicationContext() 方法,将当前的 ApplicationContext 传递给该 Bean。

 @Override                                                                                              public void setApplicationContext(ApplicationContext context) throws BeansException {       
 this.applicationContext = context;  
     }

ImportBeanDefinitionRegistrar

通过实现 ImportBeanDefinitionRegistrar 接口,你可以在运行时动态地注册额外的 Bean 定义,并根据条件灵活地调整 Spring 容器中的Bean配置。可以把beanDefiniton添加到容器中

public class MyBeanRegistrar implements ImportBeanDefinitionRegistrar {
​
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        // 在这里编写动态注册 Bean 定义的逻辑
        // 例如根据条件生成和注册不同的 Bean 定义
        if (someCondition) {
            BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(ExampleBean.class);
            registry.registerBeanDefinition("exampleBean", builder.getBeanDefinition());
        }
    }
}

BeanDefinitionRegistrar

实现 BeanDefinitionRegistrar 接口的作用是允许你以编程方式注册自定义的 bean 定义到 Spring 容器中,从而控制 bean 的创建和配置过程。

BeanDefinitionRegistrar 接口定义了一个方法 registerBeanDefinitions,通过实现该方法,你可以向 Spring 容器注册自定义的 bean 定义。

Spring IoC 整体流程图

Spring Bean的生命周期

Spring Bean的生命周期 Spring Bean的生命周期是从 Bean 实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储 到单例池中,这个过程被称为Spring Bean的生命周期。
​
Spring Bean的生命周期大体上分为三个阶段:

1. ⚫ Bean的实例化阶段:Spring框架会取出BeanDefinition的信息进行判断当前Bean的范围是否是singleton的, 是否不是延迟加载的,是否不是FactoryBean等,最终将一个普通的singleton的Bean通过反射进行实例化;

2. ⚫ Bean的初始化阶段:Bean创建之后还仅仅是个"半成品",还需要对Bean实例的属性进行填充、执行一些Aware 接口方法、执行BeanPostProcessor方法、执行InitializingBean接口的初始化方法、执行自定义初始化init方法 等。该阶段是Spring最具技术含量和复杂度的阶段,Aop增强功能,后面要学习的Spring的注解功能等、 spring高频面试题Bean的循环引用问题都是在这个阶段体现的;
​
****bean的初始化阶段是由一个办成品到完整bean的过程****
       Spring Bean的初始化过程涉及如下几个过程: 
       ⚫ Bean实例的属性填充
          Spring在进行属性注入时,会分为如下几种情况:
             ⚫ 注入普通属性,String、int或存储基本类型的集合时,直接通过set方法的反射设置进去;
             ⚫ 注入单向对象引用属性时,从容器中getBean获取后通过set方法反射设置进去,如果容器中没有,则先创建被注入对象Bean实例(完成整个生命周期)后,在进行注入操作;
             ⚫ 注入双向对象引用属性时,就比较复杂了,涉及了循环引用(循环依赖)问题  
​
   ⚫ Aware接口属性注入 
   ⚫ BeanPostProcessor的before()方法回调
   ⚫ InitializingBean接口的初始化方法回调 
   ⚫ 自定义初始化方法init回调 
   ⚫ BeanPostProcessor的after()方法回调
​
3. ⚫ Bean的完成阶段:经过初始化阶段,Bean就成为了一个完整的Spring Bean,被存储到单例池 singletonObjects中去了,即完成了Spring Bean的整个生命周期

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值