关闭

Spring配置中<context:annotation-config> VS <context:component-scan>

标签: annotation-processorSpring-配置configscandriven
340人阅读 评论(0) 收藏 举报
分类:

Spring 中在使用注解(Annotation)会涉及到< context:annotation-config> 和 < context:component-scan>配置,下面就对这两个配置进行诠释。

1.context:annotation-config

< context:annotation-config> 是用于激活那些已经在spring容器里注册过的bean上面的注解,也就是显示的向Spring注册

AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor

这四个Processor,注册这4个BeanPostProcessor的作用,就是为了你的系统能够识别相应的注解。BeanPostProcessor就是处理注解的处理器。

比如我们要使用@Autowired注解,那么就必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。传统声明方式如下

<bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/> 

如果想使用@ Resource 、@ PostConstruct、@ PreDestroy等注解就必须声明CommonAnnotationBeanPostProcessor。传统声明方式如下

<bean class="org.springframework.beans.factory.annotation. CommonAnnotationBeanPostProcessor"/> 

如果想使用@PersistenceContext注解,就必须声明PersistenceAnnotationBeanPostProcessor的Bean。

<bean class="org.springframework.beans.factory.annotation.PersistenceAnnotationBeanPostProcessor"/> 

如果想使用 @Required的注解,就必须声明RequiredAnnotationBeanPostProcessor的Bean。

同样,传统的声明方式如下:

<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/> 


一般来说,像@ Resource 、@ PostConstruct、@Antowired这些注解在自动注入还是比较常用,所以如果总是需要按照传统的方式一条一条配置显得有些繁琐和没有必要,于是spring给我们提供< context:annotation-config/>的简化配置方式,自动帮你完成声明。


思考1:假如我们要使用如@Component、@Controller、@Service等这些注解,使用能否激活这些注解呢?

答案:单纯使用< context:annotation-config/>对上面这些注解无效,不能激活!


2.context:component-scan

Spring 给我提供了context:component-scan配置,如下

<context:component-scan base-package=”XX.XX”/> 

该配置项其实也包含了自动注入上述processor的功能,因此当使用 < context:component-scan/> 后,就可以将 < context:annotation-config/> 移除了。

通过对base-package配置,就可以把controller包下 service包下 dao包下的注解全部扫描到了!

3.总结

(1):< context:annotation-config />仅能够在已经在已经注册过的bean上面起作用。对于没有在spring容器中注册的bean,它并不能执行任何操作。


(2)除了具有的功能之外,还具有自动将带有@component,@service,@Repository等注解的对象注册到spring容器中的功能。


思考2:如果同时使用这两个配置会不会出现重复注入的情况呢?

答案:因为< context:annotation-config />和 < context:component-scan>同时存在的时候,前者会被忽略。如@autowire,@resource等注入注解只会被注入一次!


彩蛋

< mvc:annotation-driven/>


< mvc:annotation-driven/>从 标签的shecma就能看出来,mvc,主要就是为了Spring MVC来用的,提供Controller请求转发,json自动转换等功能。相比上面的两个shecma是context开头,那么主要是解决spring**容器**的一些注解。

< mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的。
并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)。

在实际开发使用SpringMVC开启这个配置,否则会出现一些功能不能正常使用!

如:@Restcontroller无效, 依然去解析视图

参考资料

Spring < context:annotation-config/> 解说
Spring 开启Annotation < context:annotation-config> 和 < context:component-scan>诠释及区别


欢迎访问我的csdn博客,我们一同成长!

不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

博客首页http://blog.csdn.net/u010648555

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Spring MVC集成其他带来的事务注解无效之context:component-scan扫描使用上的容易忽略的use-default-filters

这两天,在使用公司的框架开发进行数据存储shi
  • GrayWoft
  • GrayWoft
  • 2014-06-19 22:19
  • 4467

spring源码学习之五 </context:component-scan>元素处理过程

概述在spring的配置文件中,通常会配置自动扫描包路径下的bean,而元素即用来实现该功能,下面是一个配置简单实例: <context:exclude-filter type...
  • wenjiangchun
  • wenjiangchun
  • 2016-02-15 17:36
  • 2196

关于component-scan中base-package包含通配符的问题探究

今天在配置Spring的component-scan时,发现了一个有趣的问题。就是在指定base-package时,如果使用了星号通配符*,有时会出现类扫描不到的情况。下面研究一下这个问题。先介绍一下...
  • u012325167
  • u012325167
  • 2017-07-19 15:19
  • 1305

<context:annotation-config> vs <context:component-scan> 的区别

本文摘自stack overflow.详细解释请看如下: http://stackoverflow.com/questions/7414794/difference-between-contexta...
  • dajijidanaizi
  • dajijidanaizi
  • 2016-04-05 15:02
  • 423

Spring MVC: <context:annotation-config> 和 <context:component-scan>区别

在这篇文章中,我将介绍和标签的区别,将来再使用它们的时候能够清楚的知道你在干什么 首先,是用来激活已经在application context中注册的bean。注意,不管你使用那种注册的方式都是可以...
  • maoyeqiu
  • maoyeqiu
  • 2015-10-26 12:30
  • 1068

spring <context:annotation-config> 跟 <context:component-scan>诠释及区别

和 的区别 Difference between vs    是用于激活那些已经在spring容器里注册过的bean(无论是通过xml的方式还是通过package sanni...
  • lzy295481710
  • lzy295481710
  • 2014-08-18 10:16
  • 397

GOOD spring <context:annotation-config> 跟 <context:component-scan>诠释及区别

和 的区别 Difference between vs    是用于激活那些已经在spring容器里注册过的bean(无论是通过xml的方式还是通过package sanning的方式)上...
  • Baple
  • Baple
  • 2013-11-21 18:15
  • 18536

context:annotation-config配置和context:component-scan配置

在基于注解方式配置Spring的配置文件中,你可能会见到这样一条配置,他的作用是式地向 Spring 容器注册 AutowiredAnnotationBeanPostProcessor、 ...
  • flqljh
  • flqljh
  • 2015-11-14 11:29
  • 239

Spring <context:annotation-config/> <context:component-scan/>与<mvc:annotation-driven />

在基于注解方式配置Spring的配置文件中,你可能会见到这样一条配置,他的作用是式地向 Spring 容器注册 AutowiredAnnotationBeanPostProcessor CommonA...
  • Fred_WF
  • Fred_WF
  • 2016-05-18 16:40
  • 210

Spring 开启Annotation <context:annotation-config> 和 <context:component-scan>诠释及区别

Spring 开启Annotation 和 诠释及区别 和 的区别 是用于激活那些已经在spring容器里注册过的bean(无论是通过xml的方式还是通过package sannin...
  • veryboy123
  • veryboy123
  • 2014-08-11 10:36
  • 360
    个人资料
    • 访问:416639次
    • 积分:5537
    • 等级:
    • 排名:第5620名
    • 原创:167篇
    • 转载:16篇
    • 译文:0篇
    • 评论:145条
    联系方式
    博客专栏
    最新评论