Java 如何通过@ConfigurationProperties注释获取属性,从而动态创建一些bean并将其提供给spring?
我创建了一个dynamicDatasource扩展了AbstractRoutingDataSource。在这种情况下,我通过@ConfigurationProperties从属性文件中动态获取一个custome名称。然后我使用@Bean创建我的dynamicDatasource。 它成功了。下一步,我想我需要为每个数据源创建DataSourceTransactionManager。所以,我需要动态创建这些bean,给它们一个名称,然后给它们一个spring。 问题是当我试图创建一个bean时,它通过@bean实现BeanDefinitionRegistryPostProcessor接口,如下所示Java 如何通过@ConfigurationProperties注释获取属性,从而动态创建一些bean并将其提供给spring?,java,spring,spring-boot,Java,Spring,Spring Boot,我创建了一个dynamicDatasource扩展了AbstractRoutingDataSource。在这种情况下,我通过@ConfigurationProperties从属性文件中动态获取一个custome名称。然后我使用@Bean创建我的dynamicDatasource。 它成功了。下一步,我想我需要为每个数据源创建DataSourceTransactionManager。所以,我需要动态创建这些bean,给它们一个名称,然后给它们一个spring。 问题是当我试图创建一个bean时,它
@Bean
public BeanDefinitionRegistryPostProcessor dynamicDatasourceManagerRegister() {
DynamicDataSourceManagerRegister dynamicDataSourceManagerRegister = new DynamicDataSourceManagerRegister();
dynamicDataSourceManagerRegister.setDynamicDatasourceProperties(dynamicDatasourceProperties);
dynamicDataSourceManagerRegister.setApplicationContext(applicationContext);
return dynamicDataSourceManagerRegister;
}
我得到的dynamicDatasourceProperties为null。如您所见,我希望使用dynamicDatasourceProperties获取动态名称,并使用applicationContext获取依赖项
我的问题是:
@ConditionalOnBean(DataSource.class)
@EnableSpectProxy(exposeProxy=true,proxyTargetClass=true)
@配置
@EnableConfigurationProperties(DynamicDatasourceProperties.class)
@条件不动产(
prefix=“spring.dynamic.datasource”,
name=“启用”,
havingValue=“true”
)
@Slf4j
@面貌
公共类DynamicDatasourceConfig实现优先级排序、ApplicationContextAware{
私有应用程序上下文应用程序上下文;
@自动连线
私有DynamicDatasourceProperties DynamicDatasourceProperties;
@大约(“@annotation(com.spring.dynamic.datasource.annotation.CurDatasource)”)
周围的公共对象(ProceedingJoinPoint点)抛出可丢弃{
MethodSignature=(MethodSignature)point.getSignature();
Method=signature.getMethod();
CurDatasource dataSourceAnnotation=method.getAnnotation(CurDatasource.class);
if(dataSourceAnnotation!=null){
字符串值=dataSourceAnnotation.value();
if(log.isDebugEnabled()){
log.debug(“切换数据源到{},值);
}
DynamicDataSourceContextHolder.setDataSource(值);
}
试一试{
返回点。继续();
}最后{
DynamicDataSourceContextHolder.clearDataSource();
}
}
@凌驾
public int getOrder(){
//保证事务等切面先执行
返回Integer.MIN_值;
}
@豆子
@ConditionalOnMissingBean(JdbcTemplate.class)
公共SpringJdbcTemplate jdbcTemplate(数据源数据源){
返回新的SpringJdbcTemplate(数据源);
}
@豆子
@初级的
公共数据源数据源(){
字符串defaultDatasource=dynamicDatasourceProperties.getDefaultDatasource();
DataSourceBean=(DataSource)applicationContext.getBean(defaultDatasource);
List datasourceList=dynamicDatasourceProperties.getDatasourceList();
Map maps=新的HashMap();
if(CollectionUtils.isEmpty(datasourceList)){
字符串[]beanNamesForType=applicationContext.getBeanNamesForType(DataSource.class);
for(字符串名称:beanNamesForType){
putIfAbsent(名称,applicationContext.getBean(名称));
}
}否则{
for(字符串名称:datasourceList){
putIfAbsent(名称,applicationContext.getBean(名称));
}
}
返回新的动态数据源(bean、映射);
}
//TODO执行此操作时,dynamicDatasourceProperties为空
/*@Bean
公共BeanDefinitionRegistryPostProcessor dynamicDatasourceManagerRegister(){
DynamicDataSourceManagerRegister DynamicDataSourceManagerRegister=新的DynamicDataSourceManagerRegister();
dynamicDataSourceManagerRegister.setDynamicDatasourceProperties(dynamicDatasourceProperties);
dynamicDataSourceManagerRegister.setApplicationContext(applicationContext);
返回DynamicDataSourceManager注册表;
}*/
@凌驾
public void setApplicationContext(ApplicationContext ApplicationContext)抛出BeansException{
this.applicationContext=applicationContext;
}
}
总代码在这里,
谢谢你