@DependsOn注释的反转

时间:2013-04-30 08:36:08

标签: java spring dependency-injection

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

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

//...

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

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

//...

我原以为这是一个非常常见的用例,当你无法访问bean的源/初始化但想要事先配置其他bean时。这样的注释是否存在?

1 个答案:

答案 0 :(得分:3)

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

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

依旧......

修改

其他选项是使用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。