springMVC详解以及注解说明

合集下载

spring MVC原理及配置

spring MVC原理及配置

spring MVC原理及配置springmvc原理及配置springmvc原理及配置1.springmvc详述:springmvc就是spring提供更多的一个强悍而有效率的web框架。

借助注释,springmvc提供更多了几乎就是pojo的研发模式,使控制器的研发和测试更加直观。

这些控制器通常不轻易处置命令,而是将其委托给spring上下文中的其他bean,通过spring的倚赖转化成功能,这些bean被转化成至控制器中。

springmvc主要由dispatcherservlet、处理器映射、处理器(控制器)、视图解析器、视图组成。

他的两个核心是两个核心:处理器映射:选择使用哪个控制器来处理请求视图解析器:选择结果应该如何渲染通过以上两点,springmvc确保了如何挑选掌控处置命令和如何挑选视图展现出输入之间的松耦合。

2.springmvc运行原理这里写图片描述(2)找寻处理器:由dispatcherservlet控制器查阅一个或多个handlermapping,找出处置命令的controller。

(3)调用处理器:dispatcherservlet将请求提交到controller。

(4)(5)调用业务处置和回到结果:controller调用业务逻辑处置后,回到modelandview。

3.springmvc接口解释(1)dispatcherservlet接口:spring提供的前端控制器,所有的请求都有经过它来统一分发。

在dispatcherservlet将请求分发给springcontroller 之前,需要借助于spring提供的handlermapping定位到具体的controller。

(2)handlermappingUSB:能够完成客户请求到controller映射。

(3)controller接口:须要为mammalian用户处置上述命令,因此同时实现controllerUSB时,必须确保线程安全并且可以器重。

Spring MVC 简明教程

Spring MVC 简明教程

Spring框架从创建伊始就致力于为复杂问题提供强大的、非侵入性的解决方案。

Spring 2.0当中为缩减XML配置文件数量引入定制命名空间功能,从此它便深深植根于核心Spring框架(aop、context、jee、jms、 lang、tx和util命名空间)、Spring Portfolio项目(例如Spring Security)和非Spring项目中(例如CXF)。

Spring 2.5推出了一整套注解,作为基于XML的配置的替换方案。

注解可用于Spring管理对象的自动发现、依赖注入、生命周期方法、Web层配置和单元/集成测试。

探索Spring 2.5中引入的注解技术系列文章由三部分组成,本文是其中的第二篇,它主要讲述了Web层中的注解支持。

最后一篇文章将着重介绍可用于集成和测试的其它特性。

这个系列文章的第一部分论述了Java注解(annotation)是如何代替XML来配置Spring管理对象和依赖注入的。

