SpringBoot_基础配置

一、@Spring BootApplication

@SpringBootApplications注解是添加在项目启动类上的,@SpringBootApplication实际上是一个组合注解,定义如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
//略

这个注解主要讲解三个注解分别为@SpringBootConfiguration、@EnableAutoConfiguration以及
@ComponentScan。

  1. @SpringBootConfiguration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
//略

原来就是一个@Configuration,所以@Spring BootConfiguration的功能就是表明这是一个配置类,可以在这个类中配置Bean。从这角度来讲,这个类所扮演的角色有点类似于Spring中applicationContext.xml文件的角色。

  1. @EnableAutoConfiguration
    @EnableAutoConfiguration表示开启自动化配置。SpringBoot中的自动化配置是非侵入式的,在任意时刻,都可以使用自定义配置代替自动化配置中某一配置。
  2. @ComponentScan
    @ComponentScan完成包扫描,也是Spring中的功能。由于@ComponentScan注解默认扫描的类都位于当前类所在的包的下面,因此建议在实际项目开发中把项目启动类放在根包下。
    在这里插入图片描述
    注意:虽然项目中的启动类也包含@Configuration注解,但是开发者可以创建一个新的类专门用来配置Bean,这样便于配置的管理。这个类只需要加上@Configuration注解即可,代码如下:

在这里插入图片描述
项目启动类中的@ComponentScan注解,除了扫描@Service、@Repository、@Component、@Controller和@RestController等之外,也会扫描@Configuration注解的类。

二、定制banner

在这里插入图片描述
这个启动时打印的banner是可以定制的,在resources目录下创建一个banner.txt文件,在这个文件中写入的文本将在项目启动时打印出来。如果想将txt文本中设置成艺术字,可以参考下列链接

http://www.network-science.de/ascii/
https://www.kammerl.de/ascii/AsciiSignature.php
http://patorjk.com/software/taag/#p=display&f=Graffiti&t=Type%20Something%20

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以第一链接为例:

在这里插入图片描述想关闭banner也是可以的,修改项目启动类的main方法,代码如下:

       SpringApplicationBuilder builder =  new SpringApplicationBuilder(DemoApplication.class);
       builder.bannerMode(Banner.Mode.OFF).run(args);

通过SpringApplicationBuilder来设置bannerMode为OFF,就可以关闭banner了。在这里插入图片描述

三、Web容器配置

  1. Tomcat配置
  • 常规配置
    在Spring Boot项目中,可以内置Tomcat、Jetty、Undertow、Netty等容器。当添加了spring-boot-starter-web依赖之后,默认会使用Tomcat作为Web容器。如果需要对Tomcat做进一步的配置,可以在application。properties中进行配置,代码如下:
server.port=8081
server.error.path=/error
server.servlet.session.timeout=30m
server.servlet.context-path=/
server.tomcat.uri-encoding=UTF-8
server.tomcat.threads.max=200
server.tomcat.basedir=/home/tmp

解释如下:

  • server.port配置了Web容器的端口号。
  • error.path配置了当项目中出错时跳转去的页面。
  • session.timeout配置了session失效时间,30m表示30分钟,如果不写单位,默认单位是秒,由于tomcat中配置session过期时间以分钟为单位。因此这里单位如果是秒的话,该时间会被转换为一个不超过所配置秒数的最大分钟数,例如这里配置了119,默认单位为秒,则实际session过期时间为1分钟。
  • context-path表示项目内容,不配置时默认为/。如果配置了,就要在访问路径上加上配置的路径。
  • uri-encoding表示tomcat请求编码
  • threads.max表示tomcat最大线程数
  • basedir是一个存放tomcat运行日志和临时文件的目录,若不配置,则默认使用系统的临时目录。

完成的application配置可以参考
https://docs.spring.io/spring-boot/docs/1.1.5.RELEASE/reference/html/common-application-properties.html

Windows的临时文件夹 :C:\Users[用户名]\AppData\Local\Temp

  1. HTTPS配置
    jdk中提供了一个Java数字证书管理工具keytool,在\jdk\bin目录下,通过这个工具可以自己生成一个数字证书。生成命令如下:
keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore sang.pl2 -validity 365

在这里插入图片描述

server.ssl.key-store=sang.pl2
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=123456
解释:

在这里插入图片描述

在这里插入图片描述
此时,如果以HTTP的方式访问接口,就会访问失败。
这是因为SpringBoot不支持同时在配置中启动HTTP和HTTPS。这个时候可以配置请求重定向,将HTTP请求重定向为HTTPS请求。配置如下:
https://my.oschina.net/u/3049601/blog/3147847

