Spring配置文件中的那些标签
1. context:annotation-config
它的作用是隐式地向Spring容器注册AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor这4个BeanPostProcessor。其作用是如果你想在程序中使用注解,就必须先注册该注解对应的类,如下图所示:
| 依赖的类 | 注解 |
| CommonAnnotationBeanPostProcessor | @Resource 、@PostConstruct、@PreDestroy |
| PersistenceAnnotationBeanPostProcessor | @PersistenceContext |
| AutowiredAnnotationBeanPostProcessor | @Autowired |
| RequiredAnnotationBeanPostProcessor | @Required |
另外还支持:@WebServiceRef,@EJB,@PersistenceUnit。
注意:
这个标签不会激活处理Spring的@Transactional或EJB3的@TransactionAttribute注解。 考虑使用<tx:annotation-driven>标签。
2. context:component-scan
扫描classpath时,被注释的组件将自动注册为Spring bean。 默认情况下,Spring提供的@Component,@Repository,@Service和@Controller原型会被检测到。
这个标签的存在意味可以不在xml中配置<context:annotation-config>标签了。因为该标签会支持@Required,@Autowired,@PostConstruct,@PreDestroy,@Resource,@PersistenceContext和@PersistenceUnit这些注释,这通常是自动检测组件的理想选择(没有外部配置)。 当然你可以选择设置annotation-config属性为false来弃用这个默认行为,该属性默认为true。例如当你想使用自定义的BeanPostProcessor来处理这些注释的时候你可以这么做。
另外需要注意:当Spring配置需要文件分层的时候,该标签应该保证每一个配置文件都配置一次。这时就有点儿讲究了,SpringMVC的dispatcher-servlet.xml配置文件可以只扫描带有@Controller注解的类,而在Spring的applicationContext.xml文件中则可以扫描其他所有带有注解的类(也可以过滤掉带@Controller注解的类)。
除了必须指定的属性base-package之外,<context:component-scan/>还可以指定如下属性:
- resource-pattern:表示可以被自动检测的Class的形式,默认为“**/*.class”,即所有的class文件。这个只是用来告诉Spring需要对哪些文件进行扫描,而并不是把它们自动定义为对应的bean。这个需要与后续需要介绍的filter区分开。
- use-default-filters:表示使用使用默认的filter,。<context:component-scan/>将把哪些Class自动注册到bean容器是由对应的filter来控制的。该属性的值默认为true,即默认会使用默认的filter。而默认的filter会将标注了@Component、@Controller、@Service和@Repository的类,包括这四个注解所标注的注解所标注的类,都会将它们自动注册到bean容器中。
- annotation-config:是否启用对注解的支持,即隐式的启用<context:annotation-config/>,默认为true。
- name-generator:默认的beanName生成器,即在没有显式的指定beanName时,自动注册的bean将如何使用默认的beanName。默认将使用Class的简称,即不包含包名的类名称,并将首字母小写作为当前bean的名称。用户可以通过实现org.springframework.beans.factory.support.BeanNameGenerator接口并指定其为当前的name-generator来改变对应的策略。
- scope-resolver:指定用于解析bean定义的scope的ScopeMetadataResolver,默认将通过AnnotationScopeMetadataResolver进行解析,而该解析器将根据类上标注的@Scope注解来解析对应的scope。默认没有指定@Scope的都是单例。
- scoped-proxy:表示是否需要为自动检测到的需要加入bean容器中的bean生成对应的代理。默认是不生成。可选值有“no”、“interfaces”和“targetClass”,分别对应不生成、根据接口生成和根据目标class生成。这对需要使用代理的scope是非常有必须要的,如request、session等。更详细的内容请参考先前专门介绍scope的那篇文章。
3. mvc:annotation-driven
<mvc:annotation-driven/>会自动注册LocaleResolver,ThemeResolver,HandlerMapping,HandlerAdapter,HandlerExceptionResolver,RequestToViewNameTranslator,ViewResolver,FlashMapManager这8个组件的实现类,这8个组件便是SpringMVC的核心组件。程序在运行时会先去容器中扫描看是否你自定义了某一组件的实现,如果没有的话就使用properties文件中默认定义的实现类。
<mvc:annotation-driven/>标签对应的解析类是AnnotationDrivenBeanDefinitionParser。从其中可以看出,该标签为我们做了这些配置:
- 支持使用了像@RquestMapping、@ExceptionHandler等等的注解的controller方法去处理请求。
- 支持使用@RequestBody、@ResponseBody注解。
- 并提供了:数据绑定支持,@NumberFormat注解的支持对数据类型进行格式化,@DateTimeFormat支持
- 支持使用@Valid对javaBean进行JSR-303验证。
- 读写XML的支持(JAXB),读写JSON的支持(Jackson)。
对于HttpMessageConverter,它到底是干什么的呢?它是用来将特定的对象转换成字符串并最终作为HttpResponse返回的工具。实际上SpringMVC中面向开发人员的业务逻辑处理主要集中在各种Controller的方法中,基本模式是接受代表着HttpRequest的各种输入参数,在方法体中进行业务逻辑处理,最后得到输出结果,并以返回值的形式交给SpringMvc,Springmvc根据返回值的不同调用不同的处理逻辑并最终以HttpResponse的形式返回给客户端。Controller中的返回值可以有很多种,比如字符串,ModelAndView,普通对象,等等,甚至void类型都是可以的。所以SpringMvc会根据返回值的类型做很多的if else,不同的类型调用不同的处理逻辑。那么当函数接受@ResponseBody声明时,Spring就会尝试用配置好的各种HttpMessageConverter来将返回值进行序列化。不同HttpMessageConverter能够处理的对象以及处理方式都是不一样的,Spring会遍历各Converter,如果该Converter能够处理该对象则交由其处理。因此,很多基于Spring的REST风格的应用常常会返回一个model对象,那么你就应该配置好正确的HttpMessageConverter,以便Spring能够正确的将这些对象序列化回客户端。
4. mvc:default-servlet-handler
其实当一个请求来到的时候,它的执行流程是先经过tomcat的servlet的url-pattern的匹配。进入到了SpringMVC,然后对于SpringMVC框架来说,为了处理对应的请求时,首先会去找对应的HandlerMapping看是否有对应的类来处理该请求,如果有的话再根据HandlerAdapter去找是什么类,以及对应的处理方法。找不到的时候会报404。但当配置了<mvc:default-servlet-handler>标签的时候,它会注册SimpleUrlHandlerMapping来处理请求映射,对应的Handler是DefaultServletHttpRequestHandler,这种情况一般是其他HandlerMapping无法匹配处理,最后才无奈交给DefaultServletHttpRequestHandler来处理。而该Handler具体的做法其实就是转发给了web容器自身的defaultServlet来处理。这个servlet名称可以在mvc:default-servlet-handler标签中进行配置,如果没有配置,采用默认的配置,tomcat默认的servlet名称为default。即tomcat、Jetty等,在容器启动的时候,自身就默认注册了一个name叫default的servlet,DefaultServletHttpRequestHandler就是转发给这些servlet。defaultServlet会去寻找有没有该文件,找到了解析并返回文件内容,比如我们常请求的jsp页面,就是通过JspServlet来进行翻译的。找不到则404。但是你可以通过自定义servlet来替换defaultServlet。给用户返回自定义的一些信息。
5. mvc:resources
<mvc:default-servlet-handler />将静态资源的处理经由Spring MVC框架交回Web应用服务器处理。而<mvc:resources />更进一步,由Spring MVC框架自己处理静态资源,并添加一些有用的附加值功能。<mvc:resources />允许静态资源放在任何地方,如WEB-INF目录下、类路径下等,你甚至可以将JavaScript等静态文件打到JAR包中。通过location属性指定静态资源的位置,由于location属性是Resources类型,因此可以使用诸如classpath:等的资源前缀指定资源位置。传统Web容器的静态资源只能放在Web容器的根路径下,<mvc:resources />完全打破了这个限制。
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources/ directory -->
<resources mapping="/resources/**" location="/resources/" />
Spring配置文件中的那些标签的更多相关文章
- Spring框架中Spring配置文件中<context:annotation-config/>标签说明
<context:annotation-config/>此标签的重要作用就是: 省去系统繁琐的注解标签,加上一个此标签,就可以在此项目程序添加“注解”的功能,使系统识别相应的注解功能!! ...
- Spring配置文件中的那些标签意味着什么(持续更新)
前言 在看这边博客时,如果遇到有什么不清楚的地方,可以参考我另外一边博文.Spring标签的探索,根据这边文章自己来深入源码一探究竟.这里自己只是简单记录一下各标签作用,每个人困惑不同,自然需求也不一 ...
- Spring配置文件中条件判断标签
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.Prop ...
- Spring 源码(4)在Spring配置文件中自定义标签如何实现?
Spring 配置文件自定义标签的前置条件 在上一篇文章https://www.cnblogs.com/redwinter/p/16165274.html Spring BeanFactory的创建过 ...
- Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件
1.Spring依赖注入的方式 通过set方法完成依赖注入 通过构造方法完成依赖注入 2.依赖注入的类型 基本数据类型和字符串 使用value属性 如果是指向另一个对象的引入 使用ref属性 User ...
- Spring配置文件中的parent与abstract
在看项目的Spring配置文件时,发现消息队列的配置采用了继承方式配置Bean,在这梳理总结一下. 其实在基于spring框架开发的项目中,如果有多个bean都是一个类的实例,如配置多个数据源时,大部 ...
- 通过Spring配置文件中bean中的property赋值
基本数据类型赋值-通过spring配置文件中bean中的property 扩展-以此方式可以通过配置为连接数据的属性赋值 1.如果是基本数据类型,可以通过setter方法为对象中的属性设置初始值,应用 ...
- Spring配置文件中使用ref local与ref bean的区别
Spring配置文件中使用ref local与ref bean的区别.在ApplicationResources.properties文件中,使用<ref bean>与<ref lo ...
- Spring配置文件中未引入dubbo命名空间头部配置而引起的错误案例
问题描述: Spring配置文件中未引入dubbo命名空间的头部配置而引起项目启动时报出如下错误信息: org.springframework.beans.factory.xml.XmlBeanDef ...
随机推荐
- 怎么才能从github上面快速clone代码
搜了很多教程,包括该本地host配置.在git上输入命令.使用githubdesktop等等方法,最后都不行,这位朋友讲的,先把仓库clone到码云上面,再从码云上面拉代码,速度会非常快. 传送门 g ...
- 实时聊天-websocket与ajax的区别于联系
Ajax是什么? Ajax,即异步JavaScript和XML,是一种创建交互式网页应用的网页开发技术.通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新,这意味着可以在不重新加载整 ...
- C语言程序设计100例之(13):最大子段和
例13 最大子段和 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大.例如在序列2,-4,3,-1,2,-4,3中,最大的子段和为4,该子段为3,-1,2. 输入格式 第一 ...
- IT兄弟连 HTML5教程 HTML5的靠山 W3C、IETF是什么
无规矩不成方圆,软件开发当然不能例外.Web开发涉及的厂商和技术非常多,所以必须要有参考的标准,而且需要一系列的标准.Web程序都是通过浏览器来解析执行的,通过页面的展示内容与用户互动,所以Web标准 ...
- Springboot整合单元测试
概述 对于简单易懂的小项目而言,可以不适用单元测试对平时开发没有什么影响,但是对于大型项目,单纯的依赖 “手点功能测试”, 那简直就是灾难,好了,说道这里,应该明白测试的一个重要性了,,,接下来,我们 ...
- 【总结】《氨基酸新晋管理者领导力培训》第一次课_Day2_学习心得
7月26日第二天学习心得: 今天主要学习了执行贯彻和绩效反馈两大块内容,我的心得有: 一.执行层面有两大原则:--理解员工需求: 回顾了一下自己以往的经历,一般这块我用的最多的一般是在接到一个新项目的 ...
- Linux vi文档操作
使用操作 a 在光标后插入 A 插入行末 i 在光标前插入 I 插入行首 o 向下切换一行 O 向上开一行 dd 删除一整行 x 删除光标后一个字符 X 删除光标前一个字符 shif ...
- Python爬取猫眼电影《飞驰人生》47858万条评论并对其进行数据分析
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Yura不说数据说 ,PYuraL PS:如有需要Python学习资 ...
- JAVA----HelloWorld
1.步骤 将java代码编写到扩展名为.java的文件中(扩展名的查看) 新建文本文档,重命名为Test.java. 以记事本方式打开. 写入代码. public class Test{ ...
- linux下编译安装MariaDB 10.4.7,解决错误:cannot access ‘/auth_pam_tool_dir’: No such file or directory
编译安装MariaDB 10.4.7,前面的步骤我就不复述了,一切正常没什么问题. 当执行到:scripts/mysql_install_db --basedir=/usr/local/mysql - ...