SpringBoot自定义starter

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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值