SpringBoot之如何自定义一个starter模块

简介: 前面我们说到了在SpringBoot中自定义Enable模块,那么如何在SpringBoot中如何自定义一个Starter模块呢?要想自定义一个Starter模块,就需要理解自动装配的原理。

前言

前面我们说到了在SpringBoot中自定义Enable模块,那么如何在SpringBoot中如何自定义一个Starter模块呢?要想自定义一个Starter模块,就需要理解自动装配的原理。

首先,想想我们自动装配涉及到哪些关键的类或者属性文件?无非就是配置类+spring.factories属性文件。

自定义starter的条件

1.根据条件检查classpath下对应的类,也就是说需要提供对应可检查的类。

2.当满足条件时能够生成自定义的Bean,并注册到容器中去。

3.能够自动配置项目所需要的配置。

开始实施

第一步:定义好需要通过配置类来实例化的Bean

public class MsgService {
    private String url;
    private String content;
    public MsgService(String url, String content) {
        this.url = url;
        this.content = content;
    }
    public String sendMsg() {
        System.out.println("**********消息发送成功,地址=" + url + ",内容=" + content + "");
        return "消息发送成功,地址=" + url + ",内容=" + content + "";
    }
}

这里定义的bean没啥好说的。

第二步: 定义好属性类

@ConfigurationProperties(prefix = "msg")
public class MsgProperties {
    /**
     * 消息发送地址
     */
    private String url;
    /**
     * 发送内容
     */
    private String content;
  //get,set方法省略

这里通过@ConfigurationProperties注解将配置文件的前缀为msg的配置信息与自身的属性绑定,所有在配置文件中能配置的属性都在MsgProperties类中封装着,配置文件能配置什么只需要看这个属性类的属性。

第三步:定义好配置类

@Configuration
@ConditionalOnClass(MsgService.class)
@EnableConfigurationProperties(MsgProperties.class)
public class MsgConfiguration {
    /**
     * 注入属性类
     */
    @Autowired
    private MsgProperties msgProperties;
    @Bean
    @ConditionalOnMissingBean({MsgService.class})
    public MsgService msgService() {
        return new MsgService(msgProperties.getUrl(), msgProperties.getContent());
    }
}

@Bean注解表明该方法实例化的对象会被加载到容器当中;

@ConditionalOnMissingBean注解指明当容器中不存在MsgService的对象时再进行实例化;@EnableConfigurationProperties注解是使MsgProperties生效,也就是将MsgProperties类注入到IOC容器中。

@ConditionalOnClass 注解表明只有classpath下能找到MsgService类时才会构建这个Bean。

第四步:定义好spring.factories属性文件

要想实现自动配置,那么spring.factories属性文件是必不可少的,因为SpringBoot需要通过spring.factories找到需要实例化的配置类。然后通过SPI的方式来实例化。

所以,我们需要在resources 下面增加 META-INF/spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.jay.config.MsgConfiguration

打包上传到本地仓库

上面的步骤都搞好之后,我们这个自定义的starter模块差不多就可以用了,为了上其他项目可以引入我们的自定义的starter模块,我们需要通过mvn install命令将这个starter包上传到我们本地仓库或者私服。

其他项目引入我们自定义的starter模块

1. 引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
  </dependency>
<!--自定义的starter-->
  <dependency>
    <groupId>com.jay</groupId>
    <artifactId>springboot-custom-starter2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </dependency>

2. 在application.properties文件中增加配置

msg.url=127.0.0.1
msg.content=nice to meet you

3.测试

@RestController
public class HelloWorldController {
    @Autowired
    private MsgService msgService;
    @RequestMapping(value = "/testSendMsg")
    public String testSendMsg() {
        String sendMsg = msgService.sendMsg();
        return sendMsg;
    }
}

启动项目,访问接口,结果如下:

809db6f802257603c82e1f2344ae76d3_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ1MzQ4MDg=,size_16,color_FFFFFF,t_70#pic_center.png


总结

本文完整的演示了一遍如何自定义starter模块。其实理解了自动装配的原理就很好的能自定义一个starter模块。它的工作流程无非就三步:

Spring Boot在启动时会扫描项目所依赖的JAR包,寻找包含spring.factories属性文件的JAR包。

根据spring.factories配置加载EnableAutoConfiguration。

根据@Conditional注解的条件,进行自动配置并将Bean注入到Spring容器。

希望对读者朋友们有所帮助。

参考

SpringBoot自定义starter及自动配置

源码下载

源码下载


相关文章
|
8月前
32SpringBoot自定义Starter
32SpringBoot自定义Starter
42 0
32SpringBoot自定义Starter
|
1月前
|
设计模式 Java 机器人
SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter
SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter
|
架构师 NoSQL Java
【案例实战】SpringBoot3.x自定义封装starter实战
【案例实战】SpringBoot3.x自定义封装starter实战
【案例实战】SpringBoot3.x自定义封装starter实战
|
1月前
|
Java Spring 容器
SpringBoot2 | SpringBoot自定义AutoConfiguration | SpringBoot自定义starter(五)
SpringBoot2 | SpringBoot自定义AutoConfiguration | SpringBoot自定义starter(五)
30 0
|
1月前
|
Java 数据库连接 Maven
SpringBoot【付诸实践 01】SpringBoot自定义starter保姆级教程(说明+源码+配置+测试)
SpringBoot【付诸实践 01】SpringBoot自定义starter保姆级教程(说明+源码+配置+测试)
45 1
|
1月前
|
Java Maven Spring
Spring Boot - 手把手教小师妹自定义Spring Boot Starter
Spring Boot - 手把手教小师妹自定义Spring Boot Starter
75 0
|
1月前
|
运维 Java Maven
SpringBoot SPI 机制和实现自定义 starter
SpringBoot SPI 机制和实现自定义 starter
61 0
|
10月前
|
Java Maven Spring
Springboot自定义Starter启动器
Springboot自定义Starter启动器.md
141 0
Springboot自定义Starter启动器
|
11月前
|
开发框架 SpringCloudAlibaba Java
Spring Boot自动配置原理详解和自定义封装实现starter
我们一直在强调`Spring Boot`能成为当下主流首选开发框架的主要原因在于其核心思想:**约定大于配置,自动配置,条件装配**。基于这些特性使得`Spring Boot`集成其他框架非常简单快捷
143 0
 Spring Boot自动配置原理详解和自定义封装实现starter
|
10月前
|
Java Maven
springboot自定义starter启动器
springboot自定义starter启动器
62 0