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

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

大家好,又见面了,我是全栈君。

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/>能否激活这些注解呢?

答案:单纯使用< 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)<context:component-scan>除了具有<context:annotation-config />的功能之外,还具有自动将带有@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 /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。<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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121145.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • sat错题分数换算表_acwing算法基础

    sat错题分数换算表_acwing算法基础给定 n 个还未赋值的布尔变量 x1∼xn。现在有 m 个条件,每个条件的形式为 “xi 为 0/1 或 xj 为 0/1 至少有一项成立”,例如 “x1 为 1 或 x3 为 0”、“x8 为 0 或 x4 为 0” 等。现在,请你对这 n 个布尔变量进行赋值(0 或 1),使得所有 m 个条件能够成立。输入格式第一行包含两个整数 n,m。接下来 m 行,每行包含四个整数 i,a,j,b,用来描述一个条件,表示 “xi 为 a 或 xj 为 b”。输出格式如果问题有解,则第一行输出 POSS

    2022年8月9日
    7
  • 手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis

    小疯手把手带你整合SpringMVC+Spring+MyBatis三大框架,俗称SSM,用它完全代替传统的SSH框架,把它们最优雅的一面发挥出来。整合配置结束后,会有一个应用实例“图书管理系统”带给大家,希望能快速上手这个框架!

    2022年4月16日
    29
  • ZPL指令_TSC指令

    ZPL指令_TSC指令^CC,~CC改变格式指令前缀  ^CC,~CC(改变脱字符)指令是用于改变指令前缀。缺省前缀是脱字符(^)。^CC,~CC指令格式  ^CCx,~CCx^CC,~CC=改变脱字符x=任何ASCII字符  缺省值:要求有参数。如不用参数,下一字符接收后作为新的前缀字符。

    2025年7月27日
    4
  • c++创建对话框_窗体边框改为对话框样式

    c++创建对话框_窗体边框改为对话框样式本例中涉及到对话框标题栏的自绘,双缓冲位图的显示以及位图按钮类的使用。

    2022年10月8日
    4
  • mysql 实现row number_mysql数据库可以使用row number吗?

    mysql 实现row number_mysql数据库可以使用row number吗?方法一:为了实现row_number函数功能,此方法我们要使用到会话变量,下面的实例是从employees表中选出5名员工,并为每一行添加行号:123456SET@row_number=0;SELECT(@row_number:=@row_number+1)ASnum,firstName,lastNameFROMemployeesLIMIT5;输出结果:在这个实例中:首先,…

    2022年6月13日
    61
  • 控制结构与一个完整的类

    控制结构与一个完整的类

    2021年9月28日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号