介绍
今天聊一聊spring中很重要的两个扩展点BeanPostProcessor和BeanFactoryPostProcessor,spring之所以如次强大,是因为它提供了丰富的功能给我们使用,但是我觉得最强大的是它扩展点,因为有了各种扩展点,我们才能去开发一些自己的需求,一个框架的强大之处也在于它能否灵活的配置,能够支持很好的扩展。
我们基于spring进行业务开发时,无非做的就是编写各种bean,注入各种bean,编写配置类等工作,如果没有一些特殊的需求,我们基本上不用去使用spring的扩展点,spring已有的功能基本能满足我们的需求,但是如果需要深度的开发,比如整合一些中间件,进行一些定制化的开发,那么它本身提供的实现可能就满足不了需求或者不适合,所以这时候就需要我们使用扩展点。
简单是因为有复杂的实现
我们使用spring进行项目开发的时候,可以说,万物皆是bean
,我们的工作也是写bean
,然后注入bean
,传统的MVC架构中,使用spring的话无非就是Controller层注入Service层,Service层注入Dao层,使用的注解无非也就是@Controller
,@Service
,@Repository
,@Component
,@Autowired
等,项目中的配置类会使用@Configuration
,然后整个项目就能运行起来,开发效率十分高,如果在没有spring的时候,那么就会变得很复杂,因为有了spring,所以一切都变得简单。
能够简单的使用spring,完全得益于spring的底层设计,不过spring的底层是十分的复杂,我们使用@Component
标注类,这个类就会被组装成bean注册进IOC容器中,我们使用@Autowired
,它就能注入我们想要的bean,这一切都归功于spring的底层,我们今天主要来说BeanPostProcessor和BeanFactoryPostProcessor。
BeanFactoryPostProcessor
BeanFactoryPostProcessor是bean进行实例化前的扩展点,实例化就是创建对象实例,通俗一点就是new,既然还没有实例化,那么此时的bean就处在定义阶段,在spring中叫做BeanDefinition
,也就是bean的定义信息,这些信息来自于我们定义的bean信息,比如通过XML
文件定义bean,通过注解
定义bean,然后这些信息会被组装进BeanDefinition
中,当然我们也可以直接将属性写进BeanDefinition
,BeanFactoryPostProcessor阶段就可以对BeanDefinition
进行一些配置,比如添加属性,设置bean的作用域,是否懒加载等等,在spring底层用得很多多的ConfigurationClassPostProcessor
,它是BeanFactoryPostProcessor的一个实现,它的作用是在spring启动时处理@Configuration
标注的类,为后续的操作奠定一个基础,后续的很多bean的注入都是要依赖于它。
总而言之,BeanFactoryPostProcessor阶段的作用就是操作BeanDefinition
,注册BeanDefinition
,以方便后续bean的实例化,如果我们在使用中需要对Bean的元信息进行进行一些定制化,那么我们就可以实现BeanFactoryPostProcessor。
BeanPostProcessor
在bean的元信息定义完成并添加道BeanFactory中去后,就需要对bean进行实例化,因为只有实例化后的bean才能使用,BeanDefinition
是不能被直接使用的,它只是一些元信息,就好比我们要使用数据库的连接池,那么数据库的JDBC连接串,用户名,密码,最大连接数这些就是元信息,但是我查询数据要使用的是连接池中的连接实例,同理,spring中要使用某个组件,那么使用的是它的对象实例,所以就需要进行实例化,那么实例化后,我们可能需要对bean做一些操作,BeanPostProcessor就是对实例化后的bean做一些操作。
BeanPostProcessor有很多实现,比如我们通过@Autowired注入bean时,那么就会用到AutowiredAnnotationBeanPostProcessor
,它会对@Autowired标注的字段,setter方法,构造函数进行解析,然后实现注入,如果我们使用@Resource注入Bean时,会用到CommonAnnotationBeanPostProcessor
,当我们使用事物时,会用到AnnotationAwareAspectJAutoProxyCreator
,这些都是它的实现,从这里可以看出,spring的设计时灵活的,可扩展的,当引入一些新的功能,那么直接去实现相应的扩展就行,这个阶段的bean时实例化后的bean,我们可以进行一些操作,比如检查Bean实例的状态或配置是否正确,并对其进行必要的修正或补充,也可以执行一些初始化方法。
总结
上面我们对BeanFactoryPostProcessor和BeanPostProcessor进行了简单的讲解,BeanFactoryPostProcessor的主要作用就是对BeanDefination进行操作,BeanPostProcessor主要是对实例化后的bean进行操作,spring之所以如此强大,就是因为它的扩展点和丰富的功能才使得它十分复杂,如果没有这些,那么spring其实就是将bean的实例放入一个Map中,仅此而已,但是因为有了这些扩展点,它才成为了最强大的Java开发框架。