springboot怎么实现自动配置?springboot默认文件如何配置?

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为我们做的一些快捷配置类。

springboot怎么实现自动配置?springboot默认文件如何配置?.jpg

创建一个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,该项目结构如下图。

1.jpg

项目根路径下配置文件 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,查看控制台输出,如下图。

2.png

根据 Spring Boot 默认配置文件优先级进行分析:

该项目中存在多个默认配置文件,其中根目录下 /config 目录下的配置文件优先级最高,因此项目的上下文路径为 “/abc”;

类路径(classpath)下 config 目录下的配置文件优先级高于类路径下的配置文件,因此该项目的端口号为 “8084”;

以上所有配置项形成互补,所以访问路径为“http://localhost:8084/abc”。

根据服务器端口和上下文路径,使用浏览器访问 http://localhost:8084/abc/test,结果如下图。

3.jpg

这样我们就文成了springboot的相关配置,在使用springboot之前,一定要将相关文件这配置好,才能顺利使用!而对于还不熟悉配置的开发人员,可以参考以上方法!最后大家如果想要了解更多java架构师知识,敬请关注奇Q工具网。

推荐阅读:

mybatis怎么防止sql注入?mybatis么防止sql注入方法

git服务器如何搭建和使?git服务器搭建和使用操作

java反射怎么实现的?如何通过java反射访问成员变量?