Spring Boot 2.0 读书笔记_11:配置 Spring Boot

版权声明:未经博主本人同意,请勿私自转发分享。 https://blog.csdn.net/Nerver_77/article/details/85622042

7. 配置 Spring Boot

写在开头,默认规则:启动端口 8080;Web上下文访问目录 /
配置信息均可以在 application.properties 文件中配置

  • 基础配置

    • Web监听端口配置
      • application.properties:server.port=9090
      • 命令行指定启动端口:java -jar bootsample.jar --server.port=9000
      • 虚拟机系统属性:java -Dserver.port=9000 -jar bootsample.jar
    • Web上下文访问目录
      • server.servlet.context-path=/config
    • 绑定IP地址,适合多网卡环境
      • server.address
    • 设置会话过期时间,单位为秒
      • server.session.timeout
    • 出错处理路径
      • server.error.path
    • Web服务器配置,内置Tomcat。也可以使用Jetty,Undertow
      • 引入Web服务器的starter依赖,以Undertow为例。

        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>
        
      • 剥除内置Tomcat依赖

        <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>
        
      Undertow的性能要由于TomcatJetty,推荐使用。
  • 日志配置
    默认情况下,Spring Boot 使用LogBack作为日志的实现,使用apache Commons Logging 作为日志接口。

    public class DemoController {
      private Log log = LogFactory.getLog(DemoController.class);
      //...
    }
    

    日志格式举例:

    2019-01-02 13:21:01.556  INFO 9884 
    --- 
    [  restartedMain] o.s.b.w.e.u.UndertowServletWebServer: 
    Undertow started on port(s) 9090 (http) with context path '/config'
    
格式 说明 备注
2019-01-02 13:21:01.556 日期和时间
INFO 日志级别 ERROR、WARN、INFO、TRACE和DEBUG
关于日志模块可以查看以往博文:
https://blog.csdn.net/Nerver_77/article/details/82855061
9884 进程Id
分隔符号
[ restartedMain] 线程名称
o.s.b.w.e.u.UndertowServletWebServer 所访问的权限的类名
Undertow started on port(s) 9090 (http) with context path ‘/config’ 消息体 可以看出,运行在8090端口下,且上下文路径配置为"/config"

默认情况下,INFO级别以上的信息才会打印到控制台,也可以自定义日志输出级别。

logging.level.root=info
logging.level.org.springframework=info
# 日志输出路径及文件
logging.path:e:/temp/log
logging.file = my.log

当日志文件大小达到 10MB 的时候,会自动重新生成一个新的日志文件,同时还可以对日志输出和文件输出进行格式控制。(仅适用内置的logback)

