2

聊聊Spring扩展点BeanPostProcessor和BeanFactoryPostProcessor - 刘牌

 2 years ago
source link: https://www.cnblogs.com/steakliu/p/17275263.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

今天聊一聊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开发框架。

image

今天的分享就到这里,感谢你的观看,我们下期见!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK