spring属性绑定
Spring的属性绑定有很多种方式,比如:
- @Value+spel表达式;
- @ConfigurationProperties + spring-boot-configuration-processor依赖;
- 动态注册BeanPostProcessor,在定义的配置bean装配期间依赖Binder or DataBinder完成属性的绑定;
每一种方式都有各自的优缺点,下面简单对比下。
- @Value+spel表达式
这种方式使用灵活,针对个别属性的IOC很简单方便。但是在属性数量较多的情况下,每一个属性都需要配置表达式,用起来就比较麻烦了。同时,缺乏对数据的校验能力,没法在注入过程中对数据做类似jsr303校验。适合简单,数量较少的场合。
- @ConfigurationProperties&动态注册BeanPostProcessor的方式
两者都会生成配置bean,将散列的属性聚合在一个声明的bean中进行收束,相比@Value有很大的进步。但是@ConfigurationProperties的方式要更灵活+编码量也会更少。不过其需要依赖springboot,对于spring环境的要求更高一点。动态注册的方式,仅依赖spring,相对依赖更能往下兼容一些。@ConfigurationProperties支持对注入内容做jsr303校验。
dubbo的配置绑定是用的动态注册Bean以及BeanPostProcessor的方式,基于DataBinder完成属性的绑定,依赖的是spring-context中的能力。@ConfigurationProperties是通过ConfigurationPropertiesBindingPostProcessor驱动Binder完成属性的绑定。本质上两者差不多,不过@ConfigurationProperties的实现更通用,依赖的是spring-boot提供的能力。
spring-boot-configuration-processor还可以针对标注了@ConfigurationProperties的配置属性文件动态生成对应的spring-configuration-metadata.json文件,方便使用时的动态提示与属性关联。
参考资料: