我们在学习springboot的过程中发现springboot的使用起来非常的简单和方便,在使用springboot明显不用像ssm框架那样配置一大推动的东西,虽说如果熟练的话用起来并不难,但是很烦。
在我们使用springboot框架的同时也要了解启动器 starter 默认地自动化配置是如何工作的,还是非常有必要的!所以今天就大概看了一些例子照着做了一下总结和编码。
为其取名为:girl-friend-spring-boot-starter
.
Spring 官方对 starter
的命名是有规范的,只有官方提供的 starter
, 才能命名为 spring-boot-starter-{name}
, 比如 spring-boot-starter-web
; 而对于非官方的,需以 {name}-spring-boot-starter
的格式命名。
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>iclyj.cn</groupId> <artifactId>girl-friend-spring-boot-starter</artifactId> <version>0.0.1-SNAPSHOT</version> <name>girl-friend-spring-boot-starter</name> <description>Custom Spring Starter</description>
<properties> <java.version>1.8</java.version> </properties>
<dependencies> <!-- 自动化配置依赖,自定义 starter 核心依赖包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
</dependencies>
</project>
一个一个来
GirlFriendServiceProperties.java
:
package iclyj.cn.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
/** * @author :lyj * @email: : iclyj@iclyj.cn * @date :2019/10/8 * * @ConfigurationProperties注解能够自动获取 application.properties 配置文件中前缀为 * spring.girlfriend 节点下 message属性的内容,这里我们给了它一个默认值: Hello World !。 * */@ConfigurationProperties(prefix = "iclyj.girlfriend")public class GirlFriendServiceProperties {
/** 默认输出 */ private String message = "Hello World !";
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; }
}
这里注意一下如果我注释掉下面这个依赖
他就会出现上图的情况我们点进去打开
虽说去掉这个依赖不会影响项目正常运行但是看过去总是很别扭具体深入的什么原因可以自己看看文档。
GirlFriendService.java
:
package iclyj.cn.service;
/** * @author :lyj * @email: : iclyj@iclyj.cn * @date :2019/10/8 */public interface GirlFriendService {
/** * 调用方法 */ void say();}
GirlFriendServiceImpl.java
:
package iclyj.cn.service;
package iclyj.cn.service.impl;
import iclyj.cn.config.GirlFriendServiceProperties;import iclyj.cn.service.GirlFriendService;import org.springframework.beans.factory.annotation.Autowired;
/** * @author :lyj * @email: : iclyj@iclyj.cn * @date :2019/10/8 * * GirlFriendServiceImpl 实现了 GirlFriendService 接口的 say() 方法, * 它会获取 GirlFriendServiceProperties 配置类 message 内容,并打印到控制台。 * */public class GirlFriendServiceImpl implements GirlFriendService {
@Autowired private GirlFriendServiceProperties girlFriendServiceProperties;
@Override public void say() { String message = girlFriendServiceProperties.getMessage(); System.out.println("Girl Friend: " + message); }}
package iclyj.cn.config;
import iclyj.cn.service.GirlFriendService;import iclyj.cn.service.impl.GirlFriendServiceImpl;import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;
/** * @author :lyj * @email: : iclyj@iclyj.cn * @date :2019/10/8 * * @Configuration: 标注类为一个配置类,让 spring 去扫描它; * @ConditionalOnClass:条件注解,只有在 classpath 路径下存在指定 class 文件时,才会实例化 Bean; * @EnableConfigurationProperties:使指定配置类生效; * @Bean: 创建一个实例类注入到 Spring Ioc 容器中; * @ConditionalOnMissingBean:条件注解,意思是,仅当 Ioc 容器不存在指定类型的 Bean 时,才会创建 Bean。 * * * Spring Boot 会在启动时,自动会去查找指定文件 /META-INF/spring.factories, * 若有,就会根据配置的类的全路径去自动化配置。 * */
@Configuration@ConditionalOnClass(GirlFriendService.class)@EnableConfigurationProperties(GirlFriendServiceProperties.class)public class GirlFriendAutoConfiguration {
@Bean @ConditionalOnMissingBean public GirlFriendService girlFriendService() { return new GirlFriendServiceImpl(); }
}
在 resources
目录下创建名为 META-INF
的目录,并新建文件 spring.factories
,内容如下:
# 指定刚刚创建的 GirlFriendAutoConfiguration 的全路径名 org.springframework.boot.autoconfigure.EnableAutoConfiguration=site.exception.GirlFriendAutoConfiguration
Spring Boot 会在启动时,自动会去查找指定文件 /META-INF/spring.factories
,若有,就会根据配置的类的全路径去自动化配置。
将项目打包
可以看到已经调用成功了,接下来,我们手动配置一下新的打招呼内容,看看是否能自动获取到。
在 application.properties
文件中配置如下:
运行一下项目
正确打印我们自己配置的:“I LOVE YOU”,大功告成。
https://github.com/ICLYJ/Girl-Friend.git
到此自定义 spring-boot-starter
已经完成,从中你也可以了解到springbot启动加载的大致流程就是这样,要想深入的学习还得学习更多知识。
每天
进步一点点