springMVC详解以及注解说明
- 格式:pdf
- 大小:326.35 KB
- 文档页数:41
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框架从创建伊始就致力于为复杂问题提供强大的、非侵入性的解决方案。
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的时候,经常会遇到表单中的⽇期字符串和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?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详解前⾔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是一种常见的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工作原理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框架知识点详解官⽅的下载⽹址是:⼀、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详解@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获取请求参数三、@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详解以及注解说明基于注释(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,并注入到对应的地方中去。