我们再用一个例子回顾一下:@Controllerpublic class ClinicController {private final Clinic clinic;@Autowiredpublic ClinicController(Clinic clinic) {this.clinic = clinic;}...@Controller表明ClinicController是Web层组件,@Autowired请求一个被依赖注入的Clinic实例。

这个例子只需要少量的XML语句就能使容器识别两个注解,并限定组件的扫描范围:<context:component-scanbase-package="org.springframework.samples.petclinic"/>这对Web层可谓是个福音,因为在这层Spring的XML配置文件已日益臃肿,甚至可能还不如层下的配置来得有用。

详解SpringMVC注解@initbinder解决类型转换问题

详解SpringMVC注解@initbinder解决类型转换问题

详解SpringMVC注解@initbinder解决类型转换问题在使⽤SpringMVC的时候,经常会遇到表单中的⽇期字符串和JavaBean的Date类型的转换,⽽SpringMVC默认不⽀持这个格式的转换,所以需要⼿动配置,⾃定义数据的绑定才能解决这个问题。

在需要⽇期转换的Controller中使⽤SpringMVC的注解@initbinder和Spring⾃带的WebDateBinder类来操作。

WebDataBinder是⽤来绑定请求参数到指定的属性编辑器.由于前台传到controller⾥的值是String类型的,当往Model⾥Set这个值的时候,如果set的这个属性是个对象,Spring就会去找到对应的editor进⾏转换,然后再SET进去。

代码如下:@InitBinderpublic void initBinder(WebDataBinder binder) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");dateFormat.setLenient(false);binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));}需要在SpringMVC的配置⽂件加上<!-- 解析器注册 --><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="messageConverters"><list><ref bean="stringHttpMessageConverter"/></list></property></bean><!-- String类型解析器,允许直接返回String类型的消息 --><bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/>换种写法<mvc:annotation-driven><mvc:message-converters><bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="UTF-8"/></bean></mvc:message-converters></mvc:annotation-driven>拓展:spring mvc在绑定表单之前,都会先注册这些编辑器,Spring⾃⼰提供了⼤量的实现类,诸如CustomDateEditor,CustomBooleanEditor,CustomNumberEditor等许多,基本上够⽤。

什么是SpringMVC?

什么是SpringMVC?

什么是SpringMVC?⼀、什么是SpringMVC?1.SpringMVC 是⼀种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFrameWork的后续产品,已经融合在Spring Web Flow 中。

2.SpringMVC = Spring +MVCspring mvc类似于struts的⼀个MVC开框架,其实都是属于spring,spring mvc需要有spring的架包作为⽀撑才能跑起来.spring是⼀个⼀站式的框架,提供了表现层(springmvc)到业务层(spring)再到数据层(springdata)的全套解决⽅案;spring的两⼤核⼼IOC(控制反转)和AOP(⾯向切⾯编程)更是给我们的程序解耦和代码的简介提供了⽀持。

Spring框架图:从Spring的结构图可以看出,springMVC位于spring web端的⼀个框架,是⼀种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使⽤了MVC架构模式的思想,将web层进⾏职责解耦。

附:基于请求驱动指的就是使⽤请求-响应模型。

从名字上就可以窥探出,Spring>SpringMVC,那么事实上,spring和SpringMVC是⼀种⽗⼦关系。

SpringMVC是spring扩展出的⼀个应⽤于web端的框架。

在这⾥需要注意的⼀点,就是到底什么是⽗⼦容器关系:spring主要的作⽤是黏合其他模块组件,进⾏统⼀管理,springmvc则主要是负责web端。

那么,我们都知道,我们在应⽤spring的时候,可以使⽤注⼊。

这个时候,如果我们的web端是⽤的SpringMVC,这个时候,controller理论上是通过SpringMVC去注⼊,但是,使⽤spring注⼊,同样是可⾏的。

同理,service等层,使⽤SpringMVC配置的统⼀扫描装配也是可以的。

SpringMVC学习教程之RequestMappingHandlerAdapter详解

SpringMVC学习教程之RequestMappingHandlerAdapter详解

SpringMVC学习教程之RequestMappingHandlerAdapter详解前⾔RequestMappingHandlerAdapter实现了HandlerAdapter接⼝,顾名思义,表⽰handler的adapter,这⾥的handler指的是Spring处理具体请求的某个Controller的⽅法,也就是说HandlerAdapter指的是将当前请求适配到某个Handler的处理器。

RequestMappingHandlerAdapter是HandlerAdapter的⼀个具体实现,主要⽤于将某个请求适配给@RequestMapping类型的Handler处理。

如下是HandlerMapping接⼝的声明:public interface HandlerAdapter {// ⽤于判断当前HandlerAdapter是否能够处理当前请求boolean supports(Object handler);// 如果当前HandlerAdapter能够⽤于适配当前请求,那么就会处理当前请求中// 诸如参数和返回值等信息,以便能够直接委托给具体的Handler处理ModelAndView handle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception;// 获取当前请求的最后更改时间,主要⽤于供给浏览器判断当前请求是否修改过,// 从⽽判断是否可以直接使⽤之前缓存的结果long getLastModified(HttpServletRequest request, Object handler);}1. supports()HandlerAdapter.supports()⽅法的主要作⽤在于判断当前的HandlerAdapter是否能够⽀持当前的handler的适配。

SpringMVC目录结构配置

SpringMVC目录结构配置

SpringMVC目录结构配置SpringMVC是一种常见的Java Web框架,它遵循MVC(Model-View-Controller)设计模式,用于构建灵活可扩展的Web应用程序。

SpringMVC的目录结构对于项目的开发和维护非常重要,下面会详细介绍SpringMVC的标准目录结构以及配置方式。

1.标准目录结构1.1 src/main/java:主要用于存放Java源代码。

1.2 src/main/resources:主要用于存放配置文件和资源文件。

1.3 src/main/webapp:主要用于存放Web应用的静态资源。

1.4 src/test/java:主要用于存放测试用例的Java源代码。

1.5 src/test/resources:主要用于存放测试用例的配置文件和资源文件。

2.详细解析2.1 src/main/java目录src/main/java目录是存放Java源代码的默认目录,它包括以下几个子目录:- config:用于存放Spring配置类,如配置数据库连接、配置事务管理等。

- interceptor:用于存放SpringMVC的拦截器。

- model:用于存放数据模型相关的实体类。

- util:用于存放工具类。

- web:用于存放SpringMVC的控制器。

2.2 src/main/resources目录src/main/resources目录是存放配置文件和资源文件的默认目录,它包括以下几个子目录:- static:用于存放静态资源文件,如CSS、JavaScript、图片等。

- templates:用于存放模板文件,如HTML、Thymeleaf模板等。

- application.properties:存放项目的配置信息,如数据库配置、端口配置等。

- logback.xml:存放日志配置,如日志级别、输出路径等。

- mapper:存放MyBatis的Mapper.xml文件。

简述springmvc工作原理

简述springmvc工作原理

简述springmvc工作原理Spring MVC 是一个基于 Java 的轻量级的 web 框架,用来开发灵活、可扩展的 web 应用程序。

Spring MVC 的工作原理如下:1. 客户发出 HTTP 请求到前端控制器 DispatcherServlet。

2. DispatcherServlet 是应用的前端控制器,根据请求 URL 找到对应的处理器 Handler。

3. HandlerMapping 根据请求 URL 找到对应的处理器适配器HandlerAdapter,HandlerAdapter 是一个策略接口,负责执行具体的 Handler 。

4. HandlerAdapter 将处理器 Handler 封装成一个适配器,使其具备执行 Handler 的能力。

5. Handler 调用业务逻辑进行处理,并返回一个ModelAndView 对象。

6. ModelAndView 是 Spring MVC 的模型和视图对象,它包含处理结果数据和视图名称。

7. Handler 将处理结果数据存入 ModelAndView 中,并将视图名称返回给 HandlerAdapter。

8. HandlerAdapter 将 ModelAndView 传递给前端控制器DispatcherServlet。

9. DispatcherServlet 调用视图解析器 ViewResolver 解析视图名称,得到具体的视图对象 View。

10. View 是一个接口,负责渲染 ModelAndView 对象,将处理结果生成 HTML 返回给客户端。

11. 客户端浏览器接收到 HTML 文档,并将其呈现给用户。

以上是 Spring MVC 的工作流程,它的核心原理是通过前端控制器 DispatcherServlet 来实现请求的分发和处理,以及视图的解析和渲染。

通过 HandlerMapping、HandlerAdapter、视图解析器 ViewResolver 的配合,可以实现灵活的请求处理和视图展示,同时也能够很好地与 Spring 的依赖注入和面向切面编程等特性进行整合。

SpringMVC框架知识点详解

SpringMVC框架知识点详解

SpringMVC框架知识点详解官⽅的下载⽹址是:⼀、Spring MVC简介1.1Spring MVC⼯作流程映射器:主要是根据浏览器上输⼊的url来映射所有满⾜要求的Handle(控制器类)适配器:主要是决定调⽤哪个Handler来实现具体的业务逻辑1.2Spring MVC VS Struts21)springmvc的⼊⼝是⼀个servlet,即前端控制器;struts2⼊⼝是⼀个filter过虑器,即前端过滤器,2)springmvc是基于⽅法开发(控制器类是单例的,不可能维护实体变量),传递参数是通过⽅法形参,可以设计为单例;struts2是基于类开发(维护⼀个实体变量),传递参数是通过类的属性,只能设计为多例3)springmvc通过参数解析器是将request对象内容进⾏解析成⽅法形参,将响应数据和页⾯封装成ModelAndView对象,最后⼜将模型数据通过request对象传输到页⾯;struts采⽤值栈存储请求和响应的数据,通过OGNL存取数据4)springmvc开发运⾏速度快于struts2⼆、Spring MVC⼯程搭建(xml)2.1导⼊springioc,springweb , springmvc相关的jar包2.2在/WEB-INF/ web.xml⽂件配置SpringMVC的前端控制器DispatcherServlet(前端控制器)<!-- 注册springmvc核⼼控制器 --><servlet><!-- servlet-name名字随便写 --><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 通知DispatcherServlet去指定的⽬录下加载springmvc.xml配置⽂件classpath:是在⼯程的src路径下寻找如果不配置init-param的话,控制器会⾃动寻找/WEB-INF/<servlet-name>-servlet.xml⽂件--><init-param><!-- 值是固定的,相当于键值对 --><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>*.action</url-pattern>//拦截请求</servlet-mapping>注:在默认情况下:springmvc框架的配置⽂件必须叫<servlet-name>-servlet.xml且必须放在/WEB-INF/⽬录下,我们可以在web.xml⽂件中,为DispatcherServlet配置⼀个初始化参数,让它去我们指定的⽬录下加载springmvc.xml配置⽂件2.3配置springmvc.xml注:该配置⽂件的命名规则遵循web.xml⽂件中核⼼控制器配置。

