1

我的系统中不断出现一种情况,我正在寻找一个好的代码/配置模式。我还没有想出一个让我开心的。

该系统是基于弹簧的,几乎所有的 bean 都是延迟初始化的。有许多不同的主类使用相同的弹簧上下文。每个最终都会通过显式初始化一些 bean 来使用不同的 bean 子集,然后 spring 负责初始化所有依赖项。除了这种情况外,一切都很好。

问题是我的一些 bean 使用一种模式(在 spring 配置中),在该模式中声明了我的业务 bean,然后另一个 bean 依赖它并提供一些外围功能。但是,其他bean的自然依赖是前者,即业务类。

这是一个例子:

<bean id="cache">
  ...
</bean>

<bean id="cacheCuller" class="ScheduledJobBean">
  <property name="scheduler" ref="scheduler"/>
  <property name="jobDetail">
    <bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
      <property name="targetObject" ref="cache"/>
      <property name="targetMethod" value="removeExpiredEntries"/>
      <property name="concurrent" value="false"/>
    </bean>
  </property>
  <property name="repeatInterval" value="300000" />
</bean>

因此,上面的第二个 bean 基本上向调度程序注册了一个触发器,这将导致第一个 bean 上的方法被定期调用。请记住,所有这些 bean 都是懒惰的。如果没有活动的“缓存”客户端 bean,我不想创建“cacheCuller”并初始化“缓存”。我希望spring在需要将其注入依赖项时初始化“缓存”(这很容易),但我也希望它在之后立即初始化“cacheCuller”(这很难)。

我知道我可以将调度逻辑放入“缓存”类中,但我认为将其保留在 spring 配置中会很好。我还想让“缓存”类没有特定于 spring 的代码。如果其他 bean 自然地依赖于“cacheCuller”,这会很容易,但他们不会。

其他领域也会出现同样的情况,例如向 MBeanServer 注册 bean。我想让第二个 bean 注册业务 bean,但如果它不被用作其他(第三个)bean 的依赖项,我不希望它来初始化业务 bean 本身。

4

2 回答 2

6

我认为您正在寻找depends-on

于 2011-07-18T17:55:26.150 回答
0

有许多不同的主类使用相同的弹簧上下文。每个最终都会通过显式初始化一些 bean 来使用不同的 bean 子集,然后 spring 负责初始化所有依赖项。

也许你应该重新考虑这种方法。

您可以将应用程序上下文拆分为多个文件,并让每个主类加载所需的组合。这将使您的应用程序上下文更加模块化并且更容易理解恕我直言(例如消除您所描述的问题)。

于 2011-08-04T10:36:39.683 回答