package com.config.enhance.config;
import com.config.enhance.context.EnhanceContext;
import com.config.enhance.resolver.EnhancePropertyResolver;
import com.config.enhance.resolver.MutablePlaceholdersResolver;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.boot.context.properties.bind.PlaceholdersResolver;
import org.springframework.context.weaving.LoadTimeWeaverAware;
import org.springframework.instrument.classloading.LoadTimeWeaver;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
/**
* @author caojiancheng
* @date 2023-11-26 18:03
*/
@Slf4j
public class ConfigurationPropertiesBinderEnhancer implements LoadTimeWeaverAware, InitializingBean, BeanFactoryAware {
private ConfigurableListableBeanFactory beanFactory;
@Override
public void afterPropertiesSet() throws Exception {
EnhanceContext enhanceContext = EnhanceContext.getInstance();
List<EnhancePropertyResolver> propertyResolvers = enhanceContext.getPropertyResolvers();
if (propertyResolvers == null || propertyResolvers.isEmpty()) {
log.info("enhancePropertyResolvers is empty");
return;
}
//解析@ConfigurationProperties
enhanceConfigurationPropertiesBinder(propertyResolvers);
}
@Override
public void setLoadTimeWeaver(LoadTimeWeaver loadTimeWeaver) {
}
private void enhanceConfigurationPropertiesBinder(List<EnhancePropertyResolver> enhancePropertyResolvers) {
try {
EnhanceContext enhanceContext = EnhanceContext.getInstance();
enhanceContext.setEnhanceBinderStatus(EnhanceContext.ENHANCE_BINDER_FAIL);
//springboot 2.2.0及以上使用,之前的版本没有该bean
String binderBeanName = "org.springframework.boot.context.internalConfigurationPropertiesBinder";
if (!beanFactory.containsBeanDefinition(binderBeanName)) {
log.warn("not internalConfigurationPropertiesBinder,use EnhanceBindingPostProcessor");
return;
}
Object configurationPropertiesBinder = beanFactory.getBean(binderBeanName);
//获取configurationPropertiesBinder的 binder 对象
Field binderField = configurationPropertiesBinder.getClass().getDeclaredField("binder");
binderField.setAccessible(true);
Binder binder = (Binder) binderField.get(configurationPropertiesBinder);
if (binder == null) {
//如果binder为空,要先获取springboot定义的binder
Method getBinder = configurationPropertiesBinder.getClass().getDeclaredMethod("getBinder");
getBinder.setAccessible(true);
binder = (Binder) getBinder.invoke(configurationPropertiesBinder);
}
//获取springboot原生binder的解析方法,解析${xxx}的
Field placeholdersResolverField = binder.getClass().getDeclaredField("placeholdersResolver");
placeholdersResolverField.setAccessible(true);
PlaceholdersResolver springbootResolver = (PlaceholdersResolver) placeholdersResolverField.get(binder);
//将springboot和自定义解析方法组合到一起,先执行springboot的解析,对解析的结果再执行自定义的解析
MutablePlaceholdersResolver mutablePlaceholdersResolver = new MutablePlaceholdersResolver(springbootResolver);
enhancePropertyResolvers.forEach(mutablePlaceholdersResolver::addPlaceholdersResolver);
//将新的解析器设置回binder中
placeholdersResolverField.set(binder, mutablePlaceholdersResolver);
//如果设置成功,设置
enhanceContext.setEnhanceBinderStatus(EnhanceContext.ENHANCE_BINDER_SUC);
} catch (Exception e) {
log.warn("enhanceConfigurationPropertiesBinder error,use EnhanceBindingPostProcessor", e);
}
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
config center
共38个文件
java:27个
factories:2个
gradle:2个
需积分: 5 0 下载量 200 浏览量
2024-05-16
14:51:46
上传
评论 1
收藏 88KB ZIP 举报
温馨提示
config center
资源推荐
资源详情
资源评论
收起资源包目录
config-enhance-master.zip (38个子文件)
config-enhance-master
gradle
wrapper
gradle-wrapper.jar 58KB
gradle-wrapper.properties 200B
src
test
resources
spring
applicationContext.xml 486B
application.yml 897B
META-INF
spring.factories 252B
java
org
springframework
boot
context
properties
EnhanceConfigurationPropertiesBinder.java 383B
com
config
enhance
test
enhance
EnhancePropertyResolverTest.java 955B
EnhancePropertySourceTest.java 1KB
ConfigApplication.java 490B
cases
ValueTest.java 4KB
Bean2.java 474B
Bean1.java 610B
service
impl
UserImpl.java 351B
User.java 126B
config
EnhanceEnvironmentPostProcessor.java 1KB
EnhanceApplicationContextInitializer.java 1KB
NacosPropertySourceConfig.java 525B
UserConfiguration.java 735B
NacosConfig.java 1018B
main
resources
META-INF
spring.factories 124B
java
com
config
enhance
autoconfigure
EnhanceAutoConfiguration.java 1KB
NacosEnhanceAutoConfiguration.java 698B
utils
EnhanceUtils.java 2KB
env
EnhancePropertySource.java 531B
context
EnhanceContext.java 1KB
listener
NacosChangeApplicationListener.java 1KB
resolver
EnhancePropertySourcesPropertyResolver.java 1KB
EnhancePropertyResolver.java 879B
MutablePlaceholdersResolver.java 1KB
config
ConfigurationPropertiesBinderEnhancer.java 4KB
EnhancePrePostProcessor.java 2KB
EnhanceBindingPostProcessor.java 3KB
EnhancePostPostProcessor.java 4KB
gradlew.bat 3KB
build.gradle 2KB
settings.gradle 37B
gradlew 6KB
.gitignore 103B
共 38 条
- 1
资源评论
m0_46375122
- 粉丝: 0
- 资源: 29
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 数据库管理工具:dbeaver-ce-23.1.2-stable.x86-64.rpm
- SQL导入MySQL数据库的源代码
- 基于MySQL的气象设备管管理,依托VB语言开发黄金
- 数据库管理工具:dbeaver-ce-23.1.1-macos-x86-64.dmg
- 一个开源AI视频生成器
- 数据库管理工具:dbeaver-ce-23.1.1-macos-aarch64.dmg
- 练功房角色小企鹅练功房角色小企鹅
- 数据库管理工具:dbeaver-ce-23.1.0-stable.x86-64.rpm
- 数据库管理工具:dbeaver-ce-23.1.0-macos-x86-64.dmg
- 数据库管理工具:dbeaver-ce-23.1.0-macos-aarch64.dmg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功