Spring Boot入门——Spring Boot ComponentScan,Spring Boot Logger,Spring Boot Properties
- 一,Spring Boot ComponentScan
- 二,Spring Boot Logger
- 日志系统的优势:
- 使用日志系统的步骤:
- 1.配置
- 级别的作用
- 2. 编码
- 日志按级别输出
- 三,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.配置
修改配置文件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()
)与日志级别一一对应:
优先级 | 级别 | 方法名 |
最高 | ERROR |
|
高 | WARN |
|
中 | INFO |
|
低 | DEBUG |
|
如果想输出警告信息就调用 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 文件中的配置没有被代码使用,则没关系。就是说,多了没事,少了就报错 。
就是由于使用了注解,系统才能自动完成赋值。
没有注解,或者没有配置项,或者注解中的配置项名称写错了,系统都不能完成自动赋值的步骤。