1. context:annotation-config 作用
隐式地向Spring容器中注入以下4 个 BeanPostProcessor :
- AutowiredAnnotationBeanPostProcessor : 用来识别处理@Autowired和@Value注解
- CommonAnnotationBeanPostProcessor: 用来识别处理@Resource 、@PostConstruct、@PreDestroy等注解
- PersistenceAnnotationBeanPostProcessor: 用来识别和处理@PersistenceContext注解
- RequiredAnnotationBeanPostProcessor: 用来识别和处理@Required的注解
具体参考如下ContextNamespaceHandler :
public class ContextNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
this.registerBeanDefinitionParser("property-placeholder", new PropertyPlaceholderBeanDefinitionParser());
this.registerBeanDefinitionParser("property-override", new PropertyOverrideBeanDefinitionParser());
this.registerBeanDefinitionParser("annotation-config", new AnnotationConfigBeanDefinitionParser());
this.registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser());
this.registerBeanDefinitionParser("load-time-weaver", new LoadTimeWeaverBeanDefinitionParser());
this.registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());
this.registerBeanDefinitionParser("mbean-export", new MBeanExportBeanDefinitionParser());
this.registerBeanDefinitionParser("mbean-server", new MBeanServerBeanDefinitionParser());
}
}
一般来说,这些注解比较常用. 为了避免繁琐, spring给我们提供了<context:annotation-config/>
来简化配置方式. 不过我们使用注解一般都会配置<context:component-scan base-package=”XX.XX”/>
自动包扫描, 该配置项其实也注入了上述4个BeanPostProcessor,因此当使用 <context:component-scan/>
后,就可以将<context:annotation-config/>
移除了。
2. context:component-scan 作用
它不仅启用了对类包进行扫描, 将注解类的Bean注册到容器,同时还具有<context:annotation-config/>
的功能, 即向容器中注入以上4个BeanPostProcessor .
具体参考上述ContextNamespaceHandler.
3. mvc:annotation-driven
相当于注册了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,可以还配置一些messageconverter。即解决了@Controller注解的使用前提配置。
具体参考如下MvcNamespaceHandler :
public class MvcNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
this.registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
this.registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser());
this.registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser());
this.registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser());
this.registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser());
}
}
4. 官方介绍
- <mvc:annotation-driven/>
<mvc:annotation-driven/> is a tag added in Spring 3.0 which does the following:
1. Configures the Spring 3 Type ConversionService (alternative to PropertyEditors)
2. Adds support for formatting Number fields with @NumberFormat
3. Adds support for formatting Date, Calendar, and Joda Time fields with @DateTimeFormat, if Joda Time is on the classpath
4. Adds support for validating @Controller inputs with @Valid, if a JSR-303 Provider is on the classpath
5. Adds support for support for reading and writing XML, if JAXB is on the classpath (HTTP message conversion with @RequestBody/@ResponseBody)
6. Adds support for reading and writing JSON, if Jackson is o n the classpath (along the same lines as #5)
- <context:annotation-config/>
Looks for annotations on beans in the same application context it is defined and declares support for all the general annotations like @Autowired, @Resource, @Required, @PostConstruct etc etc.
<context:annotation-config> does NOT search for @Component, @Controller, etc.
- <context:component-scan>
<context:component-scan> DOES search for those @Component annotations, as well as the annotations that <context:annotation-config/> does.
there are other "annotation-driven" tags available to provide additional functionality in other Spring modules. For example, <transaction:annotation-driven /> enables the use of the @Transaction annotation, <task:annotation-driven /> is required for @Scheduled