logging.pattern.console=%level %date{HH:mm:ss} %logger{20}.%M %L :%m%n
logging.pattern.file= %level %date{ISO8601} [%thread]  %logger{20}.%M %L :%m%n
格式 说明
%level 输出日志级别
%date 日志记录时间
{ISO8601}标准日志格式输出
{yyyy-MM-dd HH:mm:ss.SSS}
%logger 用于输出Logger名字(包名 + 类名)
{n}限制输出长度
原则上尽可能显示类名、压缩包名
%thread 当前线程名
%M 日志发生时的方法名称
%L 日志调用所在的代码行(线上运行不建议使用)
%m 日志信息
%n 日志换行
  • 读取应用配置:从配置文件 application.properties 读取内容

    • 通用 Environment类
      Environment 是一个通用的读取应用程序运行时的环境变量的类,可以读取 application、properties、命令行输入参数、系统属性、操作系统环境变量等。同时,Environment 是 Spring Boot 最早初始化的一个类。

      @Configuration
      public class EnvConfig implements BeanPostProcessor {
      
          // Spring 容器自动注入
          @Autowired
          private Environment env;
      
          public int getServerPort() {
              return env.getProperty("server.port", Integer.class);
          }
      }
      
      读取 返回值
      env.getProperty(“user.dir”) 程序运行的目录,IDE中工程目录
      user.dir是系统属性
      env.getProperty(“user.home”) 执行程序的用户的home目录
      user.home是系统属性
      env.getProperty(“JAVA_HOME”) 读取设置的环境变量(不区分大小写)
    • @Value 注解获取
      直接通过 @Value 注解注入配置信息到 Spring 管理的 Bean 中:

      @Value("${server.port}")
      Integer port;
      

      注意,@Value 并不能在任何 Spring 管理的 Bean 中使用,因为 @Value 本身是通过 AutowiredAnnotationBeanPostProcessor 实现的。[BeanPostProcessor接口的实现类]
      @Value 注解支持 SpEL 表达式,如果属性不存在,可以提供默认值:

      @Value("${cache.enable:false}")
      private boolean isCache;
      
    • @ConfigurationProperties
      通常情况下,将一组同样类型的配置属性映射为一个类更为方便,比如服务器配置。

        server.port=9090
        server.context-path=/config
      

      以上配置都是与 Web 服务器配置相关,都有 server 前缀。因此可以使用 @ConfigurationProperties 来获取该前缀配置。

      @ConfigurationProperties("server")
      @Configuration
      public class ServerConfig {
          private int port;
          private String contextPath;
      }
      

      在处理被 @ConfigurationProperties 注解的类,会自动将 -_,转化为Java的命名规范(驼峰式)

  • 自动装配
    Spring 容器的配置核心就是使用 @Configuration 作用在类上,并且联合在此类采用 @Bean 注解的方法,声明 Spring 管理的 Bean。

    @Configuration
    public class MyConfiguration {
        @Bean
        public TestBean getBean() {
            return new TestBean();
        }
    }
    

    如上代码中,MyConfiguration 类使用了注解 @Configuration ,向 Spring 表明这是一个配置类,类里面所有带 @Bean 注解的方法都会被 Spring 调用,返回对象将作为一个 Spring 容器管理的 Bean。

  • Bean 条件装配
    Spring Boot可以通过有无指定Bean来决定是否配置Bean。使用@ConditionalOnBean,在当前上下文中存在某个对象是,才会实例化一个Bean;使用@ConditionalOnMissingBean,在当前上下文中不存在某个对象时,才会实例化一个Bean。

    @Configuration
    // 该配置类生效的前提是:上下文中已经配置了 DataSource。
    @ConditionalOnBean(DataSource.class)
    public class MyConfig {}
    
  • Class 条件装配
    Class 条件装配是按照某各类是否在Classpath中决定是否要配置Bean。@ConditionalOnClass 标识当 classpath 有指定的类时,配置生效。

    @Configuration
    @ConditionalOnClass(JestClient.class)
    public class JestAutoConfiguration {}
    

    这段代码用于配置 Elasticsearch,使用 Jest 驱动,因此配置生效的前提条件是 classpath 中有 JestClient.class 类。

  • Environment 装配

    @ConditionalOnProperty(prefix = "ces", name = "message.enabled", havingValue = "true", matchIfMissing = true)
    public class MsgConfig {}
    

    @ConditionalOnProperty 注解根据prefix + name (前缀和名称)来读取Environment的变量包含属性(K-V),根据其值与 havingValue值作比较决定配置是否生效 [ 默认不为false即为生效 ]。matchIfMissingtrue 意味着如果 Environment 没有包含该前缀和名称的配置也可生效 [默认为false]。

  • 其他条件装配

    • @ConditionalOnExpression,当表达式为 true 时,才会实例化一个 Bean,支持SpEL表达式。

    • @ConditionalOnJava,指定Java版本,如下栗子:

       @ConditionalOnJava(range = Range.EQUAL_OR_NEWER, value = JavaVersion.EIGHT)
      

猜你喜欢

转载自blog.csdn.net/Nerver_77/article/details/85622042