简介
spring boot可以轻松构建独立运行的,产品级的spring应用程序。其设计目的是简化Spring应用的初始搭建以及开发过程。把开发者从庞杂的配置中解放出来,将精力集中于业务开发上。
主要特性:
1、创建独立的Spring应用程序。
2、带嵌入型Tomcat/Jetty容器,无需部署WAR文件。
3、简化Maven配置。
4、自动化配置Spring。
5、提供生产就绪型功能,如指标,健康检查和外部配置。
6、绝对没有代码生成并且对XML也没有配置要求。
springboot的参考文档总体上组织地有些无头无绪,感觉是把该写的都写了,但又抓不住要领。
用一句话总结springboot的话,就是一个以spring为基础的快速构建框架,比spring还快,还轻。
![](/qrcode.jpg)
建构工程
1、访问http://start.spring.io/
2、选择构建工具Maven Project、Spring Boot版本及一些工程信息,点击"Switch to the full version.",选择java版本及相关组件。
3、点击Generate Project生成项目压缩包。
工程目录
工程结构还是可以和普通的spring程序差不多。没有定规,随需要确定。
1、程序文件,src/main/java/
+- com
+- example
+- demo
+- DemoApplication.java
|
+- domain
| - User.java
|
+- dao
| - UserDao.java
|
+- service
| - UserService.java
+- impl
| - UserServiceImpl.java
|
+- controller
| - UserController.java
1)、DemoApplication.java,放到根目录,用于框架层面的配置。
2)、domain,业务实体类。
3)、dao,数据操作类(如果有ORM框架,就在这里写相应的配置)。
4)、service,业务服务类(接口及实现)。
4)、controller,页面访问控制。
2、资源文件,src/main/resouces
+- static,静态资源目录
+- templates,模板资源目录
+- application.properties(yml),全局配置文件
3、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.forezp</groupId>
<artifactId>springboot-first-application</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot-first-application</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath />
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
其中spring-boot-starter-web不仅包含spring-boot-starter,还自动开启了web功能。
功能演示
创建controller:
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
public class UserController {
@RequestMapping("/")
public String index() {
return "Hello, Spring Boot.";
}
}
启动DemoApplication,打开浏览器localhost:8080,浏览器显示:
Hello, Spring Boot.
启动springboot
cd到项目主目录:
mvn clean package 编译项目的jar
mvn spring-boot: run 启动
cd 到target目录,java -jar 项目.jar
启动时注入了哪些bean
在程序入口加入:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public CommandLineRunner commandLineRunner(final ApplicationContext ctx) {
return args -> {
System.out.println("----Spring Boot注入的bean----");
String[] beanNames = ctx.getBeanDefinitionNames();
Arrays.sort(beanNames);
for (String beanName : beanNames) {
System.out.println("---beanName--" + beanName);
}
};
}
}
程序输出:
basicErrorController
beanNameHandlerMapping
beanNameViewResolver
characterEncodingFilter
...
在程序启动的时候,springboot自动注入了40-50个bean。
单元测试
通过@RunWith(),@SpringBootTest开启:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloControllerIT {
@LocalServerPort
private int port;
private URL base;
@Autowired
private TestRestTemplate template;
@Before
public void setUp() throws Exception {
this.base = new URL("http://localhost:" + port + "/");
}
@Test
public void getHello() throws Exception {
ResponseEntity<String> response = template.getForEntity(base.toString(),
String.class);
assertThat(response.getBody(), equalTo("Hello, Spring Boot."));
}
}
运行它会先开启sprigboot工程,然后再测试。
启动方式
springboot启动有多种方式。
方式1、作为java程序,运行Application类的main方法。
方式2、在应用根目录下,运行mvn spring-boot:run。
方式3、使用mvn depoly生成jar后运行。
先到项目根目录生成jar包。
mvn depoly
cd target
java -jar SpingBootApp01.jar
默认端口
有时可能需要启动不止一个SpringBoot,而SpringBoot默认端口是8080,所以需要修改。修改默认端口有几种方法。
方法1,修改application.properties。
在application.properties中:server.port=8004。
在SpringBoot中有一个类:ServerProperties。
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties implements EmbeddedServletContainerCustomizer, EnvironmentAware, Ordered {
// Server HTTP port.
private Integer port;
类里有一个@ConfigurationProperties注解,会读取SpringBoot的默认配置文件application.properties的值注入到bean里。其中定义了一个server的前缀和一个port字段,在SpringBoot启动时会读取到server.port的值。
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
if (getPort() != null) {
container.setPort(getPort());
}
customize方法会给SpringBoot设置读取到的端口号。
方法2,覆写customize方法
实现EmbeddedServletContainerCustomizer接口,并覆写customize方法。
@RestController
@EnableAutoConfiguration
@ComponentScan
public class FirstExample implements EmbeddedServletContainerCustomizer {
@RequestMapping("/first.do")
String home() {
return "Hello World";
}
public static void main(String[] args) {
SpringApplication.run(FirstExample.class, args);
}
@Override
public void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) {
configurableEmbeddedServletContainer.setPort(8003);
}
}
方法3,使用命令行参数或JVM参数
用命令行参数在启动的时候修改。
java -jar SpringBootApp.jar --server.port=8000
或放到JVM参数里修改。
-Dserver.port=8009
停止
可通过HTTP发送shutdown信号或使用service stop的方式。
方式一:通过HTTP发送shutdown信号
主要依赖Spring Boot Actuator的endpoint特性,具体步骤如下:
1、在pom.xml中引入actuator依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2、开启shutdown endpoint
Spring Boot Actuator的shutdown endpoint默认是关闭的。
#启用shutdown
endpoints.shutdown.enabled=true
#禁用密码验证
endpoints.shutdown.sensitive=false
3、发送shutdown信号
shutdown的默认url为host:port/shutdown,当需要停止服务时,向服务器post该请求即可,如:
curl -X POST host:port/shutdown
将得到形如{"message":"Shutting down, bye..."}的响应。
4、启用安全设置
该方法非常方便远程操作,注意使用时,必须对该请求进行必要的安全设置,比如借助spring-boot-starter-security进行身份认证。
添加security依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
开启安全验证
#开启shutdown的安全验证
endpoints.shutdown.sensitive=true
#验证用户名
security.user.name=admin
#验证密码
security.user.password=secret
#角色
management.security.role=SUPERUSER
指定路径、IP、端口
#指定shutdown endpoint的路径
endpoints.shutdown.path=/custompath
#也可以统一指定所有endpoints的路径`management.context-path=/manage`
#指定管理端口和IP
management.port=8081
management.address=127.0.0.1
方式二:部署为Unix/Linux Service
用spring-boot-maven-plugin创建"Fully executable"jar,这种jar包内置一个shell脚本,可以方便地将应用设置为Unix/Linux的系统服务(init.d service)。官方对该功能在CentOS和Ubuntu进行了测试,对于OS X和FreeBSD,可能需要自定义。具体步骤如下:
1、在pom.xml中引入插件:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
2、设置为系统服务
将应用打成jar包,部署到服务器,假设部署路径为/var/app,包名为app.jar,通过如下方式将应该设置为一个系统服务:
sudo ln -s /var/app/app.jar /etc/init.d/app
3、赋予可执行权限:
chmod u+x app.jar
4、以系统服务的方式管理
使用service foo start|stop|restart启停应用。
sudo service app start|stop
得到形如Started|Stopped [PID]的结果反馈。
默认PID文件路径:/var/run/appname/appname.pid
默认日志文件路径:/var/log/appname.log
5、自定义参数
在这种方式下,还可以使用自定义的.conf文件来变更默认配置。
在jar包相同路径下创建一个.conf文件,名称与jar文件相同,如appname.conf。
在其中配置相关变量。
JAVA_HOME=/usr/local/jdk
JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log
6、安全设置
为服务创建一个独立的用户,同时最好将该用户的shell绑定为/usr/sbin/nologin
赋予最小范围权限:chmod 500 app.jar
阻止修改:sudo chattr +i app.jar
对.conf文件做类似的工作:chmod 400 app.conf,sudo chown root:root app.conf。