gpt4 book ai didi

java - @DependsOn 注解的逆

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:35 29 4
gpt4 key购买 nike

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

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

//...

是否有类似的注解表示提供的 bean 必须在注解的 bean 之后启动?例如

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

//...

我原以为这将是一个非常常见的用例,当您无权访问 bean 的源代码/初始化但想预先配置一些其他 bean 时。这样的注解存在吗?

最佳答案

不,但是如果您无权访问代码,您仍然可以使用 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。

关于java - @DependsOn 注解的逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16295526/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com