[英]Spring create list of beans based on properties
在一个简单的 Spring 启动应用程序中,我的组件如下所示:
@Data
@Component
public class GenericHandler {
private String path;
private HandlerType type;
}
我的属性可能如下所示:
my.handlers[0].path='/vol1/abc'
my.handlers[0].type='Single'
my.handlers[1].path='/vol1/dora'
my.handlers[1].type='MultiSequence'
我尝试使用带有@ConfigurationProperties(prefix="my.handlers")
的GenericHandler 类进行装饰,并使用获取服务中所有组件实例的列表
@Autowired
private List<GenericHandler> handlers;
但这只创建了一个组件,完全忽略了属性值。
如何根据my.handlers
属性条目获取一个组件实例?
@Component
@ConfigurationProperties(prefix="my.handlers")
@Data
public class GenericHandlerWrapper {
private List<GenericHandler> handlers;
...
}
autowire
GenericHandlerWrapper
更新
@zoolway
在评论中指出的那样,要使问题中的属性按原样工作,应将@ConfigurationProperties(prefix="my.handlers")
更改为@ConfigurationProperties(prefix="my")
那是不可能的。 可以做的是:
@Data
@Component
public class GenericHandler {
private List<String> path;
private List<HandlerType> type;
}
我以不同的方式处理了类似的问题。 我创建了一个工厂和一个接口。 工厂将持有该接口的不同实现在您的情况下, GenericHandler
将是您的接口。 然后你编写任意数量的接口实现,每个实现都被声明为一个组件。 因此,Spring 将在启动时将其实例化为 bean(您可能会使用@Lazy(false)
强制在启动时实例化),使用我编写的一些基础设施,该接口的每个 bean 都会自行插入到其工厂中。 然后在任何 bean 中代码的任何部分,您都可以使用工厂访问具体实现(例如,基于您的属性“类型”)。 美妙之处在于您不需要在编写时将所有实现注入到您的 bean 中,而是在运行时动态访问所需的实现。 我发现这是一个有用的模式,并创建了一个为您完成大部分工作的基础架构,并将其发布为一个名为 MgntUtils 的开源库。 可以在此处找到该想法的详细描述(包括对库的引用)。 还可以在此处的库 Javadoc 中找到有关如何使用它的示例的详细说明。 该库以Maven 工件和Github的形式提供(带有源代码和 Javadoc)。 也可以在此处找到有关 MgntUtils 库的一般文章
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.