SpringMvc之@RequestParam详解

SpringMvc之@RequestParam详解

SpringMvc之@RequestParam详解@RequestParam是传递参数的.@RequestParam⽤于将请求参数区数据映射到功能处理⽅法的参数上。

public String queryUserName(@RequestParam String userName)在url中输⼊:localhost:8080/**/?userName=zhangsan请求中包含username参数(如/requestparam1?userName=zhang),则⾃动传⼊。

接下来我们看⼀下@RequestParam注解主要有哪些参数:value:参数名字,即⼊参的请求参数名字,如username表⽰请求的参数区中的名字为username的参数的值将传⼊;required:是否必须,默认是true,表⽰请求中⼀定要有相应的参数,否则将报404错误码;defaultValue:默认值,表⽰如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“#{systemProperties['java.vm.version']}”。

表⽰请求中可以没有名字为username的参数,如果没有默认为null,此处需要注意如下⼏点:public String queryUserName(@RequestParam(value="userName" ,required =false ) String userName)原⼦类型:必须有值,否则抛出异常,如果允许空值请使⽤包装类代替。

Boolean包装类型类型:默认Boolean.FALSE,其他引⽤类型默认为null。

public String requestparam5(@RequestParam(value="username", required=true, defaultValue="zhang") String username)如果没有传⼊参数,则默认是"zhangsan".但是在传递参数的时候如果是url?userName=zhangsan&userName=wangwu时怎么办呢?其实在实际roleList参数⼊参的数据为“zhangsan,wangwu”,即多个数据之间使⽤“,”分割;我们应该使⽤如下⽅式来接收多个请求参数:public String requestparam8(@RequestParam(value="userName") String [] userNames)或者是:public String requestparam8(@RequestParam(value="list") List<String> list)@PathVariable绑定URI模板变量值@RequestMapping(value="/users/{userId}/topics/{topicId}")public String test( @PathVariable(value="userId") int userId, @PathVariable(value="topicId") int topicId)如请求的URL为“控制器URL/users/123/topics/456”,则⾃动将URL中模板变量{userId}和{topicId}绑定到通过@PathVariable注解的同名参数上,即⼊参后userId=123、topicId=456。

SpringMVC--@RequestMapping注解以及SpringMVC获取请求参数

SpringMVC--@RequestMapping注解以及SpringMVC获取请求参数

SpringMVC--@RequestMapping注解以及SpringMVC获取请求参数三、@RequestMapping注解1、@RequestMapping注解的功能@RequestMapping注解的作⽤就是将请求和处理请求的控制器⽅法关联起来,建⽴映射关系。

SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器⽅法来处理这个请求。

