Spring boot自定义starter

简介: Spring boot自定义starter

Spring boot自定义starter

1、简介

SpringBoot 最强大的功能就是把我们常用的场景抽取成了一个个starter(场景启动器),我们通过引入springboot 为我提供的这些场景启动器,再进行少量的配置就能使用相应的功能。即使是这样,springboot也不能囊括我们所有的使用场景,往往我们需要自定义starter,来简化我们对springboot的使用。

2、如何自定义starter

2.1、官方命名空间
  • 前缀:spring-boot-starter-
  • 模式:spring-boot-starter-模块名
  • 举例:spring-boot-starter-web、spring-boot-starter-jdbc
2.2、自定义命名空间
  • 后缀:-spring-boot-starter
  • 模式:模块-spring-boot-starter
  • 举例:demo-spring-boot-starter
2.3、定义starter需要的配置

根据springboot的自动配置原理,可知自定义starter需要

  • 一个xxxxAutoConfigurartion的配置模块
  • 一个xxxxProperties:封装配置文件中相关属性
  • 需要一个META-INF/spring.factories文件来描述配置文件工厂类

3、自定义starter实例

3.1、创建一个maven工程

项目名:demo-spring-boot-starter

pom文件

<?xmlversion="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.start</groupId><artifactId>demo-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!-- 引入自动配置模块 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>2.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><version>2.0.0.RELEASE</version></dependency></dependencies><!-- 打包插件 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>


3.2、创建DemoProperties属性类
importorg.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix="com.start")
publicclassDemoProperties {
privateStringname="demo";
privateintage=20;
publicStringgetName() {
returnname;
    }
publicvoidsetName(Stringname) {
this.name=name;
    }
publicintgetAge() {
returnage;
    }
publicvoidsetAge(intage) {
this.age=age;
    }
}

@ConfigurationProperties配置此注解可以自动导入application.properties配置文件中的属性,前提需要指定属性前缀prefix。如果application.properties文件中未指定相应属性,便使用默认的,如上name=“demo”,age=20.

3.3、创建要注入的组件类DemoUtil
publicclassDemoUtil {
privateDemoPropertiesdemoProperties;
publicDemoPropertiesgetDemoProperties() {
returndemoProperties;
    }
publicvoidsetDemoProperties(DemoPropertiesdemoProperties) {
this.demoProperties=demoProperties;
    }
publicStringgetSomeInfo(){
returndemoProperties.getName()+":"+demoProperties.getAge();
    }
}

自定义starter的核心业务,满足业务需求的部分。

3.4、创建自动配置类
@Configuration@EnableConfigurationProperties({DemoProperties.class})
@ConditionalOnClass(DemoUtil.class)
@ConditionalOnWebApplication@ConditionalOnProperty(
prefix="com.start",
value= {"enabled"},
matchIfMissing=true)
publicclassDemoAutoConfiguration {
privatefinalDemoPropertiesdemoProperties;
publicDemoAutoConfiguration(DemoPropertiesdemoProperties) {
this.demoProperties=demoProperties;
    }
@Bean@ConditionalOnMissingBean(DemoUtil.class)
publicDemoUtildemoUtil(){
DemoUtildemoUtil=newDemoUtil();
demoUtil.setDemoProperties(demoProperties);
returndemoUtil;
    }
}


  • @Configuration:表明此类是一个配置类,将做为一个bean被spring进行管理。
  • @EnableConfigurationProperties:启用属性配置,将读取DemoProperties里面的属性。
  • @ConditionalOnClass:当类路径下面有DemoUtil此类时,自动配置。
  • @ConditionalOnProperty:判断指定的属性是否具备指定的值。
  • @ConditionalOnMissingBean:当容器中没有指定bean是,创建此bean。
  • @Bean给容器中添加一个组件
3.5、创建spring.factories文件

在resources文件夹下创建META-INF文件夹,创建spring.factories文件,在spring.factories编写DemoAutoConfiguration配置工厂类描述

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.start.DemoAutoConfiguration
3.6、对项目进行打包

对项目进行mvn clean install操作会得到一个demo-spring-boot-starter-1.0-SNAPSHOT.jar,在其他项目可以在pom中引入

<dependency><groupId>com.start</groupId><artifactId>demo-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version></dependency>
3.7、测试

创建一个测试项目引入demo-spring-boot-starter-1.0-SNAPSHOT.jar,编写测试类

@RunWith(SpringRunner.class)
@SpringBootTestpublicclassSpringbootLearnApplicationTests {
//记录器Loggerlogger=LoggerFactory.getLogger(getClass());
@AutowiredprivateDemoUtildemoUtil;
@TestpublicvoidtestSpringStart(){
System.out.println(demoUtil.getSomeInfo());
    }
}

观察控制台打印的日志

demo:182021-09-2417:06:54.540INFO18060--- [       Thread-2] o.s.w.c.s.GenericWebApplicationContext   : Closingorg.springframework.web.context.support.GenericWebApplicationContext@1a20270e: startupdate [FriSep2417:06:52CST2021]; rootofcontexthierarchyDisconnectedfromthetargetVM, address: '127.0.0.1:51896', transport: 'socket'

可以看到打印信息ok

在配置文件中添加自定义配置

com.start.name=tom
com.start.age=20

再次启动测试类,观察打印日志

tom:202021-09-2417:08:11.707INFO22704--- [       Thread-2] o.s.w.c.s.GenericWebApplicationContext   : Closingorg.springframework.web.context.support.GenericWebApplicationContext@1a20270e: startupdate [FriSep2417:08:10CST2021]; rootofcontexthierarchyDisconnectedfromthetargetVM, address: '127.0.0.1:51941', transport: 'socket'

可以看到配置生效了

相关文章
|
13天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
25 2
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
56 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
64 2
|
3月前
|
Java 数据安全/隐私保护 Spring
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
|
3月前
|
JSON 安全 Java
|
3月前
|
监控 安全 Java
【开发者必备】Spring Boot中自定义注解与处理器的神奇魔力:一键解锁代码新高度!
【8月更文挑战第29天】本文介绍如何在Spring Boot中利用自定义注解与处理器增强应用功能。通过定义如`@CustomProcessor`注解并结合`BeanPostProcessor`实现特定逻辑处理,如业务逻辑封装、配置管理及元数据分析等,从而提升代码整洁度与可维护性。文章详细展示了从注解定义、处理器编写到实际应用的具体步骤,并提供了实战案例,帮助开发者更好地理解和运用这一强大特性,以实现代码的高效组织与优化。
193 0
|
4月前
|
消息中间件 Java Kafka
Spring boot 自定义kafkaTemplate的bean实例进行生产消息和发送消息
Spring boot 自定义kafkaTemplate的bean实例进行生产消息和发送消息
190 5
|
4月前
|
Java Spring 容器
Spring boot 自定义ThreadPoolTaskExecutor 线程池并进行异步操作
Spring boot 自定义ThreadPoolTaskExecutor 线程池并进行异步操作
235 3
|
3月前
|
存储 Java API
|
3月前
|
安全 搜索推荐 Java
下一篇
无影云桌面