共计 5207 个字符,预计需要花费 14 分钟才能阅读完成。
上一篇 Spring Boot 我们简单讲了如何快速创建一个 SpringBoot 项目。大家都知道 SpringBoot 非常强大,可以轻松与各种工具集成,但是我们知其然,也必须知其所以然。今天开始就和大家一起学习一下 SpringBoot 核心,核心由于过于重要,需要分成好几章,今天我们先来看看基本配置。
入口类和 @SpringBootApplication
使用过或者瞄过一眼 Spring Boot 工程的小伙伴都知道,SpringBoot 有一个特别显著的特点,就是每个 SpringBoot 工程都会有一个入口类,在这个入口类上都会有这么一个注解 @SpringBootApplication。这个类中有一个 main 方法,main 方法中使用
SpringApplication.run(*Application.class,args),用来启动 SpringBoot 项目。如下所示:
public static void main(String[] args) {SpringApplication.run(Createproject2Application.class, args);
}
@SpringBootApplication
@SpringBootApplication 是 Spring Boot 的核心注解,它是一个组合注解
(通常我们称由多个注解组成的注解叫组合注解)。点进去瞧一眼
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@SpringBootApplication 注解主要 (我这里说了主要喔) 组合了
@Configuration,@EnableAutoConfiguration,@ComponentScan
言外之意就是可以将这三个注解直接替换 @SpringBootApplication
- @EnableAutoCOnfiguration 让 Spring Boot 根据类路径中的 jar 包依赖为当前项目进行自动配置。例如添加了 spring-boot-starter-web 依赖,会自动添加 Tomcat 和 Spring MVC 的依赖,Spring Boot 就会对 Tomcat 和 Spring MVC 进行自动配置。
2.@ComponentScan 让 Spring Boot 去扫描与入口类同级以及以下包的 Bean(使用注解配置的),把他们添加到 Spring 容器,若为 JPA 项目还可以扫描标注 @Entity 的实体类。
3.@Configuration 表示当前是一个配置类,也会被 Spring 进行加载
关闭特定的自动配置
SpringBoot 为我们提供了自动化配置,但是在某些特定的场景下,我们可能不需要某个自动配置,这时可以在 @SpringBootApplication 中配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
定制 Banner
什么是 Banner 呢,就是在 Spring Boot 项目启动的时候最开始显示的横幅。我记得我第一次启动 Spring Boot 项目的时候印象最深的就是这个横幅
内心不断 OS(wc 这么酷炫的吗)。下面我们看看怎么自定义横幅吧。如果不自定义,默认显示下面图案
修改 Banner
- 我们在 src/main/sources 下新建一个 banner.txt
- 登录 http://patorjk.com/software/taag 生成我们自己想要的图案
- 复制图案到 banner.txt 中
- 启动项目验证
关闭 banner
当然了,这个 banner 也不是必须要显示的,我们可以手动关闭它。
- 修改启动类中的 main 方法
SpringApplication app = new SpringApplication(Createproject2Application.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
Spring Boot 的配置文件
Spring Boot 在 src/main/resources 下有一个全局的配置文件
application.properties 或 application.yml
说到 yml 这种配置文件,是有点东西的。全称为 yaml,是以数据为中心,支持多种数据格式(如数组),在配置数据的时候具有面向对象的特征。
简单示例
在两种配置文件中配置 Tomcat 的端口号和默认的访问路径
- application.properties 中可以如下配置:
server.port=8888
server.servlet.context-path=/xicent
- application.yml 中可以如下配置:
server:
port: 8888
servlet:
context-path: /xicent
其实我们从简单的实例中可以看出,yaml 的格式更加清晰,所有配置看过去一目了然。并且它是有序的。
在以前 idea 中是不支持 yml 提示的,现在也都支持了。
但是 yaml 却引来了另一个问题,yaml 格式有严格的要求,稍有配错都有可能出现问题。
因此在项目中看我们如何去取舍了,目前默认还是以 properties 为主。
使用 xml 配置
Spring Boot 提倡的是 0 配置,即无 xml 配置,但是在实际开发中,我们有时难免会需要加载 xml 配置,这时我们就可以通过 Spring 提供的 @ImportResource 来加载 xml 配置
例如:
@ImportResource({"classpath:some-context.xml"})
这样我们就成功加载 xml 配置啦。
命令行参数配置
在 Spring Boot 中,我们大部分配置都写在了配置文件中,但是有些配置我们可能需要启动时才能确定,因此 Spring Boot 还提供了一种命令行配置方式
下面演示如何在运行 jar 包的时候,配置 Tomcat 的端口号
java -jar xx.jar --server.port=8888
常规属性配置
在常规的 Spring 环境中,如果我们想加载某个 properties 文件,获取其中的配置。通常的做法是在类上加注解 @PropertiesSource()
指定配置文件的位置。然后在类中使用 @Value()加载属性。在 Spring Boot 中,我们只需在 application.properties 中定义属性,直接用 @Value 注入即可。
1.application.properties 增加属性
xicent.author=kris
xicent.age=1
2. 修改入口类
@Value("${xicent.author}")
String name;
@Value("${xicent.age}")
int age;
@RequestMapping("/")
String index(){return "author is"+name+",age is"+age;}
获取其他属性
通用我们用 @Value 都是获取 properties 配置文件中配置的属性,但是 @Value 的功能可不远远不止这一点喔。通过 @Value 注解,我们还能获取系统属性,url,随机数,文字流等等。
// 普通字符串
@Value("xicent")
private String str;
// 操作系统名称
@Value("#{systemProperties['os.name']}")
private String osName;
// 随机数
@Value("#{T(java.lang.Math).random()*168.0}")
private double randomNumber;
// 其他 bean 的属性
@Value("#{demoService.another}")
private String fromAnother;
// 获取文件资源
@Value("classpath:banner.txt")
private Resource file;
// 获取地址资源
@Value("http://www.baidu.com")
private Resource url;
public void testValue() throws IOException {System.out.println(getStr());
System.out.println(getOsName());
System.out.println(getRandomNumber());
System.out.println(getFromAnother());
System.out.println(IOUtils.toString(file.getInputStream(),"UTF-8"));
System.out.println(IOUtils.toString(url.getInputStream()));
}
// 省略 getter,setter 方法
访问接口
@RequestMapping("/testvalue")
void testValue() throws IOException {xicentBean.testValue();
}
类型安全的配置(基于 properties)
上面的例子,我们每个属性都要使用 @Value 注解会显得格外的麻烦,我们配置的属性通常会是许多个。在 Spring Boot 中使用 @ConfigurationProperties
将配置与 bean 相关联,这就是所谓的类型安全的配置。这里将配置配在一个专门的 properties 文件中,当然也能直接配置在 application.properties 中
1.resources 文件夹下新增 xicent.properties 文件,添加如下属性
xicent.author=kris
xicent.age=1
2. 创建一个类
@Component
@PropertySource("classpath:xicent.properties")
@ConfigurationProperties(prefix = "xicent")
public class XicentBean {
private String author;
private int age;
代码解释:@PropertySource 可以指定我们需要加载的文件的路径。@ConfigurationProperties 指定我们属性配置的前缀
3. 创建接口访问
@Autowired
XicentBean xicentBean;
@RequestMapping("/xicent")
XicentBean getXicent(){return xicentBean;}
4. 请求接口
Profile 配置
Profile 是 Spring 用来针对不同环境使用不同的配置文件。一般命名为:application-{profile}.properties
(如 application-prod.properties)。然后在 application.properties 中
设置 spring.profiles.active=prod 来指定活动的 Profile。下面演示生产环境 (prod) 使用 8888 端口,开发环境 (dev) 使用 9999 端口
1. 创建 application-prod.properties, 配置生产环境的端口
server.port=8888
2. 创建 application-dev.properties,配置开发环境的端口
server.port=9999
3.application.properties 中指定生效的 profile
spring.profiles.active=prod
4. 启动项目,可以看到 prod 配置文件生效了,绑定端口为 8888
疑问:如果我 application.properties 和 application-prod.properties 都配了端口,哪个会生效呢?答案是 prod 的会生效
ok,今天就暂时分享这么多啦,以上讲的是 Spring Boot 中的基本配置,其中有很多地方都是可以深挖单独拿出来讲的。
今天这里只讲了一些基本的,比较常用的基本配置,后续我们还会再详细分享。
喜欢的小伙伴可以关注公众号: 喜讯 XiCent 有任何问题可以随时问我喔~