注意:在使⽤@RequestMapping注解的时候,要保证在所有的控制器中所能匹配到的请求地址是唯⼀的;2、@RequestMapping注解的位置@RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息@RequestMapping标识⼀个⽅法:设置映射请求请求路径的具体信息注意:如果类和⽅法上都有路径信息,那么要先访问初始信息在访问具体信息,HTML路径要两个都写(⼀般⽤于不同模块同名请求路径的处理)3、@RequestMapping注解的value属性@RequestMapping注解的value属性通过请求的请求地址匹配请求映射@RequestMapping注解的value属性是⼀个字符串类型的数组,表⽰该请求映射能够匹配多个请求地址所对应的请求@RequestMapping注解的value属性必须设置,⾄少通过请求地址匹配请求映射4、@RequestMapping注解的method属性@RequestMapping注解的method属性通过请求的请求⽅式(get或post)匹配请求映射@RequestMapping注解的method属性是⼀个RequestMethod类型的数组,表⽰该请求映射能够匹配多种请求⽅式的请求若当前请求的请求地址满⾜请求映射的value属性,但是请求⽅式不满⾜method属性,则浏览器报错 405:Request method 'POST' not supported,设置多个参数不必同时满⾜!注意:1、对于处理指定请求⽅式的控制器⽅法,SpringMVC中提供了@RequestMapping的派⽣注解处理get请求的映射-->@GetMapping处理post请求的映射-->@PostMapping处理put请求的映射-->@PutMapping处理delete请求的映射-->@DeleteMapping可以直接使⽤以上注解代替method参数!2、常⽤的请求⽅式有get,post,put,delete但是⽬前浏览器只⽀持get和post,若在form表单提交时,为method设置了其他请求⽅式的字符串(put或delete),则按照默认的请求⽅式get处理若要发送put和delete请求,则需要通过spring提供的过滤器HiddenHttpMethodFilter,在 RESTful部分会讲到,设置多个参数不必同时满⾜!5、@RequestMapping注解的params属性(了解)@RequestMapping注解的params属性通过请求的请求参数匹配请求映射@RequestMapping注解的params属性是⼀个字符串类型的数组,可以通过四种表达式设置请求参数和请求映射的匹配关系"param":要求请求映射所匹配的请求必须携带param请求参数"!param":要求请求映射所匹配的请求必须不能携带param请求参数"param=value":要求请求映射所匹配的请求必须携带param请求参数且param=value"param!=value":要求请求映射所匹配的请求必须携带param请求参数但是param!=value注:若当前请求满⾜@RequestMapping注解的value和method属性,但是不满⾜params属性,此时页⾯回报错400:Parameter conditions "username, password!=123456" not met for actual request parameters: username={admin}, password={123456},设置多个参数必须同时满⾜!6、@RequestMapping注解的headers属性(了解)@RequestMapping注解的headers属性通过请求的请求头信息匹配请求映射@RequestMapping注解的headers属性是⼀个字符串类型的数组,可以通过四种表达式设置请求头信息和请求映射的匹配关系"header":要求请求映射所匹配的请求必须携带header请求头信息"!header":要求请求映射所匹配的请求必须不能携带header请求头信息"header=value":要求请求映射所匹配的请求必须携带header请求头信息且header=value"header!=value":要求请求映射所匹配的请求必须携带header请求头信息且header!=value若当前请求满⾜@RequestMapping注解的value和method属性,但是不满⾜headers属性,此时页⾯显⽰404错误,即资源未找到,设置多个参数必须同时满⾜!7、SpringMVC⽀持ant风格的路径(模糊匹配):表⽰任意的单个字符(/ ? 不写都不可以)*:表⽰任意的0个或多个字符**:表⽰任意的⼀层或多层⽬录注意:在使⽤**时,只能使⽤/**/xxx的⽅式8、SpringMVC⽀持路径中的占位符(重点)原始⽅式:/deleteUser?id=1rest⽅式:/deleteUser/1SpringMVC路径中的占位符常⽤于RESTful风格中,当请求路径中将某些数据通过路径的⽅式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表⽰传输的数据,在通过@PathVariable注解,将占位符所表⽰的数据赋值给控制器⽅法的形参四、SpringMVC获取请求参数1、通过ServletAPI获取将HttpServletRequest作为控制器⽅法的形参,此时HttpServletRequest类型的参数表⽰封装了当前请求的请求报⽂的对象2、通过控制器⽅法的形参获取请求参数在控制器⽅法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在 DispatcherServlet中就会将请求参数赋值给相应的形参注:若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器⽅法的形参中设置字符串、数组或者字符串类型的形参接收此请求参数若使⽤字符串数组类型的形参,此参数的数组中包含了每⼀个数据若使⽤字符串类型的形参,此参数的值为每个数据中间使⽤逗号拼接的结果3、@RequestParam@RequestParam是将请求参数和控制器⽅法的形参创建映射关系@RequestParam注解⼀共有三个属性:value:指定为形参赋值的请求参数的参数名required:设置是否必须传输此请求参数,默认值为true若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置 defaultValue属性,则页⾯报错400:Required String parameter 'xxx' is not present;若设置为 false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为 nulldefaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值为""时,则使⽤默认值为形参赋值4、@RequestHeader@RequestHeader是将请求头信息和控制器⽅法的形参创建映射关系@RequestHeader注解⼀共有三个属性:value、required、defaultValue,⽤法同@RequestParam5、@CookieValue@CookieValue是将cookie数据和控制器⽅法的形参创建映射关系@CookieValue注解⼀共有三个属性:value、required、defaultValue,⽤法同@RequestParam6、通过POJO获取请求参数可以在控制器⽅法的形参位置设置⼀个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名⼀致,那么请求参数就会为此属性赋值 7、解决获取请求参数的乱码问题解决获取请求参数的乱码问题,可以使⽤SpringMVC提供的编码过滤器CharacterEncodingFilter,但是必须在web.xml中进⾏注册注: SpringMVC中处理编码的过滤器⼀定要配置到其他过滤器之前,否则⽆效。

springMVC配置(XML配置详解)

springMVC配置(XML配置详解)

