spring boot有各种starter的依赖jar包,如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
这些starter的依赖是干什么用的呢?是spring集成启动第三方用的,如spring要调用redis那么就要将redis集成到spring工程中,有一点需要说明的是如spring-boot-starter-data-redis是以spring-boot开头的,这表面是spring主动集成的redis,而mybatis-spring-boot-starter以mybatis第三方开头的,是mybatis主动集成的spring,也就是说starter是mybatis编写的。
通过starter包的配置集成,使spring在运行的时候可以很好的调用与其集成的第三方包。
接下来,我们完成自定义的starter:
首先,工程结构如下,之后是每个文件的内容。

//java\com\cong\application\MySpringBootApplication.java
package com.cong.application;
import com.cong.auto.CongProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String args[]){
ConfigurableApplicationContext context = SpringApplication.run(MySpringBootApplication.class,args);
CongPropertiesApp cp = context.getBean(CongPropertiesApp.class);
System.out.println(cp.name);
CongProperties cp2 = context.getBean(CongProperties.class);
System.out.println(cp2.name);
}
}
如果CongPropertiesApp和MySpringBootApplication不在同一个目录是无法配置成功的,就像CongProperties。
//java\com\cong\application\CongPropertiesApp.java
package com.cong.auto;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Configuration //注意必须有这个注解才能加载配置成功
@ConfigurationProperties(prefix = "cong")
@Data
public class CongPropertiesApp{//由于和SpringBootApplication是一个包下,所以才能配置成功
public String name;
}
//java\com\cong\auto\CongProperties.java
package com.cong.auto;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "cong")
@Data
public class CongProperties {
public String name;
}
//resources/application.yml
cong:
name: zhenzhen
//resources/META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.cong.auto.CongProperties
CongProperties 需要依靠spring.factories才能配置成功,所以需要在spring.factories添加CongProperties 的路径。通过spring内部的载机制,最终将CongProperties进行实例化和配置文件的加载。
//pom.xml
<?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">
<parent>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.12.RELEASE</version>
</parent>
<groupId>cong</groupId>
<version>1.0-SNAPSHOT</version>
<modelVersion>4.0.0</modelVersion>
<artifactId>cong-spring-starter</artifactId>
<dependencies>
<!--spring自动配置依赖的jar包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<!--确保能读取到application.yml-->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
<!--自动生成setter getter方法的jar,注意:没有getter,settter方法属性是加载不成功的-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<!--<dependency>-->
<!--<groupId>org.mybatis.spring.boot</groupId>-->
<!--<artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--<version>2.1.3</version>-->
<!--</dependency>-->
</dependencies>
</project>
以上,pom是我们的spring最少依赖,最终,两个name都会加载成功。
starter的目的,无非就是做一些加载配置和实例化初始化的操作,实例的初始化主要交给spring容器来做。
@Configuration注解的作用即是加载配置,但是@Configuration注解的类必须和SpringBootApplication启动类在同一个包下才能加载成功,但是我们集成各种starter的时候,都是在各自的包下,所以最后我们依赖spring.factories完成了配置。
这样你就可将自己的工程封装成像mybatis-starter这样的依赖,供其他的工程调用了。
网友评论