Spring Boot中使用多个配置对象时的依赖关系解析

时间:2015-01-13 05:42:36

标签: java spring spring-mvc tomcat spring-boot

我们正在修改我们的Web应用程序以使用Spring Boot(嵌入式tomcat)。我们正在尝试在启动Spring应用程序(SpringApplication.run(new Object[]{ConfigClass1, ConfigClass2..}, args)时使用多个配置对象,这些应用程序之前基于XML配置。配置类具有相互依赖关系,配置为在属性上使用@Autowired。但是在创建bean时没有注入一些依赖项。例如,

SpringApplication.run(new Object[]{ClassB.class, ClassA.class}, args);

@Configuration
class ClassA {

    @Autowired
    private B1D1 b1Dependency;

    @Bean
    public A1D1 a1DependencyBean() {
        A1D1 a1d1 = new A1D1(b1Dependency);
        retun a1d1;
    }
}

@Configuration
class ClassB {
    @Bean
    public B1D1 b1DependencyBean() {
        return new B1D1();
    }
}

创建a1DependencyBean时,b1DependecyBean未注入ClassA的实例。颠倒类的顺序也没有任何区别。

我的理解是spring会在根据@Bean注释创建bean之前解析配置类的依赖关系。在配置中使用注释时是否有不同的方法?

同样在使用spring boot时,bean是否会根据全局应用程序上下文和servlet上下文进行初始化?如果是这样,决定bean关联的上下文的标准是什么?


相应真实类的主要功能(Bean方法)如下所示。

ClassA的

This class has most of the initializations that we do for the web application. 
It contains @Bean annotated methods which creates ServletRegistrationBeans, implementations of ApplicationContextAware interface, 
RequestMappingHandlerAdapter, Interceptors, MimeFileTypeMap, EmbeddedServletContainerCustomizer 

ClassB的

This class generates the beans required for customizing the views. It contains customized MappingJackson2HttpMessageConverter bean, 
and org.springframework.web.servlet.View implementations for different content types.

我们看到的问题是没有注入View实现bean(ClassA中的@Autowired属性)(在ClassB中尚未调用@Bean方法) 从ClassA生成拦截器bean时(使用@Bean方法)。

有没有办法确定每个bean分配给哪个上下文(root或Servlet Context)? 是否可以覆盖和自定义指定的上下文?

0 个答案:

没有答案