8

Spring(可能还有其他 DI 容器,但我使用的是 Spring)识别 @DependsOn 注释。您可以使用它来识别必须在此 bean 之前启动的任何其他 bean,例如

@Component
@DependsOn({"initiatedFirst", "initiatedSecond"})
public class InitiatedThird {

//...

是否有类似的注释意味着必须在注释 bean 之后启动提供的 bean?例如

@Component
@DependencyOf({"initiatedSecond", "initiatedThird"})
public class InitiatedFirst {

//...

当您无法访问 bean 的源代码/初始化但想事先配置一些其他 bean 时,我会认为这将是一个非常常见的用例。是否存在这样的注释?

4

1 回答 1

6

不,但如果您无权访问代码,您仍然可以使用 xml

<bean id="initiatedSecond" class="..." depends-on="initiatedFirst" />
<bean id="initiateThird" class="..." depends-on="initiatedSecond" />

等等...

编辑

其他选项是使用 a BeanFactoryPostProcessor通过添加依赖项BeanDefiniton.setDependsOn(String[])

例如(未测试)

public class DependencyConfigurer implements BeanFactoryPostProcessor {

    private Map<String, String[]> dependencies = new HashMap<String, String[]>();

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        for (String beanName : dependencies.keySet()) {
            BeanDefinition bd = beanFactory.getBeanDefinition(beanName);
            bd.setDependsOn(dependencies.get(beanName));
        }

    }

    public Map<String, String[]> getDependencies() {
        return dependencies;
    }

    public void setDependencies(Map<String, String[]> dependencies) {
        this.dependencies = dependencies;
    }

}

另一种选择是让一个众所周知的早期实例化 bean 依赖于您的 bean。(看起来很难看,但会起作用)。

最后,您可以覆盖AbstractApplicationContext.onRefresh()并实例化您的 bean。

于 2013-04-30T10:36:07.493 回答