springboot学习16

一、 自动配置:
1、 Spring 环境

1)应用程序属性配置文件
Spring Boot 自动配置的 bean 都可以通过从 Spring 环境中提取的属性进行配置。

在 src/main/resources/application.properties
application.properties

server.port=8081

或者在src/main/resources/application.yml
application.yml

server:
  port: 8081

2)命令行参数
命令行终端中执行:

java -jardemo-1.0-SNAPSHOT.jar --server.port=8081

3)JVM 系统属性

4)操作系统环境变量

export SERVER_PORT=8081

注意:

在将属性设置为环境变量时,命名风格略有不同,以适应操作系统对环境变量名称的限制。
Spring 能够将其分类并将 SERVER_PORT 转译为 server.port。

2、配置数据源
如mysql数据库,在application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/demotest?characterEncoding=utf-8&serverTimezone=GMT%2B8
    username: demotest
    password: 123456
#   driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    properties:
      hibernate:
        show_sql: true
        format_sql: true
# redis配置
 redis:
     localhost: localhost
     port: 6379
     database: 2
     password:
# rocketmq配置
rocketmq:
  consumer:
    consumer-group: DemoConsumerGroup
  producer:
    producer-group: DemoProducerGroup
  namesrv-addr: 127.0.0.1:9876
需要将适当的 JDBC 驱动程序添加到构建中,但通常不需要指定 JDBC 驱动程序类;
springboot 可以从数据库 URL 的结构中找到它。
但如果有问题,可以试着设置 spring.datasource.schema 和 spring.datasource.data 属性
spring:
  datasource:
   	url: jdbc:mysql://localhost:3306/demotest?characterEncoding=utf-8&serverTimezone=GMT%2B8
    username: demotest
    password: 123456
    schema:
    - user-schema.sql
    data:
    - user.sql

在 JNDI 中配置数据源,Spring 从那里查找它,通过配置 spring.datasource.jndi-name 来设置数据源。
如果设置了 spring.datasource.jndi-name 属性,那么其他数据源的连接属性(如果设置了)会被忽略

spring:
  datasource:
    url: jdbc:mysql://localhost/demotest?charsetEncoding=utf8&useUnicode=true
    username: demotest
    password: 123456
    jndi-name: java:/comp/env/jdbc/demoDS

3、配置嵌入式服务器

server:
  port: 8000

显式地设置 server.port 为8000,但是服务器不会在端口8000上启动。它将从随机选择的可用端口启动。
但是底层服务器不仅仅是一个端口。需要对底层容器做的最常见的事情之一是将其设置为处理 HTTPS 请求。
首先,通过使用 JDK 的 keytool 命令行工具创建一个密钥存储。

$ keytool -keystore mykeys.jks -genkey -alias tomcat -keyalg RSA

在命令行指定属性或者在 application.properties 或 application.yml 文件中设置它们。
application.yml:

server:
  port: 8443	#开发 HTTPS 服务器的常用选择
  ssl:
  	# server.ssl.key-store,设置为创建密钥存储库文件的路径,file:// URL 表示从文件系统加载它。
  	# 如果将它打包到应用程序 JAR 文件中,将使用一个 classpath: URL来引用它.
    key-store: file:///path/to/mykeys.jks 	
    # server.ssl.key-store-password 属性,设置为创建密钥存储时指定的密码值
    key-store-password: pwddemo
    # server.ssl.key-password 属性, 设置为创建密钥存储时指定的密码值
    key-password: pwddemo

4、配置日志
Spring Boot 默认通过 Logback 配置日志,默认为 INFO 级别,然后写入控制台。
可以在类路径的根目录(在 src/main/resources 中)创建 logback .xml 文件进行配置。
logback .xml:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>
    <logger name="root" level="INFO"/>
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

使用 Spring Boot 配置属性,可以在不创建 logback .xml 文件的情况下进行这些更改。
默认情况下,日志文件在大小达到 10 MB 时就会进行循环写入。

logging:
  path: /var/logs/		# /var/logs/ 文件夹有写权限
  file: Demo.log   # 日志将被写到 /var/logs/Demo.log 文件中
  level:
    root: WARN
    org:
      springframework:
        security: DEBUG

5、使用特殊的属性值
${} 占位符标记:

greeting:
  welcome: ${
    
    spring.application.name}

占位符嵌入到其他文本中:

greeting:
  welcome: You are using ${
    
    spring.application.name}

使用配置属性配置 Spring 自己的组件可以很容易地将值注入这些组件的属性并调整自动配置。

二、创建自定义的配置属性
1、定义配置属性持有者
Spring Boot 提供了@ConfigurationProperties 注释,支持配置属性的属性注入。
@ConfigurationProperties

demotest:
  orders:
    pageSize: 10

OrderProps:

package com.example.springbootlearn.web;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.Data;@Component
@ConfigurationProperties(prefix="demotest.orders")
@Data
@Validated
public class OrderProps {
    
    
    @Min(value=5, message="must be between 5 and 25")
    @Max(value=25, message="must be between 5 and 25")
    private int pageSize = 20;
}

