本章概要
- 不使用spring-boot-starter-parent
- @Spring BootApplication
- 定制banner
- Web容器配置
2.1 不使用spring-boot-starter-parent
spring-boot-starter-parent主要提供了如下默认配置:
- Java版本默认使用1.8
- 编码格式默认使用UTF-8
- 提供Dependency Management 进行项目依赖的版本管理
- 默认的资源过滤与插件配置
spring-boot-starter-parent 虽然方便,但公司在开发微服务项目或多模块项目时一般需要使用公司自己的 parent,这个时候如果还想进行项目依赖版本的统一管理,就需要使用depenManagement来实现了。添加如下代码到pom.xml中:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
此时就可以不用继承spring-boot-starter-parent了,但是Java的版本、编码的格式等都需要开发者手动配置。Java版本的配置很简单,添加一个plugin即可
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
至于编码格式,如果是直接创建的Spring Boot项目,那么编码格式默认会加上;如果是普通Maven项目配置成的Spring Boot项目,那么在pom.xml文件中加入如下配置:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
2.2 @Spring BootApplication
@Spring BootApplication 实际上是一个组合注解,定义如下:
//@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM , classes = TypeExcludeFilter.class),
@ComponentScan.Filter(type = FilterType.CUSTOM,classes = AutoConfigurationExcludeFilter.class)
})
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
这个注解由三个注解组成
①第一个@SpringBootConfiguration的定义如下:
@Configuration
public @interface SpringBootConfiguration {
}
原来就是一个@Configuration,所以@SpringBootConfiguration的功能就是表名这是一个配置类,开发者可以在这个类中配置Bean。从这个角度来讲,这个类所扮演的角色有点类似于Spring中applicationContext.xml文件的角色。
②第二个注解@EnableAutoConfiguration表示开启自动化配置。Spring Boot中的自动化配置是非侵入式的,在任意时刻,开发者都可以使用自定义配置代替自动化配置中的某一个配置。
③第三个注解@ComponentScan完成包扫描,也是Spring中的功能。由于@ComponentScan注解默认扫描的类都位于当前类所在的包的下面,因此建议在实际项目开发中把项目启动类放在根包中,如图:
虽然项目的启动类也包含@Configuration 注解,但是开发者可以创建一个新的类专门用来配置Bean,这样便于配置管理。这个类只需要加上@Configuration 注解即可,如下:
@Configuration
public class MyConfig {
}
项目启动类中的@ComponentScan 注解,除了扫描@service、@Repository、@Component、@Controller和@RestController等之外,也会扫描@Configuration注解的类
2.3 定制banner
Spring Boot项目在启动时会打印一个banner,如图
![image.png](https://img-blog.csdnimg.cn/img_convert/cf55f9e52e177e8018842efd790c5f2e.png#clientId=ufa88e1ca-2cd8-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=212&id=uca0afd3b&margin=[object Object]&name=image.png&originHeight=212&originWidth=656&originalType=binary&ratio=1&rotation=0&showTitle=false&size=9553&status=done&style=none&taskId=uec8169f9-94b8-4cb4-b216-e2620595908&title=&width=656)
这个banner是可以定制,在resources目录下创建一个banner.txt文件,文件的内容将会被打印出来,艺术字体生成网址:
- http://www.network-science.de/ascii/
- http://www.kammerl.de/ascii/AsciiSingnature.php
- http://patorjk.com/software/taag
也可以配置关闭banner,修改项目启动类的main方法,代码如下:
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplicationBuilder builder = new SpringApplicationBuilder(App.class);
builder.bannerMode(Banner.Mode.OFF).run(args);
}
}
2.4 Web容器配置
2.4.1 Tomcat配置
1. 常规配置
在Spring Boot 项目中,可以内置Tomcat、Jetty、Undertow、Netty等容器。当开发者添加了spring-boot-web依赖后,默认会使用Tomcat作为Web容器。如果需要对Tomcat 做进一步的配置,可以在application.properties中进行配置,代码如下:
server.port=8081
server.error.path=/error
server.servlet.session.timeout=30m
server.servlet.context-path=chapter01
server.tomcat.uri-encoding=utf-8
server.tomcat.max-threads=500
server.tomcat.basedir=E:/Gitee/my-work-space/chapter01/tmp
代码解释:
- server.port 配置了Web容器的端口号
- error.path配置了当项目出错时跳转去的页面
- session.timeout配置了session失效时间,30m标识30分钟,如果不写单位,默认单位是秒。由于Tomcat中配置session 过期时间以分钟为单位,因此这里单位如果是秒的话,该时间会被转换为一个不超过所配置秒数的最大分钟数,例如这里配置了119,默认单位为秒,则实际session过期时间为1分钟
- context-path表示项目名称,不配置默认为/,如果配置了,就要在访问路径中加上配置的路径。
- uri-encoding 表示配置Tomcat请求编码
- max-threads 标识Tomcat最大线程数
- basedir 是一个存放Tomcat运行日志和临时文件的目录,若不配置,则默认使用系统的临时目录
当然,Web容器相关的配置不止这些,这里只列举了一些常用的配置,完整的配置可以参考官方文档Appendix A. Common application properties一节
2. HTTPS配置
由于HTTPS具有良好的安全性,在开发中得到了越来越广泛的应用,像微信公众号、小程序等的开发都要使用HTTPS完成。对于个人开发者面前,一个HTTPS证书的价格还是有点贵,国内有一些云服务器厂商提供免费的HTTPS证书,一个账号可以申请数个。不过在jkd中提供了一个Java数字证书管理工具keytool,在\jdk\bin目录下,通过这个工具可以自己生成一个数字整数,生成命令如下:
keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore E:/Gitee/my-work-space/chapter01/sang.p12 -validity 365
注意:如果生成的文件路径在c盘可能会出现异常,如下
命令解释:
- -genkey 表示要创建一个新的秘钥
- -alias 表示keystore 的别名
- -keyalg 表示使用给的加密算法是RSA,一种非对称加密算法
- -keysize 表示秘钥的长度
- -keystore 表示生成的秘钥存放位置
- -validity 标识秘钥的有效时间,单位为天
在cmd命令窗口中执行如上命令,在执行的过程中需要输入秘钥口令等信息,根据提示输入即可。命令执行完成后,会在当前用户目录下生成一个名为sang.p12 的文件,将这个文件复制到项目的根目录下,然后在application.properties 中做如下配置:
server.ssl.key-store=sang.p12
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=123123
代码解释:
- key-store 表示秘钥文件名
- key-alias 表示秘钥别名
- key-store-password 就是在cmd命令执行过程中输入的密码
配置成功后,启动项目,在浏览器中输入“https:/localhost:8081/chapter01/hello”来查看结果。注意证书是自己生成的,不被浏览器认可,此时添加信任或继续前进即可,如图:
成功运行的结果,如图
此时如果以HTTP的方式访问接口,就会访问失败,如图
这是因为Spring Boot 不支持同时在配置中启动HTTP和HTTPS 。这个时候可以配置请求重定向,将HTTP请求重定向为HTTPS 请求。配置如下:
@Configuration
public class TomcatConfig {
@Bean
TomcatServletWebServerFactory tomcatServletWebServerFactory(){
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext (Context context){
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
factory.addAdditionalTomcatConnectors(createTomcatConnector());
return factory;
}
private Connector createTomcatConnector(){
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8081);
return connector;
}
}
这里首先配置一个TomcatServletWebServerFactory ,然后添加一个Tomcat中的Connector(监听8080端口),并将请求转发到8081上去。配置完成后,在浏览器中输入"http:/localhost:8080/chapter01/hello",就会自动重定向到"https:/localhost:8081/chapter01/hello"上。
2.4.2 Jetty配置
除了Tomcat外,也可以在Spring Boot 中嵌入Jetty ,配置方式如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Jetty配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
主要是从spring-boot-starter-web中除去默认的Tomcat,然后加入Jetty依赖即可。此时启动项目,查看启动日志,如图:
2.4.3 Undertow 配置
Undertow 是一个红帽公司开源的Java服务器,具有非常好的性能,在Spring Boot 中也得到了很好的支持,配置方式与Jetty类似,代码如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
启动后查看日志,如图