Spring Boot入门——Spring Boot ComponentScan,Spring Boot Logger,Spring Boot Properties

一,Spring Boot ComponentScan

在前面学习Spring的时候我们知道,只需要在启动类上加上@SpringBootApplication注解,工程便会自动去扫描启动类所在的包及其所在子包,然后自动实例化需要的Spring Bean。但如果某个Bean不在该包下,那么启动时就会自动报错。

报错信息:Field subjectService in fm.douban.app.control.SongListControl required a bean of type ‘fm.douban.service.SubjectService’ that could not be found.

Spring的解决方案为,在@SpringBootApplication注解后面加一个参数,告知系统需要额外扫描的包:

//启动类在app包下,服务类在service包下
@SpringBootApplication(scanBasePackages={"fm.app", "fm.service"})
public class AppApplication {
  public static void main(String[] args) {
    SpringApplication.run(AppApplication.class, args);
  }
}

如果不是启动类,如测试类等需要使用Bean对象,可以使用独立的注解@ComponentScan,作用是一样的,用于指定多个需要额外扫描的包。

@ComponentScan({"fm.service", "fm.app"})
public class SpringConfiguration {
  ... ...
}

二,Spring Boot Logger

在之前Spring的学习中,SongListControl 实现了一个初始化的方法 init() ,加上了 @PostConstruct 注解,在类初始化后检查依赖的 SubjectService 是否成功注入。

@PostConstruct
public void init(){
  System.out.println("Control 启动");
  if (subjectService != null) {
    System.out.println("subjectService 实例注入成功。");
  } else {
    System.out.println("subjectService 实例注入失败。");
  }
}

但实际上启动Spring后未必会看到提示。因为在Spring这种比较复杂的系统中,未必能确定System.out.println()打印内容会输出在什么地方,因此我们需要用日志系统来记录信息。

日志系统的优势:

  1. 控制内容输出。在测试是数据量较少,可以将所有访问信息全部输出,但是一旦发布上线,大量的访问量数据很容易将磁盘占满。此时只需要控制日志的输出,即可实现输出信息的筛选。
  2. 日志系统可以灵活的配置日志的细节,例如输出格式,通常在日志输出时,需要自动附带输出日志发生的时间、打印日志的类名等信息,这样能很方便的观察日志分析问题。

使用日志系统的步骤:

1.配置

修改配置文件application.properties(在项目的 src/main/resources/ 目录下),增加日志级别配置:

logging.level.root=info

表示所有日志(root)都为 info 级别。

我们也可以为不同的的包定义不同的级别,例如

logging.level.fm.app=info

就表示 fm.douban.app 包及其子包中的所有的类都输出 info 级别的日志。

常用的日志级别(优先级),请看下列表格:

优先级级别含义和作用
最高ERROR错误信息日志
WARN暂时不出错但高风险的警告信息日志
INFO一般的提示语、普通数据等不紧要的信息日志
DEBUG进开发阶段需要关注的调试信息日志
级别的作用

logging.level.root=error 意味着 不输出 更低 优先级的 WARN、INFO、DEBUG 日志, 只输出 ERROR 日志。

logging.level.root=warn 意味着 不输出 更低 优先级的 INFO、DEBUG 日志, 只输出 WARN 和 更高 优先级的 ERROR 日志。以此类推。

在开发阶段配置为 DEBUG,在项目发布时调整为 INFO 或更高级别,即可做到不改代码而控制只输出关心的日志。

日志级别是重要的概念,请务必理解每个级别的作用

2. 编码

配置完成后,编码很简单,只需要实例化日志对象即可打印日志了。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;

@RestController
public class SongListControl {
    private static final Logger LOG = LoggerFactory.getLogger(SongListControl.class);

    @PostConstruct
    public void init(){
        LOG.info("启动日志");
    }
}

创建参数LOG,然后在 LOG.info() 方法的参数中输入日志内容。

注意这里的方法名(info())与日志级别一一对应:

优先级级别方法名
最高ERRORerror()
WARNwarn()
INFOinfo()
DEBUGdebug()

如果想输出警告信息就调用 LOG.warn() 方法,以此类推。

日志按级别输出

配置为 logging.level.root=error 时, warn()info()debug() 三个方法是无效的,都不会在 Console 打印日志内容( 不会报错 哦),只有 error() 可以。

当修改配置为 logging.level.root=warn 后,warn() 自动变的有效,也可以打印日志内容了(高级别 error() 本来就有效),info()debug() 仍然不行。

这样,就可以通过修改 一个配置 ,并 不修改 每行日志打印代码,即可方便的 调节 日志输出的内容。

定义类变量 LOG 的语句属于固定写法,只需要在不同的类中,修改 getLogger() 方法参数为当前的类名即可。这样就能识别每段日志的来源。

修饰为 static final的目的就是为了尽量复用,无论多少实例只需要建立一个日志对象。

三,Spring Boot Properties

在前面的Spring学习中,我们知道可以通过https://start.spring.io/网站创建一个Spring Boot工程,并实现一些依赖加载与配置。

但是对于一些特定的情况,仍然需要手动配置。框架为我们提供了application.properties配置文件,可以让我们进行自定义配置,对默认的值进行修改,以满足需要。

properties文件在一个固定的位置(项目中的src/main/resources/目录下),名字也固定,框架会自动加载并解析这个配置文件,在上一节的Logger中也使用了此配置文件。

配置文件格式

格式为:配置项名称=配置项值。每一行即为一条配置项。

logging.level.root=info
logging.level.fm.app=info

为了方便维护和阅读,书写配置文件的时候推荐遵守如下约定:

  • 配置项名称能准确表达作用含义,以.分割单词;
  • 相同前缀的配置项写在一起;
  • 不同前缀的配置项之间空一行。

配置的作用

配置文件的作用主要是将可变的内容从代码中剥离出来,如此便可以很方便的修改常变的内容(如端口号,文件路径等)。如此一来便可以硬编码,做到解耦。

自定义配置项

application.properties文件中配置自定义的配置项:

song.name=God is a girl

之后在代码中通过@Value注解使用该配置:

import org.springframework.beans.factory.annotation.Value;

public class SongListControl {
    @Value("${song.name}")
    private String songName;
}

注意花括号中的内容应与配置项名称保持一致

在项目启动时,系统会自动解析application.properties配置文件中的 song.name 的值,赋值给 SongListControl 对象实例的 songName 变量。

代码中使用配置项,application.properties 文件必须有配置,缺少了就会报错;但 application.properties 文件中的配置没有被代码使用,则没关系。就是说,多了没事,少了就报错

就是由于使用了注解,系统才能自动完成赋值。

没有注解,或者没有配置项,或者注解中的配置项名称写错了,系统都不能完成自动赋值的步骤。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值