SpringBoot框架介绍
一、SpringBoot简介
Spring Boot 是由Pivotal 团队开发的Spring 框架,采用了生产就绪的观点,旨在简化配置,致力于快速开发;
Spring Boot 框架提供了自动装配和起步依赖,使开发人员不需要配置各种xml 文件。通过这种方式,极大地提高了程序的开发速度,因此, Spring Boot 被认为是新一代的Web 开发框架;
在过去的Spring 开发中,需要引入大量的xml 文件;Spring 2.5 引入了包扫描,消除了显式的配置Bean;Spring 3.0 又引入了基于JavaBean 的配置,这种方式可以取代xml 文件;尽管如此,在实际的开发中还是需要配置xml 文件,例如配置SpringMVC 、事务管理器、过滤器、切面等;
在项目的开发过程中,会引入大量的第三方依赖,选择依赖是一件不容易的事,解决依赖与依赖之间的冲突也很耗费精力。所以,在以前的Spring 开发中,依赖管理也是一件棘手的事情;Pivotal 团队提供的Spring Boot 框架,解决了以前Spring 应用程序开发的痛点。
Spring Boot 的特点
对比之前的Spring, Spring Boot 有三大特点:自动配置、起步依赖和Actuator 对运行状态的监控
自动配置就是程序需要什么, Spring Boot 就会装配什么;例如, 当程序的pom 文件引入了Feign 的起步依赖, Spring Boot 就会在程序中自动引入默认的Feign 的配置Bean ;再例如配置Feign 的Decoder 时,如果开发人员配置了Decoder Bean, Spring Boot 就不会引入默认的Decoder Bean ;自动装配使得程序开发变得非常便捷、智能化。
在以前开发过程中,向项目添加依赖是一件非常有麻烦的事:选择版本,解决版本冲突,十分耗费精力。例如,程序需要Spring MVC 的功能,那么需要引入spring-core 、spring-web和spring-webmvc 等依赖,但是如果程序使用Spring Boot 的起步依赖,只需要加入spring-boot-starter-web 的依赖,它会自动引入SpringMVC 功能的相关依赖;
Spring Boot 能够提供自动装配和起步依赖, 解决了以前重量级的xml 配置和依赖管理的各种问题;一切都显得那么敏捷、智能,但是却带来了一系列的其他问题:
开发者该怎么知道应用程序中注入了哪些Bean ?
应用程序的运行状态是怎么样的?
为了解决这些问题, SpringBoot 提供了Actuator 组件,井提供了对程序的运行状态的监控功能。
SpringBoot 的优点
Spring Boot 不仅提供了自动装配、起步依赖,还自带了不少非功能性的特性,例如安全、度量、健康检查、内嵌Servlet 容器和外置配置;开发人员可以更加敏捷快速地开发Spring 程序, 专注于应用程序本身的业务开发,而不是在Spring 的配置上花费大量的精力。另外, Actuator 提供了运行时的Spring Boot 程序中的监控端点,让开发人员和运维人员实时了解程序的运行状况。
二、用IDEA构建SpringBoot工程
打开“ IDEA ”→“new Project "→“ Spring Initializr ”→填写“ group "和“ artifact ”→勾选“ web ”(开启web 功能) → 单击“下一步”,IDEA 会自动下载Spring Boot 工程的模板
创建完成后的项目目录为下图所示:
1)POM:依赖管理文件;
2)resources:资源文件夹;
3)static:静态资源;
4)templates:模板资源;
5)application.properties:配置文件;
6)HelloWorldApplication:程序启动类;
package com.example.helloworld;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
其中,@ SpringBootApplication 注解包含了@SpringBootConfiguration 、@EnableAutoConfiguration和@ComponentScan , 开启了包扫描、配置和自动配置的功能。这是一个完整的、具有Web 功能的工程,为了展示Web 效果, 建一个Web 层的Controller,代码如下:
package com.example.helloworld;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.swing.*;
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
@RestController
public class HelloController {
@RequestMapping("/hello")
public String index () {
return "Greetings from Spring Boot !" ;
}
}
}
浏览器访问:http://localhost:8080/hello
@RestController 注解表明这个类是一个RestConoller,@RestController 是Spring4.0版本的一个注解, 它的功能相当于@Controller 注解和@ResponseBody 注解之和,@RequestMapping 注解是配置请求地址的Url映射的。
启动HelloWorldApplication 的main方法,SpringBoot 程序启动。在控制台会打印启动的日志,程序的默认端口为8080 。
打开浏览器访问即可得到上图;
SpringBoot的神奇之处在于:在程序中没有做web.xml的配置,也没有做SpringMVC的配置,甚至都不用部署在Tomcat 上,就可以构建一个具备Web功能的工程。其实,SpringBoot自动为你做了这些配置,并且它默认内嵌了Tomcat容器。
三、SpringBoot配置文件详解
1、自定义属性
在用IDEA 创建一个Spring Boot工程时,系统默认会在src/main/java/resources 目录下创建一个配置文件application.properties;
它也支持yml 格式的文件,下面以yml格式的文件为例来讲解如何自定义属性,在工程的配置文件application.yml 自定义一组属性,如下:
my:
name:hello
age:18
如果要读取配置文件application.properties的属性值,只需在变量上加@Value("{属性名}")注
解,就可以将配置文件application.properties的一个属性值赋给一个变量:
package com.example.helloworld;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.swing.*;
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
@RestController
public class HelloController {
@RequestMapping("/hello")
public String index () {
return "Greetings from Spring Boot !" ;
}
@RestController
public class NameAgeController {
@Value("${name}")
private String name;
@Value("${age}")
private int age;
@RequestMapping(value = "/nameage")
public String nameage() {
return name + ":" + age;
}
}
}
}
启动工程SpringBoot,打开浏览器访问http://localhost:8080/nameage,浏览器显示如下:
2、将配置文件的属性赋给实体类
当有很多配置属性时 ,如果逐个地读取属性会非常麻烦。通常的做法会把这些属性名作为变量名来创建一个JavaBean 的变量,并将属性值赋给JavaBean 变量的值。在配置文件application.properties中添加如下属性:
my:
name:hello
age:18
number:${random.int}
uuid:${random.uuid}
max:${random.int(10)}
value:${random.value}
gretting:hi,i am ${my.name}
其中,配置文件中用到了${random},它可以用来生成各种不同类型的随机值。random.int随机生成一个int类型的值,random.uuid 随机生成一个uuid, random.value 随机生成一个值,random.int(10)随机生成一个小于10 的整数。
怎么将这些属性赋给一个JavaBean 呢?创建一个JavaBean,其代码清单如下:
package com.example.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* Created by fangzhipeng on 2017/4/18.
*/
@ConfigurationProperties(prefix = "my")
@Component
public class ConfigBean {
private String name;
private int age;
private int number;
private String uuid;
private int max;
private String value;
private String greeting;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public int getMax() {
return max;
}
public void setMax(int max) {
this.max = max;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getGreeting() {
return greeting;
}
public void setGreeting(String greeting) {
this.greeting = greeting;
}
}
在上面的代码中,在ConfigBean 类上加一个注解@ConfigurationProperties表明该类为配置属性类,并加上配置的prefix,例如本案例的"my"。另外需要在ConfigBean 类上加@Component 注解, SpringBoot 在启动时通过包扫描将该类作为一个Bean 注入IoC 容器中。
创建一个Controller,读取ConfigBean 类的属性。在Controller 类上加@EnableConfigurationProperties注解并指明ConfigBean类,其代码清单如下:LucyController:
package com.example.web;
import com.example.bean.ConfigBean;
import com.example.bean.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@EnableConfigurationProperties({ConfigBean.class})
public class LucyController {
@Autowired
ConfigBean configBean;
@RequestMapping(value = "/lucy")
public String hello(){
return configBean.getGreeting()+" >>>>"+configBean.getName()+" >>>>"+ configBean.getUuid()+" >>>>"+configBean.getMax();
}
}
在浏览器上访问http://localhost:8080/lucy,浏览器会显示从配置文件读取的属性。
3、自定义配置文件
有时属性太多,把所有的配置属性都写到application.properties 配置文件中不太合适,这时需要自定义配置文件,例如在src/main/resources 目录下自定义一个test.properties 配置文件,其配置信息如下:
com.example.name=example
com.example.age=19
将这个配置文件test. properties 的属性和属性值赋给一个JavaBean 需要在类名上加@Configuration 、@Property Source 和@ConfigurationProperties 这3个注解。User.java
package com.example.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource(value = "classpath:test.properties")
@ConfigurationProperties(prefix = "com.example")
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
写一个LucyController 的类,在类的上方加上@RestController 注解,开启RestControllerde的功能:加上@EnableConfigurationProperties 注解,并指明需要引用的JavaBean 的类,开启引用配置属性的功能, 其代码清单如下:LucyController.java
package com.example.web;
import com.example.bean.ConfigBean;
import com.example.bean.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@EnableConfigurationProperties({ConfigBean.class,User.class})
public class LucyController {
@Autowired
ConfigBean configBean;
@RequestMapping(value = "/lucy")
public String lucy(){
return configBean.getGreeting()+" >>>>"+configBean.getName()+" >>>>"+ configBean.getUuid()+" >>>>"+configBean.getMax();
}
@Autowired
User user;
@RequestMapping(value = "/user")
public String user(){
return user.getName()+user.getAge();
}
}
在浏览器上访问http://localhost:8080/user。浏览器会显示example:19这说明白定义配置文件的属性被读取到了JavaBean 中。
多个环境的配置文件
在实际的开发过程中,可能有多个不同环境的配置文件, 例如: 开发环境、测试环境、生产环境等。SpringBoot支持程序启动时在配置文件applicaition.properties中指定环境的配置文件,配置文件的格式为application-{profile} .properties ,其中{profile }对应环境标识,例如:
application-test.properties ————测试环境
application-dev.properties ————开发环境
application-prod.properties ————生产环境
指定这个环境配置文件只需要在application.profiles中加上spring.profiles.active 的配置,该配置指定采用哪一个profiles,例如使用application-dev.properties,则配置代码如下:
my:
name:hello
age:18
number:${random.int}
uuid:${random.uuid}
max:${random.int(10)}
value:${random.value}
gretting:hi,i am ${my.name}
spring:
profiles:
active: dev
application-dev.profiles的配置文件中指定程序的启动端口, 配置代码如下:
server:
port: 8082
启动工程, 查看控制台打印的日志, 程序的启动端口为8082 , 而不是默认的8080, 这说明配置文件生效了
————————————————————————————————————————————