ComponentScan
Spring Boot框架会默认扫描启动类所在的包及其所有子包进行解析,但不会扫描平级的包,也不会自动实例化Bean,解决办法有一下两种:
- 为启动类的注解
@SpringBootApplication
加一个参数,告知系统需要额外扫描的包:
@SpringBootApplication(scanBasePackages={"fm.douban.app", "fm.douban.service"})
public class AppApplication {
public static void main(String[] args) {
SpringApplication.run(AppApplication.class, args);
}
}
- 参数名是:
scanBasePackages
; - 参数值是一个字符串数组需要把待扫描的包的前缀写入
- 如果不是Spring Boot 启动类,可以使用独立的注解
@ComponentScan
@ComponentScan({"fm.service", "fm.app"})
public class SpringConfiguration {
... ...
}
Spring Boot Logger
因为在Spring这种比较复杂的系统中,sout打印出来的内容会输到什么地方是不确定的,所以使用日志来记录信息
日志系统的优势:
- 日志系统可以轻松的控制日志是否输出
- 日志系统可以灵活地配置日志的细节,如输出格式
1. 配置
修改Spring Boot系统的标准配置文件application.properties
增加日志级别配置:
logging.level.root=info
表示所有日志都为info级别,也可以为不同的包定义不同的级别:
logging.level.包名=info
表示你的包和子包的所有类都输出info级别的日志
常用日志级别(优先级):
级别的作用
logging.level.root=error
意味着不输出更低的优先级的日志,只输出ERROR日志
logging.level.root=warn
意味着不输出更低的优先级的日志,只输出WARN日志及其更高优先级的日志,以此类推
开发阶段配置为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("SongListControl 启动啦");
}
}
先定义一个类变量LOG,然后在
LOG.info()
方法的参数中输入日志内容
这里的方法名与日志级别一一对应;
日志按级别输出
只有高级别和自身级别才有效
定义类变量LOG的语句是固定写法,只需要在不同的类中修改getLogger()参数为当前类名即可
Spring Boot Properties
配置文件格式
每一行是一条配置项:配置项名称 = 配置项值
logging.level.root=info
logging.level.fm.douban.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;
}
项目启动时Spring会自动把配置文件中的值赋给对象实例的变量