package com.cjw.demo.Config;

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.startup.Tomcat;
import org.apache.coyote.http11.Http11NioProtocol;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class TomcatConfig {
    @Bean
    TomcatServletWebServerFactory tomcatServletWebServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
            protected void postProcessContext(Context contxt) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                constraint.addCollection(collection);
                contxt.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上去。

  1. 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>
  1. Undertow配置
   <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>

四、Properties配置

在实际项目中不可避免会有一些需要自己手动配置,承载这些自定义配置的文件就是resources目录下的application.properties文件。
SpringBoot项目中的application.properties配置文件一共可以出现在如下4个位置:

  • 项目根目录下的config文件夹中
  • 项目根目录下
  • classpath下的config文件夹中
  • classpath

在这里插入图片描述
可以使用server.port进行测试
执行顺序依次如上面顺序,application.yml优先级同application.properties文件一样。
默认情况下,SpringBoot会按照上述优先级顺序依次查找application.properties并加载。当然也可以自定义配置文件名称,例如在resource目录下建一个配置文件app.properties,然后将项目打成jar包,打包成功后,使用如下命令运行:

java -jar demo-0.0.1-SNAPSHOT.jar --spring.config.name=app
运行时指定配置文件的名字。使用spring.config.location可以指定配置文件所在目录(注意需要以/结束)
java -jar demo-0.0.1-SNAPSHOT.jar --spring.config.name=app --spring.config.location=classpath:/

补充:使用maven打包成jar,pom.xml文件添加如下配置

  <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>

如果maven仓库已经下载了jar包,删除即可。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

五、类型安全配置属性

无论是Properties配置还是YAML配置,最终都会被加载到SpringEnvironment中。Spring提供了@Value注解以及EnvironmentAware接口来将Spring Environment中的数据注入到属性上,SpringBoot对此进一步提出了类型安全配置属性(Type-safe Configuration Properties),也可以更加方便地将配置文件中的数据注入Bean中。application.properties中添加如下配置:

book.name=三国演义
book.author=罗贯中
book.price=30


@Component
@ConfigurationProperties(prefix = "book")
public class Book {

    private String name;

    private String author;

    private Float price;
  • @ConfigurationProperites中的prefix属性描述了要架子啊的配置加载的配置文件前缀
  • 如果配置文件是一个YAML文件,那么可以将数据注入一个集合中。
  • SpringBoot采用了一种宽松的规则来进行属性绑定,如果Bean中的属性名为authorName,那么配置文本中的属性可以是book.author_name、book.author-name、book.authorName或者book.AUTHORANME.
    在这里插入图片描述

关于Transparent native-to-ascii conversion
根据我问其他人和我个人的实验,建议不要勾选,除非这个项目是你的个人项目或者整个项目团队中其他人都勾选了。

根据我个人理解,我觉得这个选项的作用是把你properties中的ASCII码转换成中文展示给你了。比如勾选之前在properties中定义name=\u5317\u4eac,勾选以后看到的是name=北京。

有这么两种场景:
第一种:勾选。在properties敲中文的备注和中文的待读取内容:1.取消勾选以后,看到到中文全都转成ASCII;2.其他团队成员拉取到的代码是ASCII;3.push到git上面是ASCII。也就是说比如有同事用的eclipse用中文写的备注,你这边编辑以后push会把原来中文的注释全都用ASCII覆盖,这个就是勾选以后造成的影响。

第二种:不勾选。在properties敲中文的备注,取消勾选以后看到的也是中文,因为它本身不是ASCII没法转码,暂时没发现什么问题;在properties敲中文的待读取内容,代码读取到的是乱码,这个是我遇到的问题,我把这些中文换成ASCII,读取到的就是正常的了。

七、YAML配置

  1. 常规配置
    YAML是JSON的超集,简洁而强大。在创建一个Spring Boot项目时,引入的spring-boot-starter-web依赖间接地引入了snakeyaml依赖,snakeyaml会实现对YAML配置解析。YAML的使用非常简单,利用缩进表示层级关系,并且大小写敏感。在SpringBoot项目中使用YAML只需要在resourses目录下创建一个application.yml文件既可,然后向application.yml中添加如下配置:
    在这里插入图片描述
  2. 复杂配置
    YAML不仅可以配置常规属性,也可以配置复杂属性。
  • 常规配置

在这里插入图片描述

  • 列表配置

在这里插入图片描述

  • 集合也可以是一个对象。在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在SpringBoot中使用YAML虽然方便,但是YAML也有一些缺陷,例如无法使用@PropertiesSource注解加载YAML文件,如果项目中有这种需求,还是需要使用Properties格式的配置文件。

八、Profile

一般项目发布之前,一般需要频繁地在开发环境、测试环境以及生产环境之间进行切换,Spring对此提供了解决方案(@Profile注解),SpringBoot则更进一步提供了更加简洁的解决方案,SpringBoot中约定的不同环境下的配置文件名称规则为application-{profile}.properties,profile占位符表示当前环境的名称,具体配置步骤如下:

  1. 创建配置文件
    首先在resources目录下创建两个配置文件:application-dev.properties和application-prod.properties,分别表示开发环境中的配置和生产环境中的配置。其中,application-dev.properties文件内容如下:
server.port=8080

application-prod.properties文件的内容如下:

server.port=80
  1. 配置application.properties
spring.profile.active=dev

这个表示使用application-dev.properties配置文件启动项目,若将dev改为prod,则表示使用application-prod.properties启动项目。项目启动成功后,就可以通过项目的端口进行访问了。

  1. 在代码中配置
    对于第二步在application.properties中添加的配置,可以在代码中配置来完成,在启动类的mian方法上添加如下代码,可以替换第二步的配置:
       SpringApplicationBuilder builder =  new SpringApplicationBuilder(DemoApplication.class);
        builder.application().setAdditionalProfiles("prod");
        builder.run();

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 项目启动时配置
    对于2和3提到的两种配置方式,也可以在将项目打成jar包后启动时,在命令行动态指定当前环境,命令如下:
java -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值