一、Starter介绍
作用
启动器(Starter)包含许多依赖项,这些依赖项是使项目快速启动和运行所需的依赖项。
例如:通过配置spring-boot-starter-data-redis,可以快捷的使用Spring对Redis进行数据访问。命名规范
官方开发的starter遵循类似的命名模式:spring-boot-starter-*
第三方starter命名应当遵循:thirdpartyproject-spring-boot-starter
-
常用Starter
- spring-boot-starter-jdbc
- spring-boot-starter-data-redis
- spring-boot-starter-web
- spring-boot-starter-actuator
二、Web开发相关
引入spring-boot-starter-web实现快速引入和启动,无需再进行繁杂的xml配置。
默认基于Tomcat容器运行,可通过修改pom.xml指定运行的容器。
疑问:
为什么我们明明没有在Application中指定我们引入的jar包的内容,但是却能正常扫描到引入的包的内容?
我们在SpringApplication.run这个方法中打上断点,然后进行查看:
-
-
进入到SpringApplication类中,查看到这个内容,(具体为什么查看这个,因为重点就在这里)
-
-
-
继续往下查看
-
-
-
继续查看具体内容
-
这里我们可以看到这里是加载了一个叫做 META-INF/spring.factories
的文件,这里打开autoconfigure的spring.factories
这里其实是很多的配置类的信息,即具体的文件路径等等,其实继续查看代码,发现他们会自动加载这些配置类。由此可想而知,正是这个原因,所以才能正常的将引入的jar包的内容扫描加载进来。
另外我们还可以看到在META-INF文件夹中,还有一个叫做 spring-configuration-metadata.json 的文件,这个文件大概的内容如下所示:
这里其实就是在编写yml和properties中,会自动弹出一些提示信息,方便用户快速编写相关的内容。
三、自研Starter的步骤
- 建工程
- 引入spring-boot-starter、spring-boot-autoconfigure、第三方jar
- 如需要生成配置元信息,加入spring-boot-configuration-processor依赖
- 编写自动配置类
- 配置发现配置文件:META-INF/spring.factories
- 打包发布
例子:
众所周知,男性程序员还是需要女朋友的,所以我们这次用女孩子作为一个project,手动狗头~~~
首先创建三个项目,如图
然后我们一步一步按照上边的步骤来,但是我们首先要实现girl 这个项目的内容(即第三方jar)
- 这里比较简单,在girl项目中,创建类GirlDemo即可,但是也要记得修改pom文件。
- GirlDemo
package cn.lazyfennec.girl;
/**
* @Author: Neco
* @Description:
* @Date: create in 2022/7/19 22:15
*/
public class GirlDemo {
private String name;
private Integer height;
private String face;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getHeight() {
return height;
}
public void setHeight(Integer height) {
this.height = height;
}
public String getFace() {
return face;
}
public void setFace(String face) {
this.face = face;
}
public void doSomething() {
System.out.println("do something in here!");
}
@Override
public String toString() {
return "GirlDemo[" +
"name='" + name + '\'' +
", height=" + height +
", face='" + face + '\'' +
']';
}
}
- pom.xml
4.0.0
cn.lazyfennec
girl
1.0.0
The Demo of girl demo
jar
girl
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test
- 修改girl-spring-boot-starter的pom.xml
4.0.0
cn.lazyfennec
girl-spring-boot-starter
1.0.0
jar
girl-spring-boot-starter
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test
cn.lazyfennec
girl
1.0.0
org.springframework.boot
spring-boot-starter
2.0.8.BUILD-SNAPSHOT
org.springframework.boot
spring-boot-autoconfigure
2.0.8.BUILD-SNAPSHOT
org.springframework.boot
spring-boot-configuration-processor
2.0.3.RELEASE
true
META-INF
META-INF/
- 创建GirlProperties 类,这里主要是为了实现自动读取并且注入配置文件信息的功能
package cn.lazyfennec.girl.spring.boot.autoconfigure;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @Author: Neco
* @Description:
* @Date: create in 2022/7/19 22:24
*/
// 这个地方需要EnableConfigurationProperties 配置指向这个类,否则会爆红提示错误,其实也就是下一步
@ConfigurationProperties(prefix = "cn.lazyfennec.girl")
public class GirlProperties {
private String name;
private Integer height;
private String face;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getHeight() {
return height;
}
public void setHeight(Integer height) {
this.height = height;
}
public String getFace() {
return face;
}
public void setFace(String face) {
this.face = face;
}
}
- 创建GirlAutoconfigure类,这里其实就是读取配置文件,并且根据配置文件生成bean对象
package cn.lazyfennec.girl.spring.boot.autoconfigure;
import cn.lazyfennec.girl.GirlDemo;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author: Neco
* @Description:
* @Date: create in 2022/7/19 22:40
*/
@Configuration
@EnableConfigurationProperties({GirlProperties.class})
public class GirlAutoconfigure {
@Bean
public GirlDemo getGirl(GirlProperties properties) {
GirlDemo girl = new GirlDemo();
girl.setName(properties.getName());
girl.setHeight(properties.getHeight());
girl.setFace(properties.getFace());
return girl;
}
}
- 创建src同级的目录下(好像放到resources目录下也行)META-INF/spring.factories 文件,然后修改一些内容
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.lazyfennec.girl.spring.boot.autoconfigure.GirlAutoconfigure
- 可以配置spring-configuration-metadata.json 的内容以方便在配置文件中进行配置,但是这里因为太懒,所以就不进行编写了
- 修改springboot-demo 的启动类
package cn.lazyfennec.demo;
import cn.lazyfennec.girl.GirlDemo;
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;
@SpringBootApplication
@RestController
public class SpringBootDemoApplication {
@Autowired
private GirlDemo g;
@RequestMapping("/girl")
public String getGirl() {
return g.toString();
}
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
}
- 修改application.yml(properties文件的修改尽管有些格式上的不同,但是很类似,这里不进行描述了)
server:
port: 8090
cn:
lazyfennec:
girl:
name: 小白
height: 161
face: 唉哟,还不错哦
-
打开浏览器进行测试
如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~