关注公众号【程序职场】,专注于 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
@SpringBootApplication
public 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-8
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.messages.encoding=UTF-8
hello.msg = 自动化配置,修改这里自动变化
运行SpringBoot项目,结果如下图:
好了,自定义的自动配置 到这里就完成了,如果小伙伴还有疑问,可以 加群,我们一起进步
本案例下载地址:
https://github.com/ProceduralZC/itcxzc/tree/master/springboot_3
关注公众号【程序职场】,专注于 Spring Boot+微服务,小程序,flutter,Android,定期文章和视频教程分享,以及 职场规划,运营管理 等,关注后回复 Java资料 ,领取为你精心准备的 学习 干货!