使用Spring时,将运行时数据合并到bean构造中相当麻烦。虽然有一些技术可以避免这种分离,但我觉得它是有原因的。我的问题是,这是否是一个已知的范例,是否有任何文学讨论它。我个人认为它有优点和缺点,取决于应用程序的动态性。
答案 0 :(得分:3)
至少有五种众所周知的方法可以将运行时数据传递给bean配置:
ApplicationContextInitializer
将PropertySources
添加到Enviroment
。FactoryBeans.
factory-bean
和factory-method
属性。例如
<bean id="requestAttributeReader" class="example.RequestAttributeReader" />
<bean id="requestInjectedBean" class="example.RequestInjectedBean" scope="request">
<property name="a" value="#{requestAttributeReader.a}" />
</bean>
Class RequestAttributeReader {
public String getA() {
return RequestContextHolder.getAttributes().getAttribute("a");
}
}
修改强>
IoC容器的bean描述文件允许您在应用程序bean上配置实现者。这通常是您要用于具体配置的实现类的静态定义,因此xml对它有好处。
如果需要根据运行时选择实现者,则需要编写代码来选择它们,然后通知容器。
例如,使用PropertySources
和PropertyPlaceholderConfigurer
:
String service = "example.NormalService";
if (BOSS_USERNAME.equals(System.getProperty("user.name")))
service = "example.BossService";
ctx.getEnvironment().getPropertySources().addFirst(new PropertiesPropertySource("service", service));
<bean id="service" class="${service}" />
使用ServiceFactoryBean,外部ServiceFactory,SPEL等可以做同样的事情......
也许,您有兴趣在运行时替换实现,即更改所有bean中的Service实现,这取决于容器何时已刷新。 (没有破坏和刷新)。
据我所知,该框架没有提供明确的方法。