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
包含了以下重要的属性:
- 类型(Type):指定要创建的bean的类或接口。
- 作用域(Scope):定义bean的作用域,如单例(Singleton)、原型(Prototype)等。
- 初始化方法(Initialization method):指定bean实例化后要调用的方法。
- 销毁方法(Destruction method):指定bean销毁前要调用的方法。
- 属性值(Property values):设置bean的属性值,包括基本类型、引用类型和集合类型。
- 依赖关系(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定义的处理。
需要注意的是,BeanFactoryPostProcessor
和BeanDefinitionRegistryPostProcessor
是在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
接口定义了以下三个方法:
-
getObject()
: 这个方法返回实际的 Bean 对象,它负责创建或返回你想要的对象实例。 -
getObjectType()
: 这个方法返回getObject()
方法创建的对象的类型。它允许 Spring 在需要的时候确定所创建的对象的类型,并进行相应的类型检查和处理。 -
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的整个生命周期