springMVC配置(XML配置详解)原⽂出⾃:web.xml配置:servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><description>加载/WEB-INF/spring-mvc/⽬录下的所有XML作为Spring MVC的配置⽂件</description><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-mvc/*.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>*.htm</url-pattern></servlet-mapping>这样,所有的.htm的请求,都会被DispatcherServlet处理;初始化 DispatcherServlet 时,该框架在 web 应⽤程序WEB-INF ⽬录中寻找⼀个名为[servlet-名称]-servlet.xml的⽂件,并在那⾥定义相关的Beans,重写在全局中定义的任何Beans,像上⾯的web.xml中的代码,对应的是dispatcher-servlet.xml;当然也可以使⽤<init-param>元素,⼿动指定配置⽂件的路径;dispatcher-servlet.xml 配置:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:mvc="/schema/mvc"xmlns:p="/schema/p"xmlns:context="/schema/context"xmlns:aop="/schema/aop"xmlns:tx="/schema/tx"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd/schema/context/schema/context/spring-context-3.0.xsd/schema/aop/schema/aop/spring-aop-3.0.xsd/schema/tx/schema/tx/spring-tx-3.0.xsd/schema/mvc/schema/mvc/spring-mvc-3.0.xsd/schema/context/schema/context/spring-context-3.0.xsd"><!--使Spring⽀持⾃动检测组件,如注解的Controller--><context:component-scan base-package="com.minx.crm.web.controller"/><bean id="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver"p:prefix="/WEB-INF/jsp/"p:suffix=".jsp" /></beans>第⼀个Controller:package com.minx.crm.web.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpublic class IndexController {@RequestMapping("/index")public String index() {return "index";}}@Controller注解标识⼀个控制器,@RequestMapping注解标记⼀个访问的路径(/index.htm),return "index"标记返回视图(index.jsp);注:如果@RequestMapping注解在类级别上,则表⽰⼀相对路径,在⽅法级别上,则标记访问的路径;从@RequestMapping注解标记的访问路径中获取参数:Spring MVC ⽀持RESTful风格的URL参数,如:@Controllerpublic class IndexController {@RequestMapping("/index/{username}")public String index(@PathVariable("username") String username) {System.out.print(username);return "index";}}在@RequestMapping中定义访问页⾯的URL模版,使⽤{}传⼊页⾯参数,使⽤@PathVariable 获取传⼊参数,即可通过地址:http://localhost:8080/crm/index/tanqimin.htm 访问;根据不同的Web请求⽅法,映射到不同的处理⽅法:使⽤登陆页⾯作⽰例,定义两个⽅法分辨对使⽤GET请求和使⽤POST请求访问login.htm时的响应。

springmvc工作原理和源码分析

springmvc工作原理和源码分析

springmvc⼯作原理和源码分析springmvc⼯作原理以及源码分析(基于spring3.1.0) springmvc是⼀个基于spring的web框架.本篇⽂章对它的⼯作原理以及源码进⾏深⼊分析. ⼀、springmvc请求处理流程 ⼆、springmvc的⼯作机制 三、springmvc核⼼源码分析 四、谈谈springmvc的优化⼀、springmvc请求处理流程 引⽤spring in action上的⼀张图来说明了springmvc的核⼼组件和请求处理流程:①:DispatcherServlet是springmvc中的前端控制器(front controller),负责接收request并将request转发给对应的处理组件. ②:HanlerMapping是springmvc中完成url到controller映射的组件.DispatcherServlet接收request,然后从HandlerMapping查找处理request的controller. ③:Cntroller处理request,并返回ModelAndView对象,Controller是springmvc中负责处理request的组件(类似于struts2中的Action),ModelAndView是封装结果视图的组件. ④⑤⑥:视图解析器解析ModelAndView对象并返回对应的视图给客户端.⼆、springmvc的⼯作机制 在容器初始化时会建⽴所有url和controller的对应关系,保存到Map<url,controller>中.tomcat启动时会通知spring初始化容器(加载bean的定义信息和初始化所有单例bean),然后springmvc会遍历容器中的bean,获取每⼀个controller中的所有⽅法访问的url,然后将url和controller保存到⼀个Map中; 这样就可以根据request快速定位到controller,因为最终处理request的是controller中的⽅法,Map中只保留了url和controller中的对应关系,所以要根据request的url进⼀步确认controller中的method,这⼀步⼯作的原理就是拼接controller的url(controller上@RequestMapping的值)和⽅法的url(method上@RequestMapping的值),与request的url进⾏匹配,找到匹配的那个⽅法; 确定处理请求的method后,接下来的任务就是参数绑定,把request中参数绑定到⽅法的形式参数上,这⼀步是整个请求处理过程中最复杂的⼀个步骤。

springMVC详解以及注解说明

springMVC详解以及注解说明

springMVC详解以及注解说明基于注释(Annotation)的配置有越来越流行的趋势,Spring 2.5 顺应这种趋势,提供了完全基于注释配置Bean、装配Bean 的功能,您可以使用基于注释的Spring IoC 替换原来基于XML 的配置。

本文通过实例详细讲述了Spring 2.5 基于注释IoC 功能的使用。

概述注释配置相对于XML 配置具有很多的优势:∙ 它可以充分利用Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。

如使用JPA 注释配置ORM 映射时,我们就不需要指定PO 的属性名、类型等信息,如果关系表字段和PO 属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过Java 反射机制获取。

∙ 注释和Java 代码位于一个文件中,而XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和Java 代码放在一起,有助于增强程序的内聚性。

而采用独立的XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。

因此在很多情况下,注释配置比XML 配置更受欢迎,注释配置有进一步流行的趋势。

Spring 2.5 的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分XML 配置的功能。

在这篇文章里,我们将向您讲述使用注释进行Bean 定义和依赖注入的内容。

Spring2.5的注释Spring 2.5 提供了AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 和RequiredAnnotationBeanPostProcessor这四个主要的关于Annotation 的BeanPostProcessor。

Springmvc拦截器实现原理解析

Springmvc拦截器实现原理解析

Springmvc拦截器实现原理解析概述SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,⽤于对处理器进⾏预处理和后处理。

开发者可以⾃⼰定义⼀些拦截器来实现特定的功能。

过滤器与拦截器的区别:拦截器是AOP思想的具体应⽤。

过滤器servlet规范中的⼀部分,任何java web⼯程都可以使⽤在url-pattern中配置了/*之后,可以对所有要访问的资源进⾏拦截拦截器拦截器是SpringMVC框架⾃⼰的,只有使⽤了SpringMVC框架的⼯程才能使⽤拦截器只会拦截访问的控制器⽅法,如果访问的是jsp/html/css/image/js是不会进⾏拦截的⾃定义拦截器那如何实现拦截器呢?想要⾃定义拦截器,必须实现 HandlerInterceptor 接⼝。

新建⼀个Moudule ,添加web⽀持配置web.xml 和 springmvc-servlet.xml ⽂件编写⼀个拦截器package com.xiaohua.interceptor;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {//在请求处理的⽅法之前执⾏//如果返回true执⾏下⼀个拦截器//如果返回false就不执⾏下⼀个拦截器public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {System.out.println("------------处理前------------");return true;}//在请求处理⽅法执⾏之后执⾏public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("------------处理后------------");}//在dispatcherServlet处理后执⾏,做清理⼯作.public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("------------清理------------");}}在springmvc的配置⽂件中配置拦截器<!--关于拦截器的配置--><mvc:interceptors><mvc:interceptor><!--/** 包括路径及其⼦路径--><!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截--><!--/admin/** 拦截的是/admin/下的所有--><mvc:mapping path="/**"/><!--bean配置的就是拦截器--><bean class="com.xiaohua.interceptor.MyInterceptor"/></mvc:interceptor></mvc:interceptors>编写⼀个Controller,接收请求package com.xiaohua.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;//测试拦截器的控制器@Controllerpublic class InterceptorController {@RequestMapping("/interceptor")@ResponseBodypublic String testFunction() {System.out.println("控制器中的⽅法执⾏了");return "hello";}}前端 index.jsp<a href="${pageContext.request.contextPath}/interceptor" rel="external nofollow" >拦截器测试</a>启动tomcat 测试⼀下!验证⽤户是否登陆(认证⽤户)实现思路有⼀个登陆页⾯,需要写⼀个controller访问页⾯。

详解springmvc常用5种注解

详解springmvc常用5种注解

详解springmvc常⽤5种注解⼀、组件型注解:1、@Component 在类定义之前添加@Component注解,他会被spring容器识别,并转为bean。

2、@Repository 对Dao实现类进⾏注解 (特殊的@Component)3、@Service ⽤于对业务逻辑层进⾏注解, (特殊的@Component)4、@Controller ⽤于控制层注解, (特殊的@Component)以上四种注解都是注解在类上的,被注解的类将被spring初始话为⼀个bean,然后统⼀管理。

⼆、请求和参数型注解:1、@RequestMapping:⽤于处理请求地址映射,可以作⽤于类和⽅法上。

●value:定义request请求的映射地址●method:定义地request址请求的⽅式,包括【GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE.】默认接受get请求,如果请求⽅式和定义的⽅式不⼀样则请求⽆法成功。

●params:定义request请求中必须包含的参数值。

●headers:定义request请求中必须包含某些指定的请求头,如:RequestMapping(value = "/something", headers = "content-type=text/*")说明请求中必须要包含"text/html", "text/plain"这中类型的Content-type头,才是⼀个匹配的请求。

●consumes:定义请求提交内容的类型。

●produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回@RequestMapping(value="/requestTest.do",params = {"name=sdf"},headers = {"Accept-Encoding=gzip, deflate, br"},method = RequestMethod.GET) public String getIndex(){System.out.println("请求成功");return "index";}上⾯代码表⽰请求的⽅式为GET请求,请求参数必须包含name=sdf这⼀参数,然后请求头中必须有 Accept-Encoding=gzip, deflate, br这个类型头。

springMVC配置文件详解

springMVC配置文件详解

web.xml的配置web.xml应该是整个项目最重要的配置文件了,不过servlet3.0中已经支持注解配置方式了。

在servlet3.0以前每个servlet必须要在web.xml中配置servlet及其映射关系。

但是在spring框架中就不用了,因为Spring中是依赖注入(Dependency Injection)的也叫控制反转(Inversion of Control)。

但是也要配置一个重要的servlet,就是前端控制器(DispatcherServlet)。

配置方式与普通的servlet基本相似。

配置内容如下:<!-- 配置前端控制器--><servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><!-- ContextconfigLocation配置springmvc加载的配置文件适配器、处理映射器等--><param-name>contextConfigLocation</param-name><param-value>WEB-INF/classes/spring/springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>spring</servlet-name><!-- 1、.action访问以.action结尾的由DispatcherServlet进行解析2、/,所有访问都由DispatcherServlet进行解析--><url-pattern>/</url-pattern></servlet-mapping>这里需要注意,springmvc.xml是spring配置文件,将在后面讨论。

springmvc知识点整理

springmvc知识点整理

springmvc知识点整理1.Springmvc架构2.Springmvc组件三⼤组件:处理器映射器,处理器适配器,视图解析器处理器映射器:注解式处理器映射器,对类中标记了@ResquestMapping的⽅法进⾏映射,根据@ResquestMapping定义的url匹配@ResquestMapping标记的⽅法,匹配成功返回HandlerMethod对象给前端控制器。

<!-- 配置处理器映射器 --><beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />处理器适配器:对标记@ResquestMapping的⽅法进⾏适配<!-- 配置处理器适配器 --><beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />解决办法:SpringMVC使⽤<mvc:annotation-driven>⾃动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter可以在springmvc.xml配置⽂件中使⽤<mvc:annotation-driven>替代注解处理器和适配器的配置。

<!-- 注解驱动 --><mvc:annotation-driven />视图解析器:视图解析器使⽤SpringMVC框架默认的InternalResourceViewResolver,这个视图解析器⽀持JSP视图解析。

<!-- 配置视图解析器 --><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 配置逻辑视图的前缀 --><property name="prefix" value="/WEB-INF/jsp/" /><!-- 配置逻辑视图的后缀 --><property name="suffix" value=".jsp" /></bean>最终jsp物理地址:前缀+逻辑视图名+后缀3.1简单参数的绑定(@RequestParam)当请求的参数名称和处理器形参名称⼀致时会将请求参数与形参进⾏绑定,若不⼀致,就需要@RequestParamvalue:参数名字,即⼊参的请求参数名字,如value=“itemId”表⽰请求的参数区中的名字为itemId的参数的值将传⼊required:是否必须,默认是true,表⽰请求中⼀定要有相应的参数,否则将报错TTP Status 400 - Required Integer parameter 'XXXX' is not presentdefaultValue:默认值,表⽰如果请求中没有同名参数时的默认值public String queryItemById(@RequestParam(value = "itemId", required = true, defaultValue = "1") Integer id,ModelMap modelMap) {}这⾥需要传⼊的是id,实际传⼊的是itemId,需要⽤@RequestParam转换⼀下3.2pojo参数绑定如果提交的参数很多,或者提交的表单中的内容很多的时候,可以使⽤简单类型接受数据,也可以使⽤pojo接收数据,但是pojo对象中的属性名和表单中input的name属性⼀致。

SpringMVC的配置文件

SpringMVC的配置文件

SpringMVC的配置⽂件⼀、root标签跟spring配置⼀样,root标签是beans,毕竟springmvc是spring的⼀个模块在springmvc⾥,⾃动扫描主要是配置controller:⼆、⾃动扫描:⼆、⾃动扫描:在<context:component-scan base-package="com.xxx.controller"/>三、解析器Resolver:解析器有很多种,⽐较重要的是ViewResolverViewResolver也有很多种,其中⽐较重要和常⽤的是InternalResourceViewResolver(内部资源视图解析器)代码:<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean>如果没有视图解析器,我们在controller⾥⾯的代码是这样的:@Controllerpublic class LoginActionController {@RequestMapping("/index")public String toIndex(HttpServletRequest request, ModelMap map, HttpSession session) {return "/WEB-INF/jsp/index.jsp";}⽽使⽤了视图解析器,我们的代码是这样的:@Controllerpublic class LoginActionController {@RequestMapping("/index")public String toIndex(HttpServletRequest request, ModelMap map, HttpSession session) {return "index";}区别在最后⼀句,我们不需要给出⽬标视图的全路径了。

springmvcRequestMappingHandlerMapping初始化详解

springmvcRequestMappingHandlerMapping初始化详解

springmvcRequestMappingHandlerMapping初始化详解springmvc中配置这个标签默认注册三个bean:RequestMappingHandlerMapping,RequestMappingHandlerAdapter,DefaultHandlerExceptionResolver RequestMappingHandlerMapping我们看它实现了InitializingBean 接⼝,所以在getBean()实例化它时会执⾏afterPropertiesSet()⽅法,来看该⽅法⼲了什么?⽅法中实例化了⼀个BuilderConfiguration对象,并为该对象设置了⼀些路径抓取器,路径⽅法匹配器等。

最后还需要调⽤⽗类的⽅法⽗类只是调⽤了initHandlerMethods()⽅法,该⽅法很关键是将请求路径和⽅法匹配的// 获得所有的beanName// 遍历所有的beanName并获得type类型// 判断类是否被@Controller或是@RequestMapping注释了,是执⾏detectHandlerMethods(beanName)⽅法// ⾸先获得类型class,根据类的class获得⼀个Map,这个map的key是Method,value是RequestMappingInfo,后⽂详解#1// 遍历map,获得Method和RequestMappingInfo,注册他们。

后⽂详解#2书接前⽂#1selectMethods()⽅法中,根据类的class获得所有的⽅法,遍历⽅法执⾏doWith(Method method)⽅法获得⽅法和RequestMappingInfo,将他们存到Map中返回,RequestMappingInfo是怎么获得的呢?我们马上来看执⾏的是detectHandlerMethods()⽅法中的getMappingForMethod(method, userType)⽅法,该⽅法是⼀个抽象⽅法。

SpingMVC常用注解之@RequestParam

SpingMVC常用注解之@RequestParam

SpingMVC常⽤注解之@RequestParam(在Spring MVC 后台控制层获取前台参数的⽅式主要有两种,⼀种是requset.getParameter(“name”),另⼀种是⽤注解@ResquestParam获取。

)org.springframework.web.bind.annotation.RequestParam 注解类型⽤于将指定的请求参数赋值给⽅法中的形参。

使⽤@RequestParam注解,可指定@RequestParam⽀持的属性@RequestParam注解⽀持的属性属性类型是否必要说明name String否指定请求头绑定的名称value String否前台name属性的别名required boolean否指⽰参数是否必须绑定defaultValue String否如果没有传递参数⽽使⽤的默认值例:1、前台代码<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><form action="show.do" method="post">姓名<input type="text" name="name" value="name"/><br/>年龄<input type="text" name="age" value="age"/><br/><input type="submit" value="确认"/></form></body></html>两个前台参数name 和 age2、控制层代码import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.servlet.ModelAndView;@Controllerpublic class StudentController {@RequestMapping("/show")public ModelAndView show(@RequestParam(value="name",required=false) String name1,@RequestParam(value="age",required=false) String age1,HttpServletResponse response)throws Exception{ ModelAndView mav=new ModelAndView();mav.addObject("name", name1);mav.addObject("age", age1);mav.setViewName("show");return mav;}}@RequestParam(value="name" 中的name 是前台参数name ,将它赋给形参name1,然后ModelAndView对象调⽤addObject⽅法,将形参数据传递给showname然后前台⽤EL表达式获取showname,就可以将⽤户输⼊到输⼊框中的数据显⽰到显⽰页⾯上。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

springMVC详解以及注解说明基于注释(Annotation)的配置有越来越流行的趋势,Spring 2.5 顺应这种趋势,提供了完全基于注释配置Bean、装配Bean 的功能,您可以使用基于注释的Spring IoC 替换原来基于XML 的配置。

本文通过实例详细讲述了Spring 2.5 基于注释IoC 功能的使用。

概述注释配置相对于XML 配置具有很多的优势:∙ 它可以充分利用Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。

如使用JPA 注释配置ORM 映射时,我们就不需要指定PO 的属性名、类型等信息,如果关系表字段和PO 属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过Java 反射机制获取。

∙ 注释和Java 代码位于一个文件中,而XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和Java 代码放在一起,有助于增强程序的内聚性。

而采用独立的XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。

因此在很多情况下,注释配置比XML 配置更受欢迎,注释配置有进一步流行的趋势。

Spring 2.5 的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分XML 配置的功能。

在这篇文章里,我们将向您讲述使用注释进行Bean 定义和依赖注入的内容。

Spring2.5的注释Spring 2.5 提供了AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 和RequiredAnnotationBeanPostProcessor这四个主要的关于Annotation 的BeanPostProcessor。

我们可以使用<context:annotation-config /> 来方便地、一次性的声明者四个BeanPostProcessor。

1.Autowired... 提供对Spring 特有的Autowired 和Qualifier 注释。

2.CommonAnotation... 用于支持JSR 250 的注释3.Persistence... 用于JPA 的PersistenceUnit 和PersistenceContext 注释4.Required... 用于检查被Required 注释标记的属性是否被设定原来我们是怎么做的在使用注释配置之前,先来回顾一下传统上是如何配置Bean 并完成Bean 之间依赖关系的建立。

下面是3 个类,它们分别是Office、Car 和Boss,这3 个类需要在Spring 容器中配置为Bean:Office 仅有一个属性:清单1. Office.javapackage com.baobaotao;public class Office {private String officeNo =”001”;//省略get/setter@Overridepublic String toString() {return "officeNo:" + officeNo;}}Car 拥有两个属性:清单2. Car.javapublic class Car {private String brand;private double price;// 省略get/setter@Overridepublic String toString() {return "brand:" + brand + "," + "price:" + price;}}Boss 拥有Office 和Car 类型的两个属性:清单3. Boss.javapackage com.baobaotao;public class Boss {private Car car;private Office office;// 省略get/setter@Overridepublic String toString() {return "car:" + car + "\n" + "office:" + office;}}我们在Spring 容器中将Office 和Car 声明为Bean,并注入到Boss Bean 中:下面是使用传统XML 完成这个工作的配置文件beans.xml:清单4. beans.xml 将以上三个类配置成Bean<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-2.5.xsd"><bean id="boss" class="com.baobaotao.Boss"><property name="car" ref="car"/><property name="office" ref="office" /></bean><bean id="office" class="com.baobaotao.Office"><property name="officeNo" value="002"/></bean><bean id="car" class="com.baobaotao.Car" scope="singleton"><property name="brand" value=" 红旗CA72"/><property name="price" value="2000"/></bean></beans>当我们运行以下代码时,控制台将正确打出boss 的信息:清单5. 测试类:AnnoIoCTest.javaimport org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class AnnoIoCTest {public static void main(String[] args) {String[] locations = {"beans.xml"};ApplicationContext ctx =new ClassPathXmlApplicationContext(locations);Boss boss = (Boss) ctx.getBean("boss");System.out.println(boss);}}这说明Spring 容器已经正确完成了Bean 创建和装配的工作。

使用@Autowired 注释(按类型匹配)Spring 2.5 引入了@Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。

来看一下使用@Autowired 进行成员变量自动注入的代码:清单6. 使用@Autowired 注释的Boss.javaimport org.springframework.beans.factory.annotation.Autowired;public class Boss {@Autowiredprivate Car car;@Autowiredprivate Office office;…}Spring 通过一个BeanPostProcessor 对@Autowired 进行解析,所以要让@Autowired 起作用必须事先在Spring 容器中声明AutowiredAnnotationBeanPostProcessor Bean。

清单7. 让@Autowired 注释工作起来<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-2.5.xsd"><!-- 该BeanPostProcessor 将自动起作用,对标注@Autowired 的Bean 进行自动注入--><bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/><!-- 移除boss Bean 的属性注入配置的信息--><bean id="boss" class="com.baobaotao.Boss"/><bean id="office" class="com.baobaotao.Office"><property name="officeNo" value="001"/></bean><bean id="car" class="com.baobaotao.Car" scope="singleton"><property name="brand" value=" 红旗CA72"/><property name="price" value="2000"/></bean></beans>这样,当Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描Spring 容器中所有Bean,当发现Bean 中拥有@Autowired 注释时就找到和其匹配(默认按类型匹配)的Bean,并注入到对应的地方中去。

相关文档
最新文档