无关···············································

@Configuration注解

spring容器在启动的时候会默认加载一些PostProcess( 后置处理器),在这些后置处理器中有一个处理器叫ConfigurationClassPostProcess 这个处理器专门去处理带有@Configuration注解的类

无关···············································

 

web容器基本配置

spring.main.web-application-type=none   //禁用web容器,点击运行以后就像个普通的没导web依赖的项目一样

server.port=8088    //配置端口号

server.port=-1    //不设置任何端口  关闭所有的http端点

server.port=0  //每次启动的端口号都是随机的

 

现在写一个小例子

 

@RestController
public class HelloController {
    @GetMapping("/hello")
    public List<String> useres(){
        ArrayList<String> numbers = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            numbers.add(i+"");
        }
        return numbers;
    }
}

数据量太大了  1000个

springboot达成war包日志输出到哪里 springboot日志配置文件_tomcat

 

 

 

 注意看一下,我们的响应头里没有说请求压缩的事情

springboot达成war包日志输出到哪里 springboot日志配置文件_spring_02

 

 

 

开启压缩很简单,在配置文件里配置一下就好了

server.compression.enabled=true

现在看这个响应头,现在就开启了压缩 gzip

 

 日志配置

Tomcat的日志分为两种类型

-  访问日志 accesslog 

-  服务器内部日志  

 

默认,日志是不开启的,需要我们配置开启

 

访问日志:

#生成的访问日志将在该目录下(这样写就是在根目录下)
server.tomcat.basedir=my-hihihi
#开启访问日志,默认的日志位置在项目运行的临时目录中(或者我们指定的目录中)
server.tomcat.accesslog.enabled=true
默认生成的日志格式:access_log.2020-12-10.log
当然了,我们也可以更改默认的 前缀 和 后缀
server.tomcat.accesslog.prefix=javaboy_log
server.tomcat.accesslog.suffix=.log

服务器内部日志:logging.level.org.apache.tomcat=debug

 

logging.level.org.apache.catalina=debug

 

HTTPS证书配置

一般我们在nginx里面配置,不在springboot内嵌的tomcat里面配置。在nginx里配置更简单

 

首先我们用jdk的keytool自己生成一个证书

在jdk的bin目录里面 cmd 敲上 keytool

 

 接着敲 :   keytool -genkeypair -alias selfsigned_localhost_sslserver -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore ebininfosoft-ssl-key.p12 -validity 3650

生成证书 别名是selfsigned_localhost_sslserver 加密算法是RSA 证书大小是2048 存储的位置和文件名是ebininfosoft-ssl-key..p12

接着敲密码:我设置的是123456 这个密码挺重要,后面会用到 。  后面有些信息不想输入就直接回车跳过就行了

springboot达成war包日志输出到哪里 springboot日志配置文件_tomcat_03

 

 

 可以看到外面生成的证书了

springboot达成war包日志输出到哪里 springboot日志配置文件_tomcat_04

 

 

 

 然后把这个东西移到我们idea的resources目录下,再在配置文件中配置一下

 

#SSL Key Info
security.require-ssl=true
server.ssl.key-store-password=123456
server.ssl.key-store=src/main/resources/ebininfosoft-ssl-key.p12
server.ssl.key-store-type=PKCS12

 

 

 

现在我们点一下运行,测试一下

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String toHelloController(){
        return "666";
    }
}

 

现在我们输localhost:8080是进不去的

加上https才能进去

springboot达成war包日志输出到哪里 springboot日志配置文件_tomcat_05

 

 

 但是这样对用户不太友好,得让http的请求自动跳转到https

我们写一个配置类 用@Configuration注解的类就是配置类

现在我们在地址栏打localhost:8081/hello 就会自动变成https请求  https://localhost:8080/hello

package com.zou.myhttps;

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
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 {
    //注入到spring容器中
    @Bean
    TomcatServletWebServerFactory tomcatServletWebServerFactory(){
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        factory.addAdditionalTomcatConnectors(myConnectors());
        return factory;
    }

    //连接器
    private Connector myConnectors() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8081);    //没主动配置 所以https端口是8080 那我给http8081吧
        connector.setSecure(false);
        connector.setRedirectPort(8080);
        return connector;
    }
}

 

 配置文件有四个位置

这四个位置的优先级依次降低

- config/application.properties

- application.properties

- src/main/resources/config/application.properties

- src/main/resources/application.properties

 

属性普通注入方式

实体类:

 

@Component
public class Book {

    @Value("${book.name}")
    private String name;
    @Value("${book.author}")
    private String author;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                '}';
    }
}

 

application.properties

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

test

