Java 如何通过@ConfigurationProperties注释获取属性,从而动态创建一些bean并将其提供给spring?

Java 如何通过@ConfigurationProperties注释获取属性,从而动态创建一些bean并将其提供给spring?,java,spring,spring-boot,Java,Spring,Spring Boot,我创建了一个dynamicDatasource扩展了AbstractRoutingDataSource。在这种情况下,我通过@ConfigurationProperties从属性文件中动态获取一个custome名称。然后我使用@Bean创建我的dynamicDatasource。 它成功了。下一步,我想我需要为每个数据源创建DataSourceTransactionManager。所以,我需要动态创建这些bean,给它们一个名称,然后给它们一个spring。 问题是当我试图创建一个bean时,它

我创建了一个dynamicDatasource扩展了AbstractRoutingDataSource。在这种情况下,我通过@ConfigurationProperties从属性文件中动态获取一个custome名称。然后我使用@Bean创建我的dynamicDatasource。 它成功了。下一步,我想我需要为每个数据源创建DataSourceTransactionManager。所以,我需要动态创建这些bean,给它们一个名称,然后给它们一个spring。 问题是当我试图创建一个bean时,它通过@bean实现BeanDefinitionRegistryPostProcessor接口,如下所示

    @Bean
public BeanDefinitionRegistryPostProcessor dynamicDatasourceManagerRegister() {
    DynamicDataSourceManagerRegister dynamicDataSourceManagerRegister = new DynamicDataSourceManagerRegister();
    dynamicDataSourceManagerRegister.setDynamicDatasourceProperties(dynamicDatasourceProperties);
    dynamicDataSourceManagerRegister.setApplicationContext(applicationContext);
    return dynamicDataSourceManagerRegister;
}
我得到的dynamicDatasourceProperties为null。如您所见,我希望使用dynamicDatasourceProperties获取动态名称,并使用applicationContext获取依赖项

我的问题是:

  • 为什么我在尝试创建数据源时可以通过@Bean获取dynamicDatasourceProperties,但在尝试创建BeanDefinitionRegistryPostProcessorbean时却无法获取?因为装货单 当我试图搜索它时,有人说@Value等比@Bean晚,但在我的情况下,这是不正确的
  • 我可以通过spring动态获取我的属性来创建bean并给它们命名吗?我知道我可以创建PropertiesUtil来获取我的属性,但我正在尝试通过spring实现它
  • 主要代码:

    
    @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;
    }
    }
    
    总代码在这里,

    谢谢你