Spring Boot (三)Spring Boot的自动配置原理

关注公众号【程序职场】,专注于 Spring Boot+微服务,小程序,flutter,Android,定期文章和视频教程分享,以及 职场规划,运营管理 等,关注后回复   Java资料 ,领取为你精心准备的 学习 干货!

大家好,我是“追梦蜗牛”,大家可以在公众号后台回复 “Java资料”获得技能提升的资料,绝对是干货。

本文是Spring Boot系列的第三篇,了解前面的文章有助于更好的理解本文:


1.Spring Boot(一)初识Spring Boot框架
2.Spring Boot(二)Spring Boot基本配置


前言

(一). Spring Boot 的自动配置

初次了解Spring Boot框架的小伙伴,是不是初步见识了SpringBoot使用起来很方便,今天再给小伙伴说一个神助攻,Spring Boot的自动配置,自动配置就是一个项目作为另一个运行项目的依赖库调用,自动使用里面的Bean对象,可以做动态更改(个人见解),我们来研究一下 Spring Boot是怎么实现自动配置的?

我们一下面一个案例来解释说明SpringBoot的自动配置原理。

为了方便理解,在这里我们举一个简单的实例:

在项目中当某个类存在的时候,怎么自动配置这个类的Bean对象的,并可以将该Bean的属性在application.properties中配置,动态变化,OK,就这样一个需求,我们来看看怎么实现。

1,新建一个 starter的Maven项目

  • 创建项目,我这里以IDEA工具为例,创建一个Maven项目,如下如:

    点击创建项目----》选择Maven---》选择maven-archetype-quickstart,然后点击 next

  • 填写GroupId和Artifactid,点击下一步

  • 选择Maven安装目录和maven资源更新目录,然后点击 下一步

  • 填写项目名称和 项目存储目录,点击完成

到此,一个项目我们就创建好了。

2,添加依赖
 

我们在使用springboot的自动配置时,需要添加自动配置的依赖,如下:
 

<!--springboot自动配置依赖-->    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-autoconfigure</artifactId>      <version>2.1.9.RELEASE</version>    </dependency>

3,属性配置

package org.cxzc.myyoung;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "hello")//读取配置文件中的hello属性public class HelloServiceProperties {    private static final String MSG = "world";    private String msg = MSG;    public String getMsg() {        return msg;    }
    public void setMsg(String msg) {        this.msg = msg;    }}

代码解释:这里是一个基本的实体类,和上一节中的类型安全的属性获取是一样的,可以通过在application.properties中设置,若不设置 ,默认为hello.msg=world

4,判断依据类

package org.cxzc.myyoung;public class HelloService {    private String msg;    public String autoInfo(){        return "你好 " + msg;    }
    public String getMsg() {        return msg;    }
    public void setMsg(String msg) {        this.msg = msg;    }}

代码解释:我们需要根据此类是不是存在来创建这个类的Bean,这个类还可以是第三方类库的类。

5,自动配置

package org.cxzc.myyoung;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;
@Configuration@EnableConfigurationProperties(HelloServiceProperties.class)@ConditionalOnClass(HelloService.class)@ConditionalOnProperty(prefix = "hello",value = "enable",matchIfMissing = true)public class HelloServiceAutoConfiguration {    @Autowired    private HelloServiceProperties helloServiceProperties;    @Bean    public HelloService helloService() {        HelloService helloService = new HelloService();        helloService.setMsg(helloServiceProperties.getMsg());        return helloService;    }}

代码解释:
1,在自动配置类中使用了HelloServiceProperties提供的参数。

2,通过@ConditionalOnClass注解判断HelloService这个类在类路径中是否存在,切当容器中没有这个Bean的时候自动配置这个Bean

3,@ConditionalOnProperty注解则表示指定的属性要满足的条件
 

6,注册配置

如果想要上面的自动配置生效,需要注册自动配置类,需要我们在/src/main/resources下新建META-INF/spring.factories, 目录如下图:

目录新建好,在spring.factories文件中填写注册内容;若有多个西东配置需要用 “,”隔开,如果多个需要换行,需要添加“\”
 

1,不换行

org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.cxzc.myyoung.HelloServiceAutoConfiguration

2,换行

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.cxzc.myyoung.HelloServiceAutoConfiguration

注意:

正常情况下我们按上面步骤创建出来的项目是没有resources这个文件夹的,在IntelliJ IDEA工具中,我们需要先创建一个目录(directory),然后将之设置为resources root即可,方式如下:

选中创建的resources目录右键单击-----》Mark Directory as-----》Resource Root。
如下图:

到这里我们的自动配置的所有东西都添加和配置好了,下面就是使用自动配置,如果使用我们需要新建一个 SpringBoot项目。并将上面的自动配置项目作为依赖 引入使用。

一般情况下,做好自动配置类之后需要将之上传到maven 私服上作为一个依赖资源库,然后直接在项目中引用,也可以将之安装到本地库,这里我们条件有限制,使用最简单的方式,直接创建Module来引用这个自动配置Module。

7,创建Module(SpringBoot)项目

创建Module流程如下:
选中刚才的Project右键单击----》New一个Module,这个Module是一个SpringBoot项目(SpringBoot项目上一张有讲到,不明白的可以在瞜一眼),---》创建成功之后选择新建的Module按(F3,F4)具体按那个键,根绝电脑设置,我的是F3   然后会打开Module设置,然后选择右边的加号添加依赖,如下图:

1,进入配置项目

2,选择module 

3,添加自动项目作为依赖库

点击ok ,就会把自动配置作为一个依赖库

8,添加自动配置的依赖

创建好SpringBoot项目并且引用自动配置后,需要我们在新建Module(SpringBoot项目)的pom.xml文件中添加如下依赖:把自动配置引用进来使用。

<!--自动配置依赖-->  <dependency>      <groupId>org.cxzc.myyoung</groupId>      <artifactId>springboot_3</artifactId>      <version>1.0-SNAPSHOT</version>  </dependency>

9,SpringBoot项目的入口类中添加注入

我们在SpringBoot项目的入口类中直接注入HelloService的Bean,该类是在SpringBoot中没有配置这个Bean的,这个是通过自动配置完成的。

package org.cxzc.my.springbootmy;import org.cxzc.myyoung.HelloService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;
@RestController@SpringBootApplicationpublic class SpringbootmyApplication {
    @Autowired    private HelloService helloService;
    @RequestMapping(value = "/",produces = "text/plain;charset=UTF-8")    public String index(){        return helloService.autoInfo();    }
    public static void main(String[] args) {        SpringApplication.run(SpringbootmyApplication.class, args);    }
}

9,SpringBoot项目的application.properties中配置msg的内容

如果需要我们可以在SpringBoot项目的application.properties中修改msg的内容,改变信息

t.uri-encoding=UTF-8spring.http.encoding.charset=UTF-8spring.http.encoding.enabled=truespring.http.encoding.force=truespring.messages.encoding=UTF-8 hello.msg = 自动化配置,修改这里自动变化

运行SpringBoot项目,结果如下图:
 

好了,自定义的自动配置 到这里就完成了,如果小伙伴还有疑问,可以 加群,我们一起进步

本案例下载地址:

https://github.com/ProceduralZC/itcxzc/tree/master/springboot_3

关注公众号【程序职场】,专注于 Spring Boot+微服务,小程序,flutter,Android,定期文章和视频教程分享,以及 职场规划,运营管理 等,关注后回复   Java资料 ,领取为你精心准备的 学习 干货!

发布了55 篇原创文章 · 获赞 101 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/jianpengxuexikaifa/article/details/103301543