制作一个自己的starter
GuoJun 2023-08-03 SpringBoot
# starter 简介
如果你所在的公司要开发一个共享的lib,或者如果你想要为开源世界做点贡献,你也许想要开发你自己的自定义的自动配置类以及你自己的starter pom。这些自动配置类虽然在一个单独的jar包中,但却依然能够被Spring Boot获取到。
# starter 开发
# 1. 创建一个Maven项目
# 2. 创建需要注入的类
package com.example.hellospringbootstarter;
public class HelloController {
public String hello(){
System.out.printf("hello");
return "hello";
}
}
# 3. 配置spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.hellospringbootstarter.HelloController
# 4. 修改maven构建插件
spring-boot-maven-plugin插件,会将依赖的jar包全部打包进去。该文件包含了所有的依赖和资源文件,可以直接在命令行或者传统的 Java Web 服务器上启动运行。这里需要打普通jar包
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
# 4.测试
- pom引入上面项目
<dependency>
<groupId>com.example</groupId>
<artifactId>hello-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
- 创建类打印Bean
package com.example2.hello2;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* 打印Spring容器所有的Bean名称
*/
@Component
public class ApplicationContextBean implements ApplicationContextAware, InitializingBean {
public static ApplicationContext applicationContext;
/**
* 获取 ApplicationContext
*
* @param applicationContext
* @throws BeansException
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextBean.applicationContext = applicationContext;
}
/**
* 打印IOC容器中所有的Bean名称
*
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
String[] names = applicationContext.getBeanDefinitionNames();
for (String name : names) {
System.out.println(">>>>>>" + name);
}
// 140
System.out.println("------\nBean 总计:" + applicationContext.getBeanDefinitionCount());
}
}
# 根据条件注入
pom文件添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
类上添加常用添加注解:
- @ConditionalOnBean:容器内存在指定Bean
- @ConditionalOnClass:容器内存在指定Class
- @ConditionalOnExpression:基于SpEL表达式作为判断条件
- @ConditionalOnJava:基于JVM版本作为判断条件
- @ConditionalOnJndi:在JNDI存在时查找指定的位置
- @ConditionalOnMissingBean:容器内不存在指定Bean
- @ConditionalOnMissingClass:容器内不存在指定Class
- @ConditionalOnNotWebApplication:当前项目不是Web项目的条件
- @ConditionalOnProperty:指定的属性是否有指定的值
- @ConditionalOnResource:类路径是否有指定的资源
- @ConditionalOnSingleCandidate:当指定Bean在Springloc容器内只有一个,或者虽然有多个但是指定首选的Bean
- @ConditionalOnWebApplication:当前项目是Web项目的条件