自动装配如何决定使用哪个 context/configuration 文件

How is autowired deciding which context/configuration file to use

场景:Spring Mvc 应用程序 xml配置文件(自动扫描和设置 mvc 调度程序 - 标准配置)。还有 Java 配置文件 (在自动扫描包中)和一个 bean,我们称之为 A。然后我们有 RestController,它使用 @autowired 注释注入 bean A,然后以某种方式在控制器中使用这个对象。

问题:自动装配注解如何知道在java注解配置文件中寻找bean? 如果我的理解是正确的,控制器中用于自动装配的上下文应该从 xml 文件和所有自动扫描的 类 (用组件注释)创建 - 那么这是如何工作的以及它是如何工作的从 java 配置文件访问 bean?

是按需bean注入

Spring 查找所有配置 类,从这些 类 它开始扫描包和 XML 文件以创建 bean。

扫描的时候如果发现需要创建一个特定的bean就会尝试去创建那个bean,创建的时候可能会遇到这个bean依赖于其他的bean,现在会尝试创建其他的依赖bean .一旦创建了依赖 bean,它们现在可以使用字段注入或构造注入自动装配。创建它时还需要考虑 lazyoptional bean。 Spring 根据需要遵循 bean 创建路径,如果您在扫描器中提供包名称,那么这也可以创建一个循环。

对于 XML 事情变得更加复杂,例如,XML bean 可能依赖于基于包扫描器,反之亦然,然后 spring 必须遍历每个 XML 文件以查看如何创建该 bean。

来自 @Configuration 的 javadoc:

@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Configuration

Indicates that a class declares one or more @Bean methods and may be processed by the Spring container to generate bean definitions and service requests for those beans at runtime.

因此,当您的 @Configuration class 位于 <context:component-scan/> 定义的 base-packages 之一时,它将被扫描为 @Component 18=]配置。

如果您希望 @Configuration class 在没有 XML 配置的情况下工作,您需要使用 AnnotationConfigApplicationContext.

初始化上下文

示例web.xml

<web-app>
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>
            org.springframework.web.context.support.AnnotationConfigWebApplicationContext
        </param-value>
    </context-param>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.acme.AppConfig</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- Declare a Spring MVC DispatcherServlet as usual -->
    <servlet>
        <!-- Configuration goes here -->
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>


注:

来自 Spring Framework Reference:

Annotation injection is performed before XML injection. Thus, the XML configuration overrides the annotations for properties wired through both approaches.


进一步阅读: