如果你是一个喜欢用spring的人,你可能会在欣赏spring的强大功能外,对其各样的配置比较郁闷,尤其是相差较大的版本在配置文件方面会存在差异,当然你可以去花不少的时间去网上查找相关的资料,当你准备使用更高版本spring的时候,但这无异会让人感觉烦恼。spring其实也早就意识到了这一点,并针对此给出了很好的解决方法,那就是在基于Eclipse的基础上,spring提供了针对Spring开发的Spring Tool Suite集成开发工具,通过该工具,可以很轻易地生成一个spring的工程,比如web工程,最令人兴奋的是工程里的配置文件都会自动为你生成,你再也不用操心配置文件的格式及各种配置文件了。
Spring Tool Suite的官方下载地址是:
http://www.springsource.org/downloads/sts-ggts
https://start.spring.io/
可以使用 curl http://start.Spring.io的方式
在控制台采用这种方式的话,将会需要使用一些指令,帮助我们组织curl请求;
这样可以不离开控制台就能开始使用Spring。
GIT学习推荐地址:
https://learngitbranching.js.org/
一个很好的交互式教程,可以引导你在线学习git命令;
https://try.github.io/
【可以运行的JAR】
Spring Boot主要的一个优势在于将应用所需要的所有内容都放到一个易于重发布的JAR文件中,其中包含了Web服务器。如果你运行该jar,Tomcat将会启动运行,如果要将其部署到生产环境或者云中,这都是非常便利的;
Gradle可以视为Maven的继承者,它是一个现代化的构架工具,与Maven类似,它会使用约定,Gradle真正的闪光点在于,它允许我们使用Groovy DSL编写自己的构建任务。默认库使得管理文件、声明任务之间的依赖以及增量执行job都变得非常容易;
可以使用Gradle运行应用,替换借助IDE来执行应用的方式
@SpringBootApplication注解:
@SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan。
@Configuration @EnableAutoConfiguration @ComponentScan
1、@Configuration的注解类标识这个类可以使用Spring IoC容器作为bean定义的来源。@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在Spring应用程序上下文中的bean。
2、@EnableAutoConfiguration:能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。
如果你将其移除的话,就无法从Spring Boot的自动配置中收益了。
3、@ComponentScan:会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component下的子注解@Service,@Repository,@Controller。
在默认情况下,@ComponentScan注解会扫描当前包以及该包下的所有子包;
使用Spring MVC应用,使用XML配置或者java注解配置类搭建的过程一般为:
详细步骤参考如下链接:
可以使用org.springframework.web.filter.CharacterEncodingFilter
注意:
如果使用@ResponseBody出现了中文乱码,则可以通过配置RequestMappingHanlderAdapter中配置messageConverters设置StringHttpMessageConverter的supportedMediaTypes的value为:text/html;charset=UTF-8
注意:可以自定义过滤器Filter对静态资源进行压缩,使用response.setHeader(“Content-Encoding”,GZIP); 需要先判断浏览器是否支持GZIP
例如:
在web.xml中配置如下:
不过,Spring Boot为我们处理了所有的事情,因为这些配置一般是与应用相关的,所以你可以无限制的将它们组合;
在一定程度上,Spring Boot是带有一定程度倾向性的Spring项目配置器,它基于约定,并且默认会在你的项目中使用这些约定;
【application.properties配置详解】
http://blog.csdn.net/je_ge/article/details/54783184
Spring Boot 整合Spring MVC
在SpringBoot上实现自定义Starter功能应该都是如下套路:
1、在自定义的XXAutoConfiguration上Import一个ImportBeanDefinitionRegistrar来注入指定Bean
2、添加自定义的BeanPostProcessor在Bean初始化之前或之后完成配置功能或初始化某些依赖功能
@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@ConditionOnWebApplication
@ConditionOnClass(DispatcherServlet.class)
@AutoConfigureAfter(EmbeddServletContainerAutoConfiguration.class)
public class DispatcherServletAutoConfiguration{}
Spring Boot中通过DispatcherServletAutoConfiguration类完成DispatcherServlet的功能,替代了原来在web.xml中配置分发器的步骤;
说明:
通过了解DispatcherServletAutoConfiguration代码,便可以了解为什么不需要在SpringBoot中配置,便拥有分发器Servlet和multipart解析器;
Spring Boot仅仅是基于常见的使用场景,帮助我们对应用进行配置,不过,可以在任意的地方覆盖掉这些值,并声明自己的配置;
WebMvcAutoConfiguration声明了视图解析器、地域解析器(localeresolver)以及静态资源的位置。
该类中对于视图解析器的配置没有什么特殊之处,使用了配置属性,从而允许用户对其进行自定义;
@Value(“${spring.view.prefix:}”)
@Value(“${spring.view.suffix:}”)
资源位置的声明有些复杂,但是通过它,可以了解到两点:
/META-INF/resources/
/resources/
/static/
/public/
提示:WebJars是JAR包格式的客户端JavaScript库,可以通过Maven中央仓库来获取
在WebMvcAutoConfiguration类文件中,还专门声明了一个地域管理:
localResolver
默认的地域解析器只会处理一个地域,并且允许我们通过spring.mvc.local配置属性来进行定义;
ErrorMvcAutoConfiguration
配置介绍:
至于转码的问题,HttpEncodingAutoConfiguration将会负责处理先关的事宜,这是通过提供Spring的CharacterEncodingFilter类来实现的。通过spring.http.encoding.charset配置,默认编码为UTF-8
也可以通过spring.http.encoding.enabled禁用这项配置;
默认情况下,Spring Boot在打包和运行应用的时候,会使用Tomcat嵌入式API(Tomcat embedded API)
使用的类为:EmbeddedServletContainerAutoConfiguration
可以将Spring Boot与Tomcat、tc-server、Jetty或者Undertow结合使用。
服务器可以很容易的进行切换,只需要将spring-boot-starter-tomcat JAR依赖移除掉,并将其替换为Jetty或者Undertow对应的依赖即可;
通过在application.properties文件中定义server.port属性或者定义名为SERVER_PORT的环境变量,我们可以修改默认的HTTP端口;
通过将该变量设置为-1,可以禁用HTTP,或者将其设置为0,这样就会在随机的端口上启动应用,对于测试,是非常便利的;
配置SSL是一项很麻烦的事情,但是在Spring Boot中有一项很简单的解决方案。我们只需要一点属性,就可以保护服务器了:
server.port = 8443
server.ssl.key-store = classpath:keystore.jks
server.ssl.key-store-password = secret
server.ssl.key-password = another-secret
不过为了使上面的例子运行起来,我们需要生成一个可以keystore文件;
我们可以通过简单的声明@Bean元素来添加典型的Java Web元素,如Servlet、Filter和ServletContextListener
除此之外:Spring Boot还为我们提供了内置3项功能:
通过将spring-boot-starter-actuator依赖,可以获取更多有意思的功能;
Spring Boot如何运行的图书推荐:Learning Spring Boot作者:Greg Turnquist
MVC背后的理念是将视图与模型进行解耦,模型必须是自包含的并且与UI无关,这样的话,就基本可以实现相同的数据跨多个视图的重用,其实,这些视图就是以不同的方式来查看数据。通过钻取(Drill down)或者使用不同的渲染器(HTML、PDF),可以很好的阐述这一原则;
控制器作为用户和数据之间的协调者,它的角色就是控制终端用户的行为,并且引导它们在应用的不同视图之间跳转;
推荐的图书:《领域驱动设计》(Domain Driven Design,DDD)该书中定义了一组架构规则,可以指导我们更好的将业务领域集成到代码领域之中;
贫血的领域驱动设计症状:
避免领域贫血的途径如下:
DDD 中有很多的原则:实体(Entity)、值类型(value type)、通用语言(Ubiquitous Language)、界限上下文(Bounded Context)、洋葱架构(Onion Architecture)以及防腐化层(anti corruption layer),在构建Web应用程序的时候,应该努力的遵循上述原则;
https://github.com/spring-io/sagan
Spring MVC中,模型是由Spring MVC 的Model或者ModelAndView封装的简单Map;
它可以来源于数据库、文件、外部服务等,这取决你如何获取数据,并将其放入到模型中;
与数据层进行交互推荐使用Spring Data库:Spring Data JPA、Spring Data MongoDB等;
Thymeleaf是一个模板引擎,在Spring社区中,备受关注;
它的成功之处最大是归因于对用户优化的语法(几乎就是HTML)以及扩展的便利性;
入门指南:
http://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html
Thymeleaf有很多实用的扩展:并且可以与Spring Boot继承:
例如:
在build.gradle中添加
compile ‘org.springframework.boot:spring-boot-starter-thymeleaf’
对于Web开发人员来讲,Thymeleaf有一项很大的优势,就是在服务器没有运行的时候,模板中所有的动态内容都可以采用一个默认值。资源URL可以采用相对路径来指定,每个标签都可以包含占位符。
可设置spring-thymeleaf.cache= false,这样会禁用缓存,每次访问的时候都会重新加载模板;
注意:部署到生产环境中,需要禁用该配置;
每个Spring Web应用的入口都是DispatcherServlet
它会将HTTP请求分发给HandlerMapping,HandlerMapping会将资源(URL)与控制器关联起来;
控制器上对应的方法(也就是带有@RequestMapping注解的方法)将会被调用,在这个方法中,控制器会设置模型数据并将视图名称返回给分发器;
然后,DispatcherServlet将会查询ViewResolver接口,从而得到对应的视图的实现;
ThymeleafAutoConfiguration将会为我们搭建视图解析器;
当使用${}的语法的时候,我们实际上使用的是Spring表达式语言(SpringException Language ,SPEL),关于EL,有很多不同的变种,而SpEL是其中威力强大的一种;
SpELl的用处不局限与视图中,可以将它用在Spring框架的各种地方,在通过@Value注解往bean中注入属性的时候,也可是使用SpEL;
访问列表元素:list[0]
访问map条目:map[key]
三元运算符:condition?’yes’:’no’
Elvis运算符:person?:default 如果person的值为空的时候,将会返回default
安全导航:person?.name 如果person为空或者其name为空的话,返回null
模板:’Your name is #{person.name}’
投影:${persons.![name]} 抽取所有persons的name,并将其放到一个列表中
选择:persons.?[name==’Bob’] 返回列表中name为Bob的person
函数调用:person.sayHello()
Spring Social是一组项目,提供了对各种社交网络公开API的访问功能,Spring Boot内置了对Twitter、Facebook额LinkedIn的支持。Spring Social一共包含了大约30个项目;
提示:
th:each是由Thymeleaf所定义的标签,它允许我们遍历一个集合并且能够在循环中的每个值赋给一个变量;
在Java 8中,每个集合都会有一个默认的方法stream(),它能够实现函数式的风格的操作;
这些操作可以是中间操作(intermediate_operation),它会返回一个流,这样就可以将其连接起来,也可以是终止操作(terminal operation),这样的话会返回一个值;
中间操作:
Lambda是函数表达式的便捷语法,它可以用到单个的抽象方法(Single Abstract Method)之中,也就是只包含一个函数的接口;
例如:我们可以按照如下的方式来实现Comparator接口:
Comparator
在lambda表达是总,return关键字就是最后的表达式;
使用的双冒号操作符是引用类函数的快捷方式:
Tweet::getText
等价于:
(Tweet t) -> t.getText()
collect 方法允许我们调用一个终止操作。Collectors类是一组终止操作,它会将结果放到列表、集合或者Map之中,允许进行分组(grouping)、连接(joining)等操作;
调用collect(Collectors.list())方法将会产生一个列表,其中包含了流中的每个元素;
Materialize是一个非常漂亮的CSS和JavaScript库,与BootStrap库类似;
添加Jquery 和Materialize CSS:
compile ‘org.webjars:materializecss:0.96.0’
compile ‘org.webjars:jquery:2.1.4’
每个WebJar的结构都是标准的,每个库的JS和CSS文件都会位于/webjars/{lib}/{version}/*.js
例如:如果需要在页面中引入jquery,则只需要:
xmlns:th=”http://www.thymeleaf.org”
xmlns:layout=http://www.ultraq.net.nz/thymeleaf/layout
layout:decorator=”layout/default”
>
其中layout:decorator=”layout/default能够表明去哪里查找模板,这样,我们可以将内容注入到布局的不同layout:fragment区域中。需要注意的是,每个模板都是合法的HTML文件,我们可以非常的重写它的标题;
return “redirect:result”
RedirectAttributes 是一个Spring模型,专门用于redirect场景下传值;
使用redirect: 或者是forword: 前缀,这时候返回的字符串都不会解析为视图,而是触发到特定的URL的导航,redirect会发送一个302的信息头,它会在浏览器内部触发导航,而Forword则不会导致URL的变化。
th:action=”@{/profile}”
注意:@{} 语法将会为资源构建完成的路径,它会将服务器的上下文路径添加到参数上;
数据传输对象(Data Transfer Object,DTO)
将表单域绑定到DTO上,需要使用:
th:object=”${obj}”
th:field=”${obj.name}”
可以通过继承WebMVCConfigurationAdapter来自定义一个Spring MVC的配置类;
可以在DTO中使用
@Size(min=2)
private String nam;
@NotEmpty
private String email;
@NotNull
private Date birthDate;
@NotEmpty
private List
这些注解来自于javax.validation.constraints包中的注解以及来自org.hibernate.validator.contraints包中的注解;
在Controller中结合@Valid标注到需要校验的参数上,即可完成响应校验;
BindingResult.hasErrors()
结合使用 th:errors 来显示错误提示信息;
使用th:errorsclass 来指定相关的CSS样式
可以在src/main/resources/messages.properties中自定义校验信息
在开发期间使用spring.messages.cache-seconds=0
0意味着每次都需要重新加载,而-1则代表着不进行重新加载。
Spring中负责解析错误信息的类是DefalutMessageCodesResolver。在进行输入域校验的时候,这个类将会按照如下的顺序来尝试解析信息:
声明错误信息的最后一种错误方式是直接在检验注解中定义错误信息,如下所示:
@Size(min=2,message=”格式错误”)
这种方式的缺点在于它无法与国际化功能兼容;
国际化通常被称之为il8n,指的是将应用程序设计为可以翻译成为各种语言。
通常会将翻译文本放置到属性bundle中,并且需要以目标地域作为后缀,例如
messages_en.properties、message_en_US.properties和message_fr.properties文件。
Spring 提供了这个接口的多个实现,如FixedLocaleResolver,区域解析器非常简单,可以通过一个属性来配置应用程序的地域,而且一旦定义之后,就不能进行修改了。
要配置我们应用的地域,只需要添加如下的属性到application.properties文件中:
spring.mvc.locale=fr
以下是Spring MVC所提供的不同LocalResolver接口实现:
在