我试图创造ň动态使用豆类的数量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
所以现在我有以下几点:
@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) 如何根据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。我不确定这是否有所作为。它只需要加载配置。
如何访问由<context:property-placeholder>in加载的属性BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry。
我无法使用用 注释的字段@Value,因为它们似乎没有被初始化(它们的值为空)。