品牌型号:联想ThinkPad X1
系统:Windows 10 家庭版
软件版本:Spring 5.3.7
Spring框架中,依赖注入DI很重要,是每个Java程序员入门时必须要掌握的技能,很多人对于Spring框架只停留在了会用的层面,忽略了Bean注入容器后的深层处理逻辑。Bean在创建之后还需要对Bean实例的属性进行填充、执行BeanPostProcessor方法、执行InitializingBean接口的初始化方法等,Bean的初始化阶段可以说是Spring中很具有技术含量和复杂度的阶段,接下来我就围绕着“Spring注入bean的三种方式”“Spring后置处理器”给大家进行讲解。
一、Spring注入bean的三种方式
依赖注入是Spring的核心,我们通过Spring ioc思想,将对象创建的权力交给Spring管理后,有时候需要在某个类中调用依赖的对象,如果我们通过传统new对象的方式,有点违背了Spring IOC思想,增加了代码的耦合度。

但是如果我们在定义了依赖对象的引用之后,没有进行初始化,在项目运行的时候会出现NullPointerException异常。Spring给我们提供了三种注入bean的方式。我们可以通过set方法进行注入,找到要注入对象的类,创建依赖对象的引用,然后给这个引用创建一个setXxx方法,在配置文件中通过property属性或者使用autowire完成依赖注入。

Spring也支持构造器注入,我们在需要注入对象的类中添加一个有参构造,参数是被依赖对象的引用,然后我们在配置文件中通过constructor-arg完成依赖注入。

还有一种方式就是通过注解注入,可以使用@Autowired或者@Resource等注解直接标注字段或方法,Spring中配置自动扫描就可以了,不需要手动配置构造器或者setter方法。
二、Spring bean后置处理器
Bean实例化之后,通过反射创建对象,到Bean成为一个完整对象并存储到单例池的过程被称为Spring的生命周期。在生命周期上可以分为三个阶段,实例化阶段的时候,Spring会取出BeanDefinition的信息判断当前Bean范围是否是singleton、是否是懒加载、是否不是FactoryBean等,最后将一个普通的singleton的Bean通过反射进行实例化。
Bean被实例化之后,在被缓存到singletonObjects单例池之前,会经过Bean的初始化阶段,例如Bean的属性填充、初始化方法init的执行等,这其中有一个对外进行扩展的点BeanPostProcessor,我们一般称为Bean后处理器,BeanPostProcessor是一个接口,会被Spring自动调用。

我们可以自定义一个类实现BeanPostProcessor接口进行一个快速入门测试,实现接口后,复写接口中的两个默认方法然后运行后查看控制台打印结果。

既然已经知道了bean后置处理器的大概用法,我们其实就可以通过后处理器介入到Bean的整个实例化流程中,例如可以达到动态注册BeanDefinition、动态修改Definition以及动态修改Bean的作用域。当然,Spring Bean后处理器不止BeanPostProcessor,还有一个BeanFactoryPostProcessor,它是在BeanDefinitionMap填充完毕、Bean实例化之前执行。
以上就是Spring注入bean的三种方式,Spring bean后置处理器的全部内容了。依赖注入是Spring的核心,注入Bean的方式有三种,可以通过setter方法进行注入,也可以通过构造器完成注入,还可以通过@Autowired或者@Resource等注解标记后Spring自动扫描完成依赖注入,使用注解可以不需要手动配置构造器或者setter方法。Spring的后处理器可以让我们介入到Bean的整个实例化流程中,主要有两种后处理器,一个是BeanFactoryPostProcessor,一个是BeanPostProcessor,只不过BeanPostProcessor一般在Bean实例化之后、填充到单例池singletonObjects之前执行。