springboot达成war包日志输出到哪里 springboot日志配置文件_日志文件_06

 


 

 

控制台乱码问题:

springboot达成war包日志输出到哪里 springboot日志配置文件_tomcat_07

 

 

但是现实中我们不这么写,如果我们真的有这种需求就格外写一个配置文件

但是现在出问题了,springboot启动后自动加载application.properties不会自动加载我们自己写的book.properties

springboot达成war包日志输出到哪里 springboot日志配置文件_日志文件_08

 


 

数组注入

springboot达成war包日志输出到哪里 springboot日志配置文件_tomcat_09

 


 

 

 

 

springboot达成war包日志输出到哪里 springboot日志配置文件_tomcat_10

 

 

普通的注入讲完了,但是如果属性特别多,,特别复杂咋办啊???

 

那就用类型安全的属性注入

 

类型安全的属性注入

写上前缀之后,就自动我们写好的@PropertySource("classpath:book.properties")这个配置文件中找了

springboot达成war包日志输出到哪里 springboot日志配置文件_spring_11

 

 

 

 

springboot达成war包日志输出到哪里 springboot日志配置文件_日志文件_12

 

 

yaml格式

注意冒号后面还有个空格

 

日志

 

日志门面:

日志门面定义了一组日志的接口规范,它并不提供底层具体的实现逻辑。Apache Commons Logging和slf4j就属于这一类。

日志实现:

日志实现则是日志具体的实现,包括日志级别控制,日志打印格式,日志输出形式(输出到数据库,输出到文件,输出到控制台等)。log4j  log4j2  logback以及java util logging则属于这一类

 

将日志门面和日志实现分离其实是一种典型的门面模式,这种方式可以让业务在不同的日志框架之间自由切换而不需要改动任何代码,开发者只需要掌握日志门面的API即可

 

日志级别:

 

springboot日志实现

 

Spring Boot 使用 Apache Commons Logging 作为内部的日志框架门面,它只是一个日志接口,在实际应用中需要为该接口来指定相应的日志实现。

 

Spring Boot 默认的日志实现是 Logback。这个很好查看:随便启动一个 Spring Boot 项目,从控制台找一行日志,例如下面这样:

springboot达成war包日志输出到哪里 springboot日志配置文件_日志文件_13

 

The following profiles are active,结果如下:

springboot达成war包日志输出到哪里 springboot日志配置文件_tomcat_14

 

 在日志输出的那一行 debug。然后再次启动项目,如下图:

springboot达成war包日志输出到哪里 springboot日志配置文件_spring_15

 

 

此时我们就可以看到真正的日志实现是 Logback

其他的诸如 Java Util LoggingLog4j 等框架,Spring Boot 也有很好的支持。

在 Spring Boot 项目中,只要添加了如下 web 依赖,日志依赖就自动添加进来了:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Spring Boot 日志配置

Spring Boot 的日志系统会自动根据 classpath 下的内容选择合适的日志配置,在这个过程中首选 Logback。

如果开发者需要修改日志级别,只需要在 application.properties 文件中通过 logging.level 前缀+包名

logging.level.org.springframework.web=debug
logging.level.org.hibernate=error

如果你想将日志输出到文件,可以通过如下配置指定日志文件名:

logging.file.name=javaboy.log

logging.file.name 可以只指定日志文件名,也可以指定日志文件全路径,例如下面这样:

logging.file.name=/Users/sang/Documents/javaboy/javaboy.log

如果你只是想重新定义输出日志文件的路径,也可以使用 logging.file.path 属性,如下:

logging.file.path=/Users/sang/Documents/javaboy

如果想对输出到文件中的日志进行精细化管理,还有如下一些属性可以配置:

  • logging.logback.rollingpolicy.file-name-pattern:日志归档的文件名,日志文件达到一定大小之后,自动进行压缩归档。
  • logging.logback.rollingpolicy.clean-history-on-start:是否在应用启动时进行归档管理。
  • logging.logback.rollingpolicy.max-file-size:日志文件大小上限,达到该上限后,会自动压缩。
  • logging.logback.rollingpolicy.total-size-cap:日志文件被删除之前,可以容纳的最大大小。
  • logging.logback.rollingpolicy.max-history:日志文件保存的天数。

日志文件归档这块,小伙伴们感兴趣可以自己试下,可以首先将 max-file-size 属性调小,这样方便看到效果:

logging.logback.rollingpolicy.max-file-size=1MB

然后添加如下接口:
@RestController
public class HelloController {
    private static final Logger logger = getLogger(HelloController.class);
    @GetMapping("/hello")
    public void hello() {
        for (int i = 0; i < 100000; i++) {
            logger.info("hello javaboy");
        }
    }
}