SpringBoot的starter机制
SpringBoot的应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。
Starter命名规范:
spring官方的starter的规范是 spring-boot-starter-模块名-版本号.jar
第三方的starter的规范是 模块名-spring-boot-starter-版本号.jar
starter的作用:
(1)引入依赖
spring-boot-starter-web包自动帮我们引入了web模块开发需要的相关jar包,
mybatis-spring-boot-starter帮我们引入了dao开发相关的jar包。
(2)自动配置
@Configuration注解的类可以看作是能生产让Spring IoC容器管理的Bean实例的工厂。
@Bean注解告诉Spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册到spring容器中。
@ConditionalOnBean,仅在当前上下文中存在某个bean时,才会实例化这个Bean。
@ConditionalOnClass,某个class位于类路径上,才会实例化这个Bean。
@ConditionalOnExpression,当表达式为true的时候,才会实例化这个Bean。
@ConditionalOnMissingBean,仅在当前上下文中不存在某个bean时,才会实例化这个Bean。
@ConditionalOnMissingClass,某个class在类路径上不存在的时候,才会实例化这个Bean。
@ConditionalOnNotWebApplication,不是web应用时才会实例化这个Bean。
@AutoConfigureAfter,在某个bean完成自动配置后实例化这个bean。
@AutoConfigureBefore,在某个bean完成自动配置前实例化这个bean。
(3)spring-boot-starter依赖默认引入支持yaml文件和日志的依赖
如何自定义Starter
Starter中主要包含四种:
(1)配置文件
(2)读取配置文件的类【@ConfigurationProperties(prefix = “demo.person”)】
(3)对外提供服务的类,starter启动后需要初始化的Bean对象。
(4)自动配置类,SpringBoot通过spring.factories文件定位到该类后,通过该配置类来启动starter,以获取我们需要装配的Bean对象。
(1)新建工程,引入pom依赖
<groupId>top.onething</groupId>
<artifactId>demo-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<!--指定项目编码方式为utf-8-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--引入spring-boot-starter的基本配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.0.RELEASE</version>
<optional>true</optional>
</dependency>
<!--SpringBoot默认使用yml配置文件,使用xml或properties作为配置文件时使用spring-boot-configuration-processor获取配置文件中配置的参数-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.3.0.RELEASE</version>
<!--是否进行依赖传递,true:不进行依赖传递,false:进行依赖传递-->
<optional>true</optional>
</dependency>
</dependencies>
spring-boot-configuration-processor的作用:SpringBoot默认使用yml配置文件,使用xml或properties作为配置文件时使用spring-boot-configuration-processor获取配置文件中配置的参数
(2)定义一个实体类映射配置信息,该实体类一般以xxxProperties命名
@ConfigurationProperties(prefix = “demo.person”) 可以把相同前缀的配置信息通过配置项名称映射成实体类,该注解需要配置@EnableConfigurationProperties注解才能生效
/*
@ConfigurationProperties注解必须通过配置@EnableConfigurationProperties注解才能生效
*/
@ConfigurationProperties(prefix = "demo.person")
public class PersonProperties {
private String name;
private Boolean gender;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getGender() {
return gender;
}
public void setGender(Boolean gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
(3)定义提供功能的核心类,将第2步的配置信息类作为属性引入核心类,并提供getset方法,方便核心类的方法使用
public class PersonService {
private PersonProperties personProperties;
public PersonProperties getPersonProperties() {
return personProperties;
}
public void setPersonProperties(PersonProperties personProperties) {
this.personProperties = personProperties;
}
public String talk() {
return personProperties.getName() + "---" + personProperties.getGender() + "---" + personProperties.getAge();
}
}
(4)定义一个自动配置类:
- @EnableConfigurationProperties注解:使从配置文件中获取配置信息的指定配置类生效
- @ConditionalOnWebApplication注解:该注解的作用,当Spring为web服务时,才使注解的类生效
@Configuration
@ConditionalOnWebApplication //web应用才生效
@EnableConfigurationProperties(value = {PersonProperties.class})
//@EnableConfigurationProperties使@ConfigurationProperties注解生效,以便获取配置文件的配置信息
public class PersonServiceAutoConfiguration {
@Autowired
private PersonProperties personProperties;
@Bean
public PersonService personService() {
PersonService personService = new PersonService();
personService.setPersonProperties(personProperties);
return personService;
}
}
(5)配置springboot应用启动时,需要加载的自动配置类【第四部定义的自动配置类】,在resources资源文件目录下,新建META-INF文件夹,并在该文件下添加一个spring.factories文件
# 告诉springboot启动的时候需要加载哪些自动配置类,其中key表示哪个自动配置注解需要配置哪些自动装配的类这里是@EnableAutoConfiguration需要装配
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
top.onething.starter.PersonServiceAutoConfiguration
(6)在新项目中引入自定义的starter,依赖坐标即自定义starter项目的parent坐标
<dependency>
<groupId>top.onething</groupId>
<artifactId>demo-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
配置好自定义starter依赖坐标后,在新项目的application.yml配置文件中配置第2步需要的参数信息:
demo:
person:
name: 测试
gender: true
age: 18
(7)使用第3步中定义的核心类在新项目中提供功能,该核心类的实例化对象在springboot启动时会通过自动配置进行创建,这里只需注入后直接使用即可
@Autowired
private PersonService personService;
@Test
public void test9(){
String talk = personService.talk();
System.out.println(talk);
}