Java @DependsOn注释的逆运算
Spring(可能还有其他DI容器,但我正在使用Spring)识别@DependsOn注释。您可以使用它来标识必须在此bean之前启动的任何其他bean,例如Java @DependsOn注释的逆运算,java,spring,dependency-injection,Java,Spring,Dependency Injection,Spring(可能还有其他DI容器,但我正在使用Spring)识别@DependsOn注释。您可以使用它来标识必须在此bean之前启动的任何其他bean,例如 @Component @DependsOn({"initiatedFirst", "initiatedSecond"}) public class InitiatedThird { //... 是否有类似的注释,表示提供的bean必须在注释bean之后启动?比如说 @Component @DependencyOf({"initiate
@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" />
另一个选择是使一个众所周知的早期实例化bean依赖于您的bean。(看起来很难看,但会奏效)
最后,您可以重写
AbstractApplicationContext.onRefresh()
并实例化bean。问题在于,我希望导入一个SpringXML文件,其中依赖的bean已经完全配置好。我所说的是尽量减少任何重复配置。我只是添加了所有可以快速看到的选项。
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;
}
}