context:annotation-config和 context:component-scan和mvc:annotation-driven区别

6 篇文章 0 订阅

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值