SpringBoot实践(三十八):自定义spring-boot-starter
创始人
2024-05-10 07:35:47
0

目录

自动配置原理

 自定义starter包

导入springboot的自动配置依赖 

测试业务代码

spring.factories配置

​编辑

 本地包上传

使用自定义starter依赖

测试和配置


自动配置原理

基于springBoot的starter机制能够让我们在使用外部包时候非常方便,只需要引入该组件提供的starter包即可,比如在pom中引入mybatis的mybatis-plus-boot-starter依赖包,那么springboot启动时候会自动扫描所有的依赖该包下META-INF文件夹下的spring.factories把自动配置类加入容器:

在spring.factories中会指定自动配置类:

# Auto Configure
org.springframework.boot.env.EnvironmentPostProcessor=\com.baomidou.mybatisplus.autoconfigure.SafetyEncryptProcessor
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration,\com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

其中MybatisPlusAutoConfiguration.java中会初始化若干的配置,在MybatisPlusProperties.class文件中,还有其他一些关于jdbc连接的条件注解;

@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties({MybatisPlusProperties.class})

 自定义starter包

测试自定义starter包,该starter包中引入springboot的自动配置依赖,配置spring.factories文件中的自动加载类,实现的功能是在测试的springBoot工程中引入自定义的starter包的pom依赖后,能够调用starter包中的某些实例方法,具体而言是读取application.properties或者application.yml的配置输出;

首先创建1个空的项目,作为自定义starter包和测试的springboot工程的父工程,添加2个子模块:

导入springboot的自动配置依赖 

创建spring初始化器生成的子模块test01-spring-boot-starter,跟mybatis类似,或者直接copy,增加spring-boot-starter的依赖管理(不引入),只引入1个自动配置依赖;

	org.springframework.bootspring-boot-dependencies2.3.7.RELEASEpomimportorg.springframework.bootspring-boot-autoconfigurecompile

测试业务代码

创建1个属性配置类TestProperties.java,读取application.properties中的配置:

package com.example.hello.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "test.hello")
public class TestProperties {String prefix;String suffix;public String getPrefix() {return prefix;}public void setPrefix(String prefix) {this.prefix = prefix;}public String getSuffix() {return suffix;}public void setSuffix(String suffix) {this.suffix = suffix;}
}

 创建业务代码,实现模拟的业务需求,它使用上面的配置类读取配置做业务处理(直接输出);

package com.example.hello.service;
import com.example.hello.bean.TestProperties;
import org.springframework.beans.factory.annotation.Autowired;public class HelloService {@AutowiredTestProperties testProperties;public String sayHello() {return testProperties.getPrefix() + "<---- say hello --->" + testProperties.getSuffix();}}

再创建1个自动配置类TestAutoConfiguration.java,该类将被写入spring.factories中作为自动配置类在后面的测试springBoot工程启动中被扫描到IOC容器,该配置类将把上面的service服务实例化;

package com.example.hello.config;
import com.example.hello.service.HelloService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@ConditionalOnMissingBean(HelloService.class)
public class TestAutoConfiguration {@Beanpublic HelloService makeHelloService(){return new HelloService();}
}

spring.factories配置

在\resources\META-INF下创建spring.factories文本,指定当前测试stater包中的配置类:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.hello.config.TestAutoConfiguration

工程目录如下: 

 本地包上传

以上就完成业务逻辑,使用pom的clean+install命令把该starter工程上传本地,其他程序可以直接通过pom引入;

使用自定义starter依赖

再创建1个子模块test-my-project,作为真正的依赖上面的业务代码实体,它是个web应用:

 编辑其pom依赖如下,这里的重点是test01-spring-boot-starter的依赖工程,是我们上面本地上传的包;

	org.springframework.bootspring-boot-dependencies2.3.7.RELEASEpomimportorg.springframework.bootspring-boot-autoconfigurecompileorg.springframework.bootspring-boot-starterorg.springframework.bootspring-boot-starter-webcom.exampletest01-spring-boot-starter0.0.1-SNAPSHOTorg.springframework.bootspring-boot-starter-testtest

测试和配置

当前工程的application.properties写入以下配置:

test.hello.prefix = prefix
test.hello.suffix = suffix

直接使用注解使用starter包中的HelloService这个bean,它将在启动时候被IOC实例化;

@RestController
public class HelloController {@AutowiredHelloService helloService;@GetMapping("/hello")public String sayHello(){return helloService.sayHello();}
}

输出正常表明测试的starter包被成功引入,并且实现了业务代码的类被IOC实例化,在真实的工程中可以直接调用。

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...