最近搞了点后端 摘记下




1. 什么是spring boot?
     Spring boot基于spring,为了解决使用spring框架时配置繁多、部署流程复杂、开发效率低等问题,可以创建独立的应用程序,嵌入了tomcat、jetty等,可以直接启动应用程序而不需要外部的容器。


    同时,spring boot可以自动配置spring应用,并且将一些框架的依赖包整合起来。比如开发web程序只需要引入web的starter,极大的简化了包的引用。


2. spring boot有什么优点?
     Spring boot响应了spring4倡导微服务的理念,所谓微服务,就是将一个大的功能拆分成若干个微小的服务分别进行部署,spring boot可以很好的达成这一目的。
首先,spring的部署非常简单,不需要事先搭框架,只需要在pom文件中引入封装好的依赖包就可以使用一类服务。


其次,程序的配置简单,spring boot会尽可能的自动进行配置,最简单的,只要引入了web,就不需要web.xml这些配置文件,spring boot统统可以帮你做好,极大地简化了配置。同时,spring boot在spring的基础上提供了额外的众多注解,如:@SpringBootApplication,@EnableAutoConfiguration,@EnableDbCounting等注解,利用这些注解,几乎可以完全抛弃xml配置文件,可以实现应用的全注解配置。


最后,spring boot的启动很简单,在上一节已经提到,spring boot集成了tomcat、jetty,不需要外部的容器就可以直接部署运行,启动方便。


3. 与阿里的webx的对比
spring boot与webx根本上不属于一个维度的东西,不过目前主要学习了这两种框架,在这里抽离出共同的部分做个比较。
spring boot和webx一个根本的相似点就是都是基于spring框架;
spring boot是将spring的功能进行分装,类似于在用户和spring中间的一个接口,将spring的功能更人性化、更简单、更方便的提供给用户。


webx则是完全依赖于spring,只不过通过用WebxContextLoader覆盖spring的ContextLoader,对spring的启动方式进行了一定的修改,在spring的基础上实现了pipeline及其他的一些功能。


spring boot是让spring变得更方便使用,webx是让spring变得更强大。
spring boot可以替使用者完成大多数的配置,要很好的使用spring boot还是得看它启动过程中调用的类来理解它的一些约定。
举个例子:


​http://start.spring.io ​​​ 或者  ​​http://start.alibaba.net/​​​  生成一个最简单的demo;
然后打开修改:


DemoApplication.java

@RestController
@SpringBootApplication
public class DemoApplication {

public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}

@RequestMapping("/cipher")
public String helloworld(){
return "hello cipher";
}
}

运行:然后就可以访问http://localhost:8080/hello 可以看到页面返回了hello cipher

 


这段代码有很多有用的信息,这里大致做一些介绍:


1. SpringApplication是Spring Boot框架中描述Spring应用的类,

它的run()方法会创建一个Spring应用上下文(Application Context)。另一方面它会扫描当前应用类路径上的依赖

2. Spring WebMvc框架会将

Servlet容器 里收到的HTTP请求根据路径分发给 对应的@Controller类进 行处理, @RestController是一类特殊的@Controller, 它的返回值直接作为HTTP Response的Body部分返回给浏览器。

3.

@RequestMapping注解表明该方法处理那些URL对应的HTTP请求 ,也就是我们常说的URL路由(routing),请求的分发工作是有Spring完成的。例如上面的代码中http://localhost:8080/hello 路径就被路由至helloworld()方法进行处理

4. @SpringBootApplication 这个annotation

是spring boot提供的一个简便的annotation,有些开发人员喜欢用 @Configuration, @EnableAutoConfiguration和 @ComponentScan这三个,其实他们是一个意思 。

 


如何修改应用默认的配置?


从application.properties属性文件开始。


SpringApplication将从以下位置加载application.properties文件

,并把它们添加到Spring Environment中:

1. 当前目录下的一个/config子目录 


2. 当前目录 


3. 一个classpath下的/config包 


4. classpath根路径(root)


如:修改端口


server

. port = 7001

management

. port = 7002

 


使用

@Controller 实现URL路由

现代Web应用往往包括很多页面,不同的页面也对应着不同的URL。对于不同的URL,通常需要不同的方法进行处理并返回不同的内容。


匹配多个URL


@RestController
public class Application {
@RequestMapping("/")

public String index() {

return "Index Page";
}
}
@RequestMapping("/hello")

public String hello() {

return "Hello World!";
}
}
}

@RequestMapping 可以注解 @Controller 类:

@RestController
@RequestMapping("/classPath")
public class Application {

@RequestMapping("/methodPath")

public String method() {

return "mapping url is /classPath/methodPath";
}
}
}
}

