SpringBoot学习
SpringBoot官网文档路径:
https://docs.spring.io/spring-boot/docs/2.0.0.RC1/reference/htmlsingle/#using-boot-devtools-property-defaults
一、创建第一个SpringBoot
1、创建一个maven项目
(1)File—>New—>Project(建议使用jdk1.8或以上)
(2)点击Next
(3)输入GroupId和ArtifactId后,点击Next
(4)点击Finish即可成功创建maven项目
2、配置pom.xml文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>SpringBootDemo</artifactId> <version>1.0-SNAPSHOT</version> <!--继承默认值为Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RC1</version> </parent> <!-- 添加Web应用程序的典型依赖项 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <!-- 打包为可执行jar --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <!-- 添加Spring存储库 --> <!-- (如果使用的是.RELEASE版本,则不需要这样) --> <repositories> <repository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> <snapshots><enabled>true</enabled></snapshots> </repository> <repository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </pluginRepository> </pluginRepositories> </project>
3、在 src/main/java目录下新建Example.java文件
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @EnableAutoConfiguration public class Example { @RequestMapping("/") String home() { return "Hello World!"; } public static void main(String[] args) throws Exception { SpringApplication.run(Example.class, args); } }
4、运行main方法
5、浏览器中访问:http://localhost:8080/
6、项目中一般是以jar方式部署
(1)生成jar包
(2)以jar包部署方式(打开cmd)
a.默认日志级别INFO,命令:java -jar SpringBootDemo-1.0-SNAPSHOT.jar
b.关闭应用程序,ctrl+C
c.启动时可以设置日志级别为debug 命令:java -jar SpringBootDemo-1.0-SNAPSHOT.jar --debug
d.常见错误,端口冲突,需要检查一下是否其他地方都使用一样的端口
二、SpringBoot常用注解说明
1、@Controller 处理Http请求
2、@RestController Spring框架4版本之后出来的注解,之前版本返回json数据需要@ResponseBody配合@Controller
代码一和代码二的效果一致:
代码一:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @EnableAutoConfiguration public class Example { @RequestMapping("/") @ResponseBody String home() { return "Hello World!"; } public static void main(String[] args) throws Exception { SpringApplication.run(Example.class, args); } }
代码二:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @EnableAutoConfiguration public class Example { @RequestMapping("/") String home() { return "Hello World!"; } public static void main(String[] args) throws Exception { SpringApplication.run(Example.class, args); } }
3、@RequestMapping 配置url映射关系
4、@PathVariable 获取url中的数据
(1)定义URL变量规则:可以在@RequestMapping注解中用{}来表明它的变量部分,例如:
@RequestMapping("/users/{username}")
这里{username}就是我们定义的变量规则,username是变量的名字,那么这个URL路由可以匹配下列任意URL并进行处理:
- /users/tianmaying
- /users/ricky
- users/tmy1234
需要注意的是,在默认情况下,变量中不可以包含URL的分隔符/,例如路由不能匹配/users/tianmaying/ricky,即使你认为tianmaying/ricky是一个存在的用户名。
@RequestMapping("/users/{username}") public String userProfile(@PathVariable String username){ return "user:" + username; }
(2)当@Controller处理HTTP请求时,userProfile的参数username会自动设置为URL中对应变量username(同名赋值)的值
在默认的情况下,Spring会对@PathVariable注解的变量进行自动赋值,当然你也可以指定@PathVariable使用哪一个URL中的变量:
@RequestMapping("/users/{name}") public String userProfile(@PathVariable("name") String username){ return "user:" + username; }
(3)定义多个URL变量
@PathVariable注解的参数可以是一些基本的简单类型:int,long,Date,String等,Spring能根据URL变量的具体值以及函数参数的类型来进行转换,例如/user/testUserName/intParam/5,会将“testUserName”的值赋给username,而5赋值给int变量num。
@RequestMapping("/user/{username}/intParam/{num}") public String getUserInfo(@PathVariable String username , @PathVariable int num){ return "user: " + username + ";intParam:" + num; }
(4)匹配正则表达式
除了简单地定义{username}变量,还可以定义正则表达式进行更精确的控制,定义语法是{变量名:正则表达式}[a-zA-Z0-9_]+是一个正则表达式,表示只能包含小写字母,大写字母,数字,下划线。如此设置URL变量规则后,不合法的URL则不会被处理,直接由SpringMVC框架返回404Not Found。
5、@RequestParam 获取请求参数的值
@RequestMapping("/user/test") public String getUserName1(@RequestParam("userName") String userName) { return "userName = " + userName; }
一旦我们在方法中定义了@RequestParam变量,如果访问的URL中不带有相应的参数,就会抛出异常——这是显然的,Spring尝试帮我们进行绑定,然而没有成功。
但有的时候,参数确实不一定永远都存在,这是我们可以通过定义required属性:
@RequestMapping("/user/test") public String getUserName1(@RequestParam(name="userName",required = false) String userName) { return "userName = " + userName; }
当然,在参数不存在的情况下,可能希望变量有一个默认值:
@RequestMapping("/user/test") public String getUserName1(@RequestParam(name = "userName" , required = false , defaultValue="admin") String userName) { return "userName = " + userName; }
6、@GetMapping、@PostMapping组合注解
(1)@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。该注解将HTTP Get 映射到 特定的处理方法上。
即可以使用@GetMapping(value = “/hello”)来代替@RequestMapping(value=”/hello”,method= RequestMethod.GET)。即可以让我们精简代码。
@GetMapping(value = "/helloGet") public String helloGet() { return "helloGet"; } @RequestMapping(value = "/helloGet1",method= RequestMethod.GET) public String helloGet1() { return "helloGet1"; }
(2)@PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。该注解将HTTP Post 映射到 特定的处理方法上。
即可以使用@PostMapping(value = “/hello”)来代替@RequestMapping(value=”/hello”,method= RequestMethod.POST)。即可以让我们精简代码。
@PostMapping(value = "/helloPost") public String helloPost() { return "helloPost"; } @RequestMapping(value = "/helloPost1",method= RequestMethod.POST) public String helloPost1() { return "helloPost1"; }
三、自定义Banner
1、在SpringBoot 启动的时候,首先在命令行上会打印出如下的信息:
这就是 SpringBoot 的默认 banner。这个 启动 banner 是可以进行定制的。
2、自定义Banner
(1)第一种定制 SpringBoot 的方式是编辑一个banner.txt 文件,然后在里面输入要在 banner 里面显示的内容,最后把这个文件存放到 resource 目录下。
生成banner.txt网页地址:https://www.bootschool.net/ascii
点击下载bannner.txt文件按钮,最后把这个文件存放到 resource 目录下,启动SpringBoot项目:
(2)图片Banner定制,图片的banner支持gif、png、jpef格式的图片。使用时,选用合适的图片,然后将图片名字改成banner,和文字的banner.txt文件一样,放到resource目录下即可
(3)如果在resource目录下既有 banner.txt 文件,又有 banner 的图片文件,SpringBoot 会先显示图片 banner ,然后再显示文本的 banner。
四、自定义SpringApplication
1、如果默认的 SpringApplication 不符合你的口味,你可以创建一个本地实例并对它进行自定义。例如,想要关闭banner你可以这样写:
public static void main(String[] args) throws Exception { SpringApplication app = new SpringApplication(Example.class); app.setBannerMode(Banner.Mode.OFF); app.run(args); }
这样的banner的内容项目启动的时候就不会输出:
五、Application事件和监听器
应用运行时,事件会以下面的次序发送:
1、在运行开始,但除了监听器注册和初始化以外的任何处理之前,会发送一个 ApplicationStartedEvent 。
2、在Environment将被用于已知的上下文,但在上下文被创建前,会发送一个 ApplicationEnvironmentPreparedEvent 。
3、在refresh开始前,但在bean定义已被加载后,会发送一个 ApplicationPreparedEvent 。
4、在refresh之后,相关的回调处理完,会发送一个 ApplicationReadyEvent ,表示应用准备好接收请求了。
5、启动过程中如果出现异常,会发送一个 ApplicationFailedEvent 。
public static void main(String[] args) throws Exception { SpringApplication application = new SpringApplication(Example.class); application.setBannerMode(Banner.Mode.OFF); application.addListeners(new MyListennerByAddedToApplication()); application.run(args); }
监听器
import org.springframework.boot.context.event.*; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; /** * Created by minstone on 2019/3/5. */ public class MyListennerByAddedToApplication implements ApplicationListener<ApplicationEvent> { @Override public void onApplicationEvent(ApplicationEvent arg0) { // TODO Auto-generated method stub if(arg0.getClass().isAssignableFrom(ApplicationStartingEvent.class)){ System.out.println(this.getClass()+"——ApplicationStartingEvent hapends"); }else if(arg0.getClass().isAssignableFrom(ApplicationEnvironmentPreparedEvent.class)){ System.out.println(this.getClass()+"——在Environment将被用于已知的上下文,但在上下文被创建前,ApplicationEnvironmentPreparedEvent hapends"); }else if(arg0.getClass().isAssignableFrom(ApplicationPreparedEvent.class)){ System.out.println(this.getClass()+"——在refresh开始前,但在bean定义已被加载后,ApplicationPreparedEvent hapends"); }else if(arg0.getClass().isAssignableFrom(ApplicationStartedEvent.class)){ System.out.println(this.getClass()+"——在运行开始,但除了监听器注册和初始化以外的任何处理之前,ApplicationStartedEvent hapends"); }else if(arg0.getClass().isAssignableFrom(ApplicationReadyEvent.class)){ System.out.println(this.getClass()+"——在refresh之后,相关的回调处理完,表示应用准备好接收请求了。ApplicationReadyEvent hapends"); }else if(arg0.getClass().isAssignableFrom(ApplicationFailedEvent.class)){ System.err.println(this.getClass()+"——启动过程中如果出现异常, ApplicationFailedEvent happends"); } } }
运行结果: