springboot是开发人员非常熟悉的开发框架,它具有Spring 一切优秀特性,我们使用springboot的目的就是为了能够简化开发过程,不过在使用之前,我们需要对其进行配置,那springboot怎么实现自动配置?下面来我们就来给大家讲解一下。
第一步,编写配置Bean——PrintAfterInitBean
代码如下,因为只是一个简单例子,这里的配置Bean其实可以是其他任何复杂配置Bean,例如DataSource。往往一个公共包需要多个这样配置Bean才能完成其配置。
public class PrintAfterInitBean implements InitializingBean { private String message; public void afterPropertiesSet() throws Exception { System.out.println(message); } //setter getter }
第二步,创建一个AutoConfiguration。
如果搜索Spring Boot下面的类,你会发现其实有很多名字形如xxxAutoConfiguration的类,这些类都是Spirng Boot为我们做的一些快捷配置类。
创建一个TestAutoConfig,作为一个自动配置类。
@Configuration public class TestAutoConfig { @Bean @ConfigurationProperties(prefix = "init") @ConditionalOnMissingBean(PrintAfterInitBean.class) @ConditionalOnProperty(prefix = "init", value = "message") public PrintAfterInitBean printAfterInitBean() { return new PrintAfterInitBean(); } }
@ConfigurationProperties 是Spring Boot提供的方便属性注入的注解,功能其实和@Value类似
@ConditionalOnMissingBean 表示当BeanFactory中没有PrintAfterInitBean类型的Bean才会创建,否则就会忽略这个Bean。这个就是上图中所谓的【满足自动配置条件】,同理的,ConditionalOnProperty表示当存在配置前缀为init,配置值为message的配置的时候,才会生效。@ConditionalOnXXX 系列的注解都是为了在自动配置中,不侵入用户的配置。
第三步,创建spring.factories
在resources下面创建META-INF/spring.factories, 然后在文件中把第二步的类配置进去:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.xxx.TestAutoConfig
这样就完成一个Spring Boot自动配置,如果存在init.message的配置,那么Spring Boot启动的时候就会打印init.message配置对应值。
springboot默认文件如何配置?
通常情况下,Spring Boot 在启动时会将 resources 目录下的 application.properties 或 apllication.yml 作为其默认配置文件,我们可以在该配置文件中对项目进行配置,但这并不意味着 Spring Boot 项目中只能存在一个 application.properties 或 application.yml。
默认配置文件
Spring Boot 项目中可以存在多个 application.properties 或 apllication.yml。
Spring Boot 启动时会扫描以下 5 个位置的 application.properties 或 apllication.yml 文件,并将它们作为 Spring boot 的默认配置文件。
1. file:./config/
2. file:./config/*/
3. file:./
4. classpath:/config/
5. classpath:/
注:file: 指当前项目根目录;classpath: 指当前项目的类路径,即 resources 目录。
以上所有位置的配置文件都会被加载,且它们优先级依次降低,序号越小优先级越高。其次,位于相同位置的 application.properties 的优先级高于 application.yml。
所有位置的文件都会被加载,高优先级配置会覆盖低优先级配置,形成互补配置,即:
存在相同的配置内容时,高优先级的内容会覆盖低优先级的内容;
存在不同的配置内容时,高优先级和低优先级的配置内容取并集。
示例
创建一个名为 springbootdemo 的 Spring Boot 项目,并在当前项目根目录下、类路径下的 config 目录下、以及类路径下分别创建一个配置文件 application.yml,该项目结构如下图。
项目根路径下配置文件 application.yml 配置如下。
# 项目更目录下# 上下文路径为 / abc server: servlet: context - path: /abc
项目类路径下 config 目录下配置文件 application.yml 配置如下。
# 类路径下的 config 目录下# 端口号为8084# 上下文路径为 / helloWorld server: port: 8084 servlet: context - path: /helloworld
项目类路径下的 application.yml 配置如下。
# 默认配置 server: port: 8080
在 net.biancheng.www.controller 包下创建一个名为 MyController 的类,代码如下。
package net.biancheng.www.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @RestController public class MyController { @ResponseBody @RequestMapping("/test") public String hello() { return "hello Spring Boot!"; } }
启动 Spring Boot,查看控制台输出,如下图。
根据 Spring Boot 默认配置文件优先级进行分析:
该项目中存在多个默认配置文件,其中根目录下 /config 目录下的配置文件优先级最高,因此项目的上下文路径为 “/abc”;
类路径(classpath)下 config 目录下的配置文件优先级高于类路径下的配置文件,因此该项目的端口号为 “8084”;
以上所有配置项形成互补,所以访问路径为“http://localhost:8084/abc”。
根据服务器端口和上下文路径,使用浏览器访问 http://localhost:8084/abc/test,结果如下图。
这样我们就文成了springboot的相关配置,在使用springboot之前,一定要将相关文件这配置好,才能顺利使用!而对于还不熟悉配置的开发人员,可以参考以上方法!最后大家如果想要了解更多java架构师知识,敬请关注奇Q工具网。
推荐阅读: