相关疑难解决方法(0)

使用 BeanDefinitionRegistryPostProcessor 创建 N 个 bean

我试图创造ň动态使用豆类的数量BeanDefinitionRegistryPostProcessor。基于这个问题,我选择将其BeanDefinitionRegistryPostProcessor用于我的用例。

我在我的中定义了以下内容application.yml

app:
  downstream-services:
    rest:
      jsonPlaceHolder:
        url: https://jsonplaceholder.typicode.com/todos
        api-type: io.mateo.dynamicbeans.JsonPlaceHolderApi
Run Code Online (Sandbox Code Playgroud)

ConfigiruationProperties在这里连接到一个类:https : //github.com/ciscoo/dynamicbeans/blob/master/src/main/java/io/mateo/dynamicbeans/FeignConfigurationProperties.java

然后我想注入ConfigiruationProperties该类以及我在此处定义的工厂 bean:https : //github.com/ciscoo/dynamicbeans/blob/master/src/main/java/io/mateo/dynamicbeans/FeignClientAutoConfiguration.java

所以现在我有以下几点:

https://github.com/ciscoo/dynamicbeans/blob/master/src/main/java/io/mateo/dynamicbeans/FeignClientFactoryPostProcessor.java

@Component
public class FeignClientFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    private final FeignConfigurationProperties properties;
    private final FeignClientFactory feignClientFactory;

    public FeignClientFactoryPostProcessor(FeignConfigurationProperties properties, FeignClientFactory feignClientFactory) {
        this.properties = properties;
        this.feignClientFactory = feignClientFactory;
    }

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        properties.getDownstreamServices().getRest().forEach((beanName, props) -> makeClient(beanName, props, registry));
    }

    @Override
    public void …
Run Code Online (Sandbox Code Playgroud)

spring spring-boot

7
推荐指数
1
解决办法
1059
查看次数

从属性文件创建 Spring Boot 动态 Bean

如何根据application.yml文件动态定义bean?

例如,YAML 文件如下所示:

service:
   host: http://localhost:8080/
   account:
     url: /account
     content-type: application/json
   registry:
     url: /registry
     content-type: application/xml
Run Code Online (Sandbox Code Playgroud)

这将动态创建两个HttpHeaders带有Content-Type标头集的。

下面是我现在定义 bean 的方式:

@Bean
public HttpHeaders accountHeaders(
    @Value("${service.account.content-type}") String contentType
) {
    HttpHeaders headers = new HttpHeaders();
    headers.set(HttpHeaders.CONTENT_TYPE, contentType);
    return headers;
}

@Bean
public HttpHeaders registryHeaders(
    @Value("${service.registry.content-type}") String contentType
) {
    HttpHeaders headers = new HttpHeaders();
    headers.set(HttpHeaders.CONTENT_TYPE, contentType);
    return headers;
}
Run Code Online (Sandbox Code Playgroud)

如果我需要添加更多端点,我需要复制和粘贴这些 bean,我想避免这种情况。

注意:这些动态 bean 不需要任何其他 bean。我不确定这是否有所作为。它只需要加载配置。

spring spring-boot

3
推荐指数
3
解决办法
1万
查看次数

在 BeanDefinitionRegistryPostProcessor 中访问弹簧加载的属性

如何访问由<context:property-placeholder>in加载的属性BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry

我无法使用用 注释的字段@Value,因为它们似乎没有被初始化(它们的值为空)。

spring spring-bean property-placeholder

3
推荐指数
1
解决办法
1009
查看次数