OrderController

@Controller
@RequestMapping("/orders")
@SessionAttributes("order")
public class OrderController {
    
    
    
    private OrderRepository orderRepo;
    
    private OrderProps props;
    
    public OrderController(OrderRepository orderRepo,
             OrderProps props) {
    
    
        this.orderRepo = orderRepo;
        this.props = props;
    }
    
    ...
    
    @GetMapping
    public String ordersForUser(
        @AuthenticationPrincipal User user, Model model) {
    
    
        Pageable pageable = PageRequest.of(0, props.getPageSize());
        model.addAttribute("orders",
            orderRepo.findByUserOrderByPlacedAtDesc(user, pageable));
        return "orderList";
    }
}

2、声明配置属性元数据
在项目下的 src/main/resources/META-INF 下,中创建一个名为 additional-spring-configuration-metadata.json 的文件。

{
    
    
  "properties": [
    {
    
    
      "name": "demotest.orders.page-size",
      "type": "java.lang.String",
      "description":"Sets the maximum number of orders to display in a list."
    }
  ]
}

比如demotest.orders.page-size 相当于demotest.orders.pageSize。
在pom.xml引入依赖:

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
    </dependency>

三、使用profile 文件配置
1、定义profile的属性
profile 文件是一种条件配置类型。在不同的环境,根据运行时激活的 profile 文件应用或忽略不同的 bean、配置类和配置属性。

文件的名称应该遵循这个约定:application-{profile 名称}.ymlapplication-{profile 名称}.properties
如创建一个名为 application-prod.yml 的新文件。
application-prod.yml

spring:
  datasource:
    url: jdbc:mysql://localhost/demotest
    username: root
    password: 123456
logging:
  level:
    demotest: WARN

另一种指定特定 profile 文件的属性的方法只适用于 YAML 配置。
将特定 profile 的属性与非 profile 的属性一起放在 application.yml 中,由三个连字符分隔。
application.yml :

# 第一部分没有为 spring.profiles 指定值,它的属性对于所有 profile 文件都是通用的。
# 或者如果指定的 profile 文件没有设置其他属性,它就是默认的。
logging:
  level:
    demotest: DEBUG
---		# ---连字符 ,表示第二部分
spring:
  profiles: prod	# 第二部分为 spring.profiles 指定一个值,如 prod,表示随后应用于 prod 配置文件的属性。
  
  datasource:
    url: jdbc:mysql://localhost/demotest
    username: root
    password: 123456logging:
  level:
    demotest: WARN

2、激活 profile 文件
1)设置 application.yml 中的这个属性即可激活:

spring:
  profiles:
    active:
    - prod

2)使用环境变量设置激活的 profile

 export SPRING_PROFILES_ACTIVE=prod

设置完成后,部署于那台机器的任何应用程序将会使用 prod profile。同时相应的配置属性将优先于默认配置文件中的属性。

3)命令行设置激活的 profile
如果使用可执行的 JAR 文件来运行应用程序,也可以通过命令行设置激活的 profile 文件。
命令行终端中执行:

 java -jar demotest.jar --spring.profiles.active=prod

可以指定多个活动 profiles 文件,这是一个逗号分隔的列表,当它设置一个环境变量:

 export SPRING_PROFILES_ACTIVE=prod,audit,ha

而在yaml中,需要如下指定:

spring:
  profiles:
    active:
    - prod
    - audit
    - ha

3、使用 profile 文件(有添加)创建 bean
只有在某个配置文件处于活动状态时才需要创建一些 bean。通过@Profile 注解可以将 bean 指定为只适用于给定的 profile 文件。如下:

@Bean
@Profile("dev")
public CommandLineRunner dataLoader(UserRepository userRepo, PasswordEncoder encoder) {
    
    
    // ...
}

如果需要在 dev profile 或是 qa profile 被激活时创建 CommandLineRunner,如下:

@Bean
@Profile({
    
    "dev", "qa"})
public CommandLineRunner dataLoader(UserRepository userRepo, PasswordEncoder encoder) {
    
    
    // ...
}

如果这个 CommandLineRunner bean 总是被创建,除非 prod 配置文件是活动的,如下:
感叹号 !否定了配置文件名称

@Bean
@Profile("!prod")
public CommandLineRunner dataLoader(UserRepository userRepo, PasswordEncoder encoder) {
    
    
    // ...
}

可以在整个 @Configuration 注解的类(单独的配置类)上使用 @Profile。如下:仅在 prod 和 qa 配置文件都不活动的情况下才会被创建。

@Profile({
    
    "!prod", "!qa"})
@Configuration
public class DevelopmentConfig {
    
        
    @Bean
    public CommandLineRunner dataLoader(UserRepository userRepo, PasswordEncoder encoder) {
    
    
		//   ...
    }
}

猜你喜欢

转载自blog.csdn.net/tongwudi5093/article/details/113795491