springboot中starter是一种非常重要的机制,原理是基于SpringBoot自动装配原理。能够免去复杂的配置,将其集成到starter,应用者只需要在maven引入starter依赖(pom.xml),springboot就可以自动扫描到要加载的信息并启动默认配置。springboot会自动通过classthpath路径下的类发现需要的bean并注册到IOC容器。并且springboot已经提供了日常企业开发中各种场景的spring-boot-starter依赖模块。
-
实现自定义starter(其实就是一个web项目),然后再另一个项目中引入我们自定义的starter并使用。
这里需要说明的是,我们在本地自己测试调用starter的话,在一个工程下可以直接用pom.xml导入自己写的starter依赖。如果我们把starter 发布到远程服务端,就是别人通过 Maven 指定坐标就能从远程引用,不是导入jar包之类的。具体做法可以参考:SpringBoot 将自制的Starter 发布到远程公服 - 梅花GG - 博客园
1、新建maven jar工程,zdy-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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.lagou</groupId>
<artifactId>zdy-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.5.0</version>
</dependency>
</dependencies>
</project>
- 需要在自定义的starter中引入spring-boot-sutoconfigure依赖,用于自动装配
2、编写javaBean
package com.lagou.pojo;
//通用的bean对象
/*
@ConfigurationProperties:自动注入的注解,把properties配置文件转化为bean来使用的。
@EnableConfigurationProperties:使@ConfigurationProperties注解生效
如果只配置@ConfigurationProperties注解,在IOC容器中是获取不到properties配置文件转化的bean的
*/
@EnableConfigurationProperties(SimpleBean.class)
@ConfigurationProperties(prefix = "simplebean")
public class SimpleBean {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3、自动配置类,主要作用就是执行@Bean标记的方法。
package com.lagou.config;
//自动配置类,把simpleBean生成实例对象存到容器中
//@Configuration注解标识的类中声明了1个或者多个@Bean方法,Spring容器可以使用这些方法来注入Bean
@Configuration
public class MyAutoConfiguration {
static {
System.out.println("MyAutoConfiguration init...");
}
@Bean
public SimpleBean simpleBean(){
return new SimpleBean();
}
}
- 那么springboot是如何加载MyAutoConfigureation的呢?通过把MyAutoConfigureation写进spring.factories文件中,从而springboot启动就能加载到simpleBean对象存到IOC容器中。
4、在resource下创建/META-INF/spring.factories,然后配置自己的自动配置类(key value形式,key是固定的EnableAutoConfiguration)。意思是SpringBoot启动的时候会去加载我们的SimpleBean到IOC容器,这其实是一种变形的SPI机制。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.lagou.config.MyAutoConfiguration
- 也就是说springboot启动过程中会加载各个jar包下的spring.factories,根据EnableAutoConfiguration的值找到配置类全路径,完成工具类中对象的自动装配
5、测试
在demo-spring-boot-starter工程中执行mvn clean install 一个自定义的starter新鲜出炉。
新建一个springboot模块
引入starter依赖
<dependency>
<groupId>org.lagou</groupId>
<artifactId>zdy-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
6、新建一个springboot模块,在测试类中测试调用simplebean
在application.properties中给simplebean对象赋值,用于测试
result:
7、这里虽然有了测试结果,但我们查看springboot自动配置类相关源码时会发现都会加上@ConditionalMissingBean的注解,而我们这个自动配置类实际上是没有加的。不加的话springboot启动以后就会默认加载自动配置类的bean,假如我们不需要呢?这时除非我们手动去pom.xml把starter注释掉(做法很low)。