Spring 5 等到后期初始化的 bean 可用,依赖和顺序没有帮助

问题描述 投票:0回答:1

感谢所有帮助。如何等到bean“allAppConfigs”初始化然后初始化bean“pseudoBean1”?对于 PostConstruct-annotated-Method“populateMap”成员“allAppConfigs”需要带有值来填充地图。 我尝试了依赖和不同的命令,阅读spring 5 / 6手册/文档和InitializingBean接口。我认为资源导入为时已晚。也许有一个好的解决方案。预先感谢。

关于Spring注入时的顺序:

  1. (1) PseudoBean1.setApplicationConfigRegistry(...)
  2. (2) PseudoBean1setAllAppConfigs(...)
  3. (然后运行 PostConstruct)
  4. (3) PseudoBean2.setAllAppConfigs(...)

spring.xml:

...
<!-- Objects imported as AppConfig.class -->
<import resource="folder/*.xml">

<util:list id="allAppConfigs" value-type="edu.somepackage.models.AppConfig">
    <ref bean="systemAppConfig">
    <ref bean="someAppConfig">
    <ref bean="springAppConfig">    
</util:list>
...

myFrameWork/spring.xml:

<bean id="pseudoBean2" class="PseudoBean2">
    <property name="allAppConfigs" ref="allAppConfigs" />
</bean>

<bean id="pseudoBean1" class="PseudoBean1">
    <property name="applicationConfigRegistry" ref="pseudoBean2" />
</bean>
public class PseudoBean2 {

    private List<AppConfig> allAppConfigs;
    
    public void setAllAppConfigs(List<AppConfig> allAppConfigs) {
        this.allAppConfigs = allAppConfigs;
    }
    
    public List<AppConfig> allAppConfigs() {
        return this.allAppConfigs;
    }
}
public class PseudoBean1 {

    private PseudoBean2 applicationConfigRegistry;

    private Map<String, AppConfigImpl> map = new HashMap<>();

    private List<AppConfig> allAppConfigs = new ArrayList<>();
    
    public void setApplicationConfigRegistry(PseudoBean2 applicationConfigRegistry) {
        this.applicationConfigRegistry = applicationConfigRegistry;
    }

    public void setAllAppConfigs(List<AppConfig> allAppConfigs) {
        this.allAppConfigs = allAppConfigs;
    }

    @PostConstruct
    protected void populateMap() {
        int i = 1;
        for(AppConfig config : applicationConfigRegistry.allAppConfigs()) {
            map.put("key" + i, config);
            i++;
        }
    }
}
java spring spring-boot dependency-injection spring6
1个回答
0
投票

如果您正确配置了依赖项,则对于像这样的简单用例,您不必使用任何特殊属性,例如

depends-on
order

Spring 自动解析依赖关系并以正确的顺序加载极其复杂的应用程序。如果应用程序上下文导入了两个 XML,那么这应该可以正常工作。

您需要确保应用程序上下文确实拥有您需要的一切。

此外,如果这是一个Web应用程序,Spring Boot会自动创建一个带有自己的ServletContext的DispatcherServlet。在这种情况下,您需要确保导入对于上下文层次结构有意义。

例如,如果根上下文声明

pseudoBean2
allAppConfigs
的定义位于 servlet 上下文中,则它将不起作用,因为 servlet 上下文是根上下文的子级。

© www.soinside.com 2019 - 2024. All rights reserved.