method方法匹配的URL是/classPath/methodPath"。

 提示


可以定义多个

@Controller 将不同URL的处理方法分散在不同的类中



URL中的变量——PathVariable
在Web应用中URL通常不是一成不变的,


例如微博两个不同用户的个人主页对应两个不同的URL: http://weibo.com/user1, http://weibo.com/user2。


我们不可能对于每一个用户都编写一个被@RequestMapping注解的方法来处理其请求,Spring MVC提供了一套机制来处理这种情况:

@RequestMapping("/users/{username}")
public String userProfile(@PathVariable("username") String username) {

return String.format("user %s", username);
}
}
@RequestMapping("/posts/{id}")
public String post(@PathVariable("id") int id) {

return String.format("post %d", id);
}
}

在上述例子中,URL中的变量可以用 {variableName} 来表示,同时在方法的参数中加上 @PathVariable("variableName") ,

那么当请求被转发给该方法处理时,对应的URL中的变量会被自动赋值给被@PathVariable注解的参数(能够自动根据参数类型赋值,例如上例中的int)。


支持HTTP方法
对于HTTP请求除了其URL,还需要注意它的方法(Method)。


例如我们在浏览器中访问一个页面通常是GET方法,而表单的提交一般是POST方法。@Controller中的方法同样需要对其进行区分:

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String loginGet() {

return "Login Page";
}
}
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String loginPost() {

return "Login Post Request";
}
}


模板渲染


在之前所有的

@RequestMapping 注解的方法中,返回值字符串都被直接传送到浏览器端并显示给用户。

但是为了能够呈现更加丰富、美观的页面,我们需要将HTML代码返回给浏览器,浏览器再进行页面的渲染、显示。
一种很直观的方法是在处理请求的方法中,直接返回HTML代码,但是这样做的问题在于——一个复杂的页面HTML代码往往也非常复杂,并且嵌入在Java代码中十分不利于维护。更好的做法是将页面的HTML代码写在模板文件中,渲染后再返回给用户。为了能够进行模板渲染,需要将@RestController改成@Controller:

import org.springframework.ui.Model;
@Controller
public class HelloController {
@RequestMapping("/hello/{name}")

public String hello(@PathVariable("name") String name, Model model) {
model.addAttribute(
model.addAttribute("name", name);

return "hello"
}
}


在上述例子中,返回值

"hello" 并非直接将字符串返回给浏览器,而是寻找名字为 hello 的模板进行渲染 ,

我们使用​​Thymeleaf​​​模板引擎进行模板渲染,需要引入依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

接下来需要在默认的模板文件 夹 src/main/resources/templates/ 目录下添加一个模板文件 hello.html :

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Getting Started: Serving Web Content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'Hello, ' + ${name} + '!'" />
</body>
</html>

th:text="'Hello, ' + ${name} + '!'" 也就是将我们之前在 @Controller 方法里添加至 Model 的属性 name 进行渲染,并放入 <p> 标签中(因为 th:text 是 <p> 标签的属性)。模板渲染还有更多的用法,请参考 ​​Thymeleaf官方文档​




处理静态文件
浏览器页面使用HTML作为描述语言,那么必然也脱离不了CSS以及JavaScript。为了能够浏览器能够正确加载类似/css/style.css, /js/main.js等资源,默认情况下我们只需要在src/main/resources/static目录下添加css/style.css和js/main.js文件后,Spring MVC能够自动将他们发布,通过访问/css/style.css, /js/main.js也就可以正确加载这些资源。
 
Spring bean和依赖注入
    @configuration 相当于xml配置文件 
    @RestController Spring新加入的声明Controller的注解
    @component@service @Repository 声明bean
    @autowired  @Qualifier 注入bean

Spring boot注解
    @SpringBootApplication = @Configuration @EnableAutoConfiguration  @ComponentScan
    @Import @ImportResource 导入配置文件
    @Configuration 声明配置类
    @RestController 实现一个RESTful web services
    @Component , @Service , @Repository , @Controller 声明bean
    @autowired  @Qualifier 注入
    @Aspect等等支持AOP
    @RequestMapping 注解地址映射,url pattern

endpoint、监控:
执行器endpoint允许你监控应用及与应用进行交互。
Spring Boot包含很多内置的endpoint,我们也可以添加自己的。
 

Cache:
    Spring boot支持显示的在应用中加入缓存,我们可以为方法添加缓存以提升效率。支持的缓存有:Generic、EhCache 2.x、Hazelcast、Infinispan、JCache (JSR107)、Redis、Guava、Simple等几种方式。