Spring注解
Spring1.0时代,XML配置。
Spring2.0时代,注解配置。随着JDK1.5带来的注解支持,Spring提供了声明Bean的注解,如@Service、@Component。
Spring3.0时代,Java配置。使用Java配置可以更好的理解配置的Bean。
这些配置本身都被称为配置元数据,即对数据的描述。元数据本身不具备可执行能力,Spring容器负责解析配置元数据,然后进行Bean初始化、配置和管理依赖。
每一个被Spring管理的Java对象都称为Bean。
Spring框架四大原则:
1、使用POJO进行轻量级和最小侵入式开发。
2、通过依赖注入和基于接口编程实现松耦合。
3、通过AOP和默认习惯进行声明式编程。
4、使用AOP和模板(template)减少模式化代码。
声明Bean的注解(IOC注解)有:
@Component,没有明确的角色,加到类路径自动扫描。
@Service,逻辑层角色,一个无状态的切面。Spring为了迎合三层架构,对每一层也给出了具有语义的注解。
@Repository,数据管理/存储层角色,用在数据库操作相关的类上。
@Controller,Web控制层角色,在Spring MVC中使用。
@Component和@Bean的区别:
@Component以及他的特殊化(@Controller, @Service 和 @Repository)允许在通过类路径扫描自动发现。
@Bean是一个方法级别上的注解,表示方法的返回值是一个bean,bean的id为方法名。主要用在@Configuration或@Component注解的类里,只能在配置类中明确的声明一个单例的bean。
注入Bean的注解(DI注解)有:
@AutoWired,Spring2.5引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
@Inject,JSR-330提供的注解。
@Resource,JSR-250提供的注解。
以上几种注解一般情况下通用,可注解在属性或Set方法上。
JAVA配置:
JAVA配置是通过@Confirguration和@Bean注解来实现的。
@Confirguration声明类为一个配置类,相当于Spring的XML配置文件。使用java配置的方式,就不需要在类上写注解了,直接在配置类里面进行声明。
JAVA配置与注解配置的选择是:涉及到全局配置的,例如数据库相关配置、MVC相关配置等,用JAVA配置的方式;涉及到业务配置的,使用注解配置方式。
搭建Eclipse SpringMVC开发环境
下载安装jdk,maven,
eclipse(Eclipse Java EE IDE for Web Developers.Version: Mars.2 Release (4.5.2)Build id: 20160218-0600)
http://www.oracle.com/
http://maven.apache.org/
解压maven后,新建环境变量MAVEN_HOME,在PATH里加入maven的bin的路径。
配置完成,可打开命令行,输入mvn -v,测试。
http://dead-knight.iteye.com/blog/1841658
在mac os中配置maven
http://www.jianshu.com/p/191685a33786
下载Spring
http://repo.spring.io/libs-release-local/org/springframework/spring/
在创建maven项目过程中,Select an Archetype时选择maven-archetype-webapp
下一步中Artifact id是工程的名字,Group id是组织的名字,packge可手动置空。
src/main/java是源代码目录
src/main/resources是项目配置目录
src/test/java是测试源代码目录
src/test/resources是测试配置目录
它们都应该出现在java build path中。
由于项目打包、发布时不需要测试代码、测试的配置文件、以及运行时产生的额外文件(target),所以配置web目录也就是Deployment Assembly,不需要src/test及target路径下的内容。
如果报Could not resolve archetype org.apache.maven.archetypes:maven-archetype-webapp
则可能是网络有问题下载地址不能正常访问,等待网络正常。
如果下载一闪而过,而转到这个目录 /Users/admin/.m2/repository/org/apache/maven/archetypes/maven-archetype-webapp,查看其中的内容可能未下载完全,则删除这个目录。
http://blog.youkuaiyun.com/afgasdg/article/details/12757433
http://www.iteye.com/topic/973166
http://www.itnose.net/detail/6098368.html
http://www.admin10000.com/document/6436.html
http://blog.youkuaiyun.com/clj198606061111/article/details/20492887
jsp文件放到WEB-INFO中可以使其不被直接访问到,WEB-INF是Java的WEB应用的安全目录,客户端无法访问,只有服务端可以访问。如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。
如果报javax.http.servlet找不到,是因为还没有添加Server runtime,在Jararva Build Path/Library中点击add library,选择server runtime...
Spring3.1新特性
Spring2.5之前是通过实现Controller接口或其实现来定义处理器类。
Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义处理器类,并且提供了一组强大的注解:
需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter来开启支持@Controller 和 @RequestMapping注解的处理器。
@Controller:用于标识是处理器类;
@RequestMapping:请求到处理器功能方法的映射规则;
@RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定;
@ModelAttribute:请求参数到命令对象的绑定;
@SessionAttributes:用于声明session级别存储的属性,放置在处理器类上,通常列出模型属性(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session中;
@InitBinder:自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型;
Spring3.0引入RESTful架构风格支持(通过@PathVariable注解和一些其他特性支持),并且又引入了更多的注解支持:
@CookieValue:cookie数据到处理器功能处理方法的方法参数上的绑定;
@RequestHeader:请求头(header)数据到处理器功能处理方法的方法参数上的绑定;
@RequestBody:请求的body体的绑定(通过HttpMessageConverter进行类型转换);
@ResponseBody:处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换),即返回的是文本而不是视图名称;
@ResponseStatus:定义处理器功能处理方法/异常处理器返回的状态码和原因;
@ExceptionHandler:注解式声明异常处理器;
@PathVariable:请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定,从而支持RESTful架构风格的URI;
还有比如:
JSR-303验证框架的无缝支持(通过@Valid注解定义验证元数据);
使用Spring 3开始的ConversionService进行类型转换(PropertyEditor依然有效),支持使用@NumberFormat 和 @DateTimeFormat来进行数字和日期的格式化;
HttpMessageConverter(Http输入/输出转换器,比如JSON、XML等的数据输出转换器);
ContentNegotiatingViewResolver,内容协商视图解析器,它还是视图解析器,只是它支持根据请求信息将同一模型数据以不同的视图方式展示(如json、xml、html等),RESTful架构风格中很重要的概念(同一资源,多种表现形式);
Spring3 引入 一个 mvc XML的命名空间用于支持mvc配置,包括如:
:
自动注册基于注解风格的处理器需要的DefaultAnnotationHandlerMapping、AnnotationMethodHandlerAdapter
支持Spring3的ConversionService自动注册
支持JSR-303验证框架的自动探测并注册(只需把JSR-303实现放置到classpath)
自动注册相应的HttpMessageConverter(用于支持@RequestBody 和 @ResponseBody)(如XML输入输出转换器(只需将JAXP实现放置到classpath)、JSON输入输出转换器(只需将Jackson实现放置到classpath))等。
:注册自定义的处理器拦截器;
:和ParameterizableViewController类似,收到相应请求后直接选择相应的视图;
:逻辑静态资源路径到物理静态资源路径的支持;
:当在web.xml 中DispatcherServlet使用/ 映射时,能映射静态资源(当Spring Web MVC框架没有处理请求对应的控制器时(如一些静态资源),转交给默认的Servlet来响应静态文件,否则报404找不到资源错误,)。
Spring3.1新特性:
对Servlet 3.0的全面支持。
@EnableWebMvc:用于在基于Java类定义Bean配置中开启MVC支持,和XML中的功能一样;
新的@Contoller和@RequestMapping注解支持类:处理器映射RequestMappingHandlerMapping 和 处理器适配器RequestMappingHandlerAdapter组合来代替Spring2.5开始的处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter,提供更多的扩展点,它们之间的区别我们在处理器映射一章介绍。
新的@ExceptionHandler 注解支持类:ExceptionHandlerExceptionResolver来代替Spring3.0的AnnotationMethodHandlerExceptionResolver,在异常处理器一章我们再详细讲解它们的区别。
@RequestMapping的"consumes" 和 "produces",用于支持@RequestBody 和 @ResponseBody:
consumes指定接受的请求的Content-Type,如consumes="application/json"表示只接受请求头中Content-Type值为application/json的请求。
produces指定接受的请求的Accept。
URI模板变量增强:URI模板变量可以直接绑定到@ModelAttribute指定的命令对象、@PathVariable方法参数在视图渲染之前被合并到模型数据中(除JSON序列化、XML混搭场景下)。
@Validated:JSR-303的javax.validation.Valid一种变体(非JSR-303规范定义的,而是Spring自定义的),用于提供对Spring的验证器(org.springframework.validation.Validator)支持,需要Hibernate Validator 4.2及更高版本支持;
@RequestPart:提供对“multipart/form-data”请求的全面支持,支持Servlet 3.0文件上传(javax.servlet.http.Part)、支持内容的HttpMessageConverter(即根据请求头的Content-Type,来判断内容区数据是什么类型,如JSON、XML,能自动转换为命令对象),比@RequestParam更强大(只能对请求参数数据绑定,key-alue格式),而@RequestPart支持如JSON、XML内容区数据的绑定;详见本章的第×××节;
Flash 属性 和 RedirectAttribute:通过FlashMap存储一个请求的输出,当进入另一个请求时作为该请求的输入,典型场景如重定向(POST-REDIRECT-GET模式,1、POST时将下一次需要的数据放在FlashMap;2、重定向;3、通过GET访问重定向的地址,此时FlashMap会把1放到FlashMap的数据取出放到请求中,并从FlashMap中删除;从而支持在两次请求之间保存数据并防止了重复表单提交)。
Spring Web MVC提供FlashMapManager用于管理FlashMap,默认使用SessionFlashMapManager,即数据默认存储在session中。
SpringMVC常用注解
@Controller
负责注册一个bean 到spring 上下文中
@Controller, @RestController都是用来表示spring某个类的是否可以接收HTTP请求,区别是@Controller是标识一个Spring类是Spring MVC controller处理器,而@RestController是@Controller和@ResponseBody的结合体。
@RestController:a convenience annotation that does nothing more than adding the @Controller and @ResponseBody annotations。
参考http://blog.youkuaiyun.com/alan_liuyue/article/details/53837127
@RequestMapping
可以作用在类上或方法上,指定控制器可以处理哪些 URL 请求。一些路径映射会使用资源复数形式,例如使用@RequestMapping("/todos") 来自定义路径。URL映射中也可以使用${}来获得配置变量值。
@RequestMapping有多个属性,用来进一步匹配请求,包括:value、method、consumes、produces、params、headers。
Spring提供了简化的@RequestMapping,有GetMapping、PostMapping、PutMapping、DeleteMapping、PatchMapping。
@ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。如果是对象,则默认使用Jackson序列化成JSON字符串。
@ModelAttribute
在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法
在方法的入参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数 –绑定到对象中,再传入入参将方法入参对象添加到模型中
@ExceptionHandler
注解到方法上,出现异常时会执行该方法
@ControllerAdvice
使一个Contoller成为全局的异常处理类,类中用@ExceptionHandler方法注解的方法可以处理所有Controller发生的异常
配置tomcat
选下载安装tomcat,然后在eclipse偏好设置中找到”server“菜单下的”Runtime Environment“,之后在此页面下点击”add“,选择”tomcat6.0“之后,点击”Next“,点击”Browse“之后找到”Tomcat“的存储路径,点击”Finsh“即可完成。
方法参数映射
1.路径基本类型参数 @PathVariable
绑定 URL 占位符到入参,@PathVariable修饰符表示方法中的参数是从路径中映射而来。URL路径匹配,例如:
@RequestMapping(value = "/abc/{id}/{name}", method = RequestMethod.GET)
public Todo getTodo(@PathVariable String id,@PathVariable("name") String name,) {
return repository.findOne(id);
}
Spring中也支持URL的矩阵变量。
2.@RequestParam 基本类型参数
在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法,如果参数名和变量名不一致,可以使用@RequestParam(name),告诉spring,使用指定名字入参。
例如:
@RequestParam(value = "name", required=true, defaultValue = "https://my.oschina.net/gaussik/blog/World") String name。
3.对象参数
Spring有一套HTTP参数到JavaBean的自动映射规则。
4.@RequestBody 对象参数
@RequestBody 表示参数应该从 Http Request的body 中解析,类似的 @RequestHeader 表示参数是 Http Request的Header中定义的。
@RequestBody 参数意味着请求消息体的内容是一段json,Spring boot内置默认使用jackson来处理反序列化工作。
Spring会根据相应的HttpMessageConverter进行请求内容区数据到@RequestBody注解的命令对象的转换,及模型数据(返回值)到JSON响应内容的转换。
该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
5.MultiparFile
对上传文件大小限定,maxFileSize 是单个文件大小,maxRequestSize是设置总上传的数据大小。默认maxFileSize是1M,maxRequestSize是10M。
spring.servlet.multipart.max-file-size=10Mb
spring.servlet.multipart.max-request-size=10Mb
或者
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//单个文件最大
factory.setMaxFileSize("10MB"); //KB,MB
//总上传数据总大小
factory.setMaxRequestSize("10MB");
return factory.createMultipartConfig();
}
事务
@Service和@Transactional搭配使用。@Transactional可以使用在类上或方法上。
在Controller中,每一次Service方法调用是一次事务,调用中的数据库操作都处在一个事务中,调用结束时提交事务。如果有RuntimeException抛出则回滚。
不过对于mongodb可能无效,因为mongodb 3还不支持事务。