zoukankan      html  css  js  c++  java
  • springboot学习(二)基础配置

    Spring Boot要求main()方法所在的启动类必须放到根package下,命名不做要求

    spring-boot-starter-parent详解

    spring-boot-starter-parent是一个特殊的starter,它用来提供相关的Maven默认依赖。使用它之后,常用的包依赖可以省去version标签,会从parent这里继承,spring-boot-starter-parent 的基本功能

    1. 定义了 Java 编译版本为 1.8 。

    2. 使用 UTF-8 格式编码。

    3. 继承自 spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。

    4. 执行打包操作的配置。

    5. 自动化的资源过滤。

    6. 自动化的插件配置。

    7. 针对 application.properties 和 application.yml 的资源过滤,包括通过 profile 定义的不同环境的配置文件,例如 application-dev.properties 和 application-dev.yml。

    请注意,由于application.properties和application.yml文件接受Spring样式占位符 ${...} ,因此 Maven 过滤更改为使用 @..@ 占位符,当然开发者可以通过设置名为 resource.delimiter 的Maven 属性来覆盖 @..@ 占位符。

    配置文件

    在 Spring Boot 中,配置文件有两种不同的格式,一个是 properties ,另一个是 yaml 。

    虽然 properties 文件比较常见,但是相对于 properties 而言,yaml 更加简洁明了,而且使用的场景也更多,除了简洁,yaml 还有另外一个特点,就是 yaml 中的数据是有序的,properties 中的数据是无序的,在一些需要路径匹配的配置中,顺序就显得尤为重要,此时我们一般采用 yaml。

    application.properties

    在 Spring Boot 中,一共有 4 个地方可以存放 application.properties 文件。

    • 当前项目根目录下的 config 目录下

    • 当前项目的根目录下

    • resources 目录下的 config 目录下

    • resources 目录下

    按如上顺序,四个配置文件的优先级依次降低。如下:

    null

    这四个位置是默认位置,即 Spring Boot 启动,默认会从这四个位置按顺序去查找相关属性并加载。

    我们也可以在项目启动时自定义配置文件位置,通过 spring.config.location 属性来手动的指定配置文件位置,指定完成后,系统就会自动去指定目录下查找 application.properties 文件

    如果项目已经打包成 jar ,在启动命令中加入位置参数即可:

    java -jar properties-0.0.1-SNAPSHOT.jar --spring.config.location=classpath:/...

    普通属性注入

    properties 文件中的配置可以 通过 @PropertySource 来引入@PropertySource("classpath:book.properties"),通过@Value注解 @Value("${key.id}")获取properties文件中的配置

    类型安全的属性注入

    引入 @ConfigurationProperties(prefix = "book") 注解,并且配置了属性的前缀,此时会自动将 Spring 容器中对应的数据注入到对象对应的属性中,就不用通过 @Value 注解挨个注入了,减少工作量并且避免出错

    yaml配置

    application.yaml在Spring Boot中可以写在四个不同的位置,分别是如下位置:

    1. 项目根目录下的config目录中

    2. 项目根目录下

    3. classpath下的config目录中

    4. classpath目录下

    四个位置中的application.yaml文件的优先级按照上面列出的顺序依次降低。即如果有同一个属性在四个文件中都出现了,以优先级高的为准

    可以自己定义yaml文件位置,两种方式:

    • 一个是使用 spring.config.location属性,表示自己重新定义配置文件的位置,项目启动时就按照定义的位置去查找配置文件,这种定义方式会覆盖掉默认的四个位置,

    • 另一个则是使用 spring.config.additional-location这个属性,表示在四个位置的基础上,再添加几个位置,新添加的位置的优先级大于原本的位置。

    不同于properties文件的无序,yaml配置是有序的,yaml配置目前不支持@PropertySource注解。

    支持HTTPS

    生成证书

    借助 Java 自带的 JDK 管理工具 keytool 来生成一个免费的 https 证书。

    进入到 %JAVVA_HOME%in 目录下,执行如下命令生成一个数字证书:

    keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048  -keystore D:javaboy.p12 -validity 365

    命令含义如下:

    • genkey 表示要创建一个新的密钥。

    • alias 表示 keystore 的别名。

    • keyalg 表示使用的加密算法是 RSA ,一种非对称加密算法。

    • keysize 表示密钥的长度。

    • keystore 表示生成的密钥存放位置。

    • validity 表示密钥的有效时间,单位为天。

    引入HTTPS

    将上面生成的 javaboy.p12 拷贝到 Spring Boot 项目的 resources 目录下。然后在 application.properties 中添加如下配置:

    server.ssl.key-store=classpath:javaboy.p12server.ssl.key-alias=tomcathttpsserver.ssl.key-store-password=111111

    其中:

    • key-store表示密钥文件名。

    • key-alias表示密钥别名。

    • key-store-password就是在cmd命令执行过程中输入的密码。

    配置完成后,就可以启动 Spring Boot 项目了,此时如果我们直接使用 Http 协议来访问接口会报错,只能使用HTTPS访问

    请求转发

    考虑到 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(8081);
           connector.setSecure(false);
           connector.setRedirectPort(8080);
           return connector;
      }
    }

    我们配置了 Http 的请求端口为 8081,所有来自 8081 的请求,将被自动重定向到 8080 这个 https 的端口上。

    如此之后,我们再去访问 http 请求,就会自动重定向到 https。

  • 相关阅读:
    C++栈(stack)、队列(queue)、链表(list)的常用函数
    C++中cin>>a原理
    C++中vector和堆的常用使用方法&例题:数据流中的中位数
    使用centos8搭建僵尸毁灭工程(PZ)服务器
    【从C#走进Python】四、装饰器
    【从C#走进Python】三、变量声明
    【从C#走进Python】二、迭代器
    【从C#走进Python】一、上下文管理器
    【C#基础】拥抱Lambda(2):表达式树与LINQ
    【机器学习笔记】Python机器学习基本语法
  • 原文地址:https://www.cnblogs.com/yjh1995/p/14164417.html
Copyright © 2011-2022 走看看