自动装配如何决定使用哪个 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,它们现在可以使用字段注入或构造注入自动装配。创建它时还需要考虑 lazy
和 optional
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.
进一步阅读:
场景: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,它们现在可以使用字段注入或构造注入自动装配。创建它时还需要考虑 lazy
和 optional
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.
进一步阅读: