Spring配置和运行时分离

时间:2012-09-10 15:30:34

标签: spring architecture

使用Spring时,将运行时数据合并到bean构造中相当麻烦。虽然有一些技术可以避免这种分离,但我觉得它是有原因的。我的问题是,这是否是一个已知的范例,是否有任何文学讨论它。我个人认为它有优点和缺点,取决于应用程序的动态性。

1 个答案:

答案 0 :(得分:3)

至少有五种众所周知的方法可以将运行时数据传递给bean配置:

  • 使用ApplicationContextInitializerPropertySources添加到Enviroment
  • 使用SPEL注入依赖项。
  • 使用FactoryBeans.
  • 使用factory-beanfactory-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对它有好处。

如果需要根据运行时选择实现者,则需要编写代码来选择它们,然后通知容器。

例如,使用PropertySourcesPropertyPlaceholderConfigurer

  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实现,这取决于容器何时已刷新。 (没有破坏和刷新)。

据我所知,该框架没有提供明确的方法。