在我的理解中,spring-boot-starter就是一个依赖工具包,但是它和普通的依赖又有所区别,那么首先spring-boot-starter-一定是一个spring-boot项目,然后它和一般的依赖有什么区别呢,我们可以在它的resources目录下定义一个META-INF文件夹,在它的下边再定义一个spring.factories文件,里边写如下内容
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ //这个是必须的 alarm.uniworks.Config ,\ //你希望springboot扫描的类路径,它会帮你创建对应的bean实例,如果要扫描多个,号隔开后边加\是为了方便换行 org.springframework.boot.autoconfigure.EnableAutoConfiguration=alarm.uniworks.Config
除了直接在spring.factory中写的方式以外我们还可以直接通过springboot提供的import注解中写入对应的反射类,只需要在spring.factory中写入import注解所在的类全路径就可以了
写到这,熟悉springboot的应该都知道,扫描到的类都可以从配置文件中读取对应的配置,那我们就可以在这些类中读取一些配置做一些bean的初始化工作,这样只要引入当前的spring-boot-starter就可以在项目中引入对应的bean就行操作
eg:
1.pom文件如下
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.ricardo.learn</groupId>
<artifactId>my-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!-- Compile dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<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>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.创建MyProperties类,用于读取配置文件下的配置,这里ConfigurationProperties可以自动把配置文件中指定前缀的文件映射到当前类中
@ConfigurationProperties(prefix = "my")
public class MyProperties {
private String name = "my-spring-boot-starter";
private String type = "default";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
3.创建MyAutoConfiguration类,用于创建Bean
@Configuration
@ConditionalOnClass(MyProperties.class)
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {
private Logger logger = LoggerFactory.getLogger(MyAutoConfiguration.class);
@Bean("helloBean")
@ConditionalOnMissingBean(name = "helloBean")
public String helloBean(MyProperties myProperties){
logger.info("进入创建");
return myProperties.getName() + "-" + myProperties.getType();
}
}
该类是Starter组件的扫描的主入口(个人理解),当引入该Starter组件的项目进行启动时,通过配置扫描到该类,进行Bean的创建。因为之前我们说过,在启动类上添加@ComponetScan很麻烦,难以维护,那么我们可以将该注解添加到这个类上,当项目启动时,扫描到这个类时,就能知道我们需要扫描这个Starter组件的哪些包路径了。
@ConditionalOnClass(MyProperties.class),当指定的类存在时,才会实例化一个类
@EnableConfigurationProperties(MyProperties.class),启用属性配置,将读取MyProperties里面的属性(我的理解时实例化一个MyProperties的Bean)
@ConditionalOnMissingBean(name = "helloBean"),如果容器中没有该bean,就会创建一个bean
4、resource目录下创建META-INF文件夹,在其中创建spring.factories文件,内容如下
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.ricardo.learn.MyAutoConfiguration