自定义SpringBoot的Starter

自定义Starter

1,SpringBoot starter机制

SpringBoot由众多Starter组成(一系列的自动化配置的starter插件),SpringBoot之所以流行,也是因为starter。

starter是SpringBoot非常重要的一部分,可以理解为一个可拔插式的插件,正是这些starter使得使用某个功能的开发者不需要关注各种依赖库的处理,不需要具体的配置信息,由Spring Boot自动通过 classpath路径下的类发现需要的Bean,并织入相应的Bean。

例如,你想使用Reids插件,那么可以使用spring-boot-starter-redis;如果想使用MongoDB,可以使 用spring-boot-starter-data-mongodb

2,什么需要自定义starter

开发过程中,经常会有一些独立于业务之外的配置模块。如果我们将这些可独立于业务代码之外的功能配置模块封装成一个个starter,复用的时候只需要将其在pom中引用依赖即可,SpringBoot为我们完 成自动装配

3,自定义starter的命名规则

SpringBoot提供的starter以spring-boot-starter-xxx的方式命名的。官方建议自定义的starter使用 xxx-spring-boot-starter命名规则。以区分SpringBoot生态提供的starter

4,实现代码:

1.新建Maven jar工程

工程名字为:zdy-spring-boot-starter

image-20201215221957136

导入依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>

2.编写javaBean

新建一个类,加入两个属性,并增加两个注解:

package com.dxh.pojo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

//开启@ConfigurationProperties注解
@EnableConfigurationProperties(value = SimpleBean.class)
@ConfigurationProperties(prefix = "simplebean")
public class SimpleBean {
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "SimpleBean{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

  • @ConfigurationProperties(prefix = "simplebean")

    获取配置文件中,前缀为simplebean开头的值,按照映射关系封装到当前实体中的属性上。

  • @EnableConfigurationProperties(value = SimpleBean.class)
    使上面的注解起作用

3.编写配置类——MyAutoConfiguration

package com.dxh.config;

import com.dxh.pojo.SimpleBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration//表示当前类为配置类
@ConditionalOnClass(SimpleBean.class) //当类路径classpath下有指定类的情况,就会进行自动配置
public class MyAutoConfiguration {

    static {
        System.out.println("MyAutoConfiguration init...");
    }

    @Bean
    public SimpleBean simpleBean(){
        return  new SimpleBean();
    }

}

这里会用到两个注解:

  • @Configuration :表示当前类为配置类
  • @ConditionalOnClass :当类路径classpath下有指定类的情况,就会进行自动配置,默认不写时,一定会自动配置。
    例如:@ConditionalOnClass(SimpleBean.class),表示当前类路径下有SimpleBean.class时,才会对当前类进行自动配置

这个类的意思是:

当进行自动配置时,就会调用simpleBean()这个方法,并把返回值对象存入SpringBoot创建的IOC容器中,

一会我们在使用自定义的starter时,就可以直接从ioc容器中得到创建的这个simpleBean

4.resources下创建/META-INF/spring.factories

src/main/resources/META-INF/spring.factories

#要进行自动配置的类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.dxh.config.MyAutoConfiguration

5,安装到本地仓库

image-20201215230742291

6,测试

6.1新建(或随便一个SpringBoot)项目,引入刚才写完的:

image-20201215230937404

6.2 配置文件

来看下,配置文件中写的属性,是否能够封装到刚才编写的simpleBean中

image-20201215232005234

6.3 测试类

image-20201215232058019

最后得出结果,同时也打印出了 自定义starter中 static代码块中的日志:

image-20201215232250573

posted @ 2020-12-20 17:34  邓晓晖  阅读(421)  评论(0编辑  收藏  举报