我的系统中不断出现一种情况,我正在寻找一个好的代码/配置模式。我还没有想出一个让我开心的。
该系统是基于弹簧的,几乎所有的 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 本身。