首页 > 解决方案 > 如何自动连接决定使用哪个上下文/配置文件

问题描述

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

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

标签: javaspringspring-mvcautowired

解决方案


从 javadoc 的@Configuration

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

表示一个类声明了一个或多个@Bean方法,并且可以由 Spring 容器处理以在运行时为这些 bean 生成 bean 定义和服务请求。

因此,当您的课程位于您的配置中定义的其中之一时,您的@Configuration课程将被扫描。@Componentbase-packages<context:component-scan/>XML

如果您希望@Configuration类在没有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 框架参考

注解注入在 XML 注入之前执行。因此,XML 配置覆盖了通过这两种方法连接的属性的注释。


延伸阅读:


推荐阅读