自定义starter搞过不?先给一个完整案例的演示,帮大家一次搞懂。
完整案例演示
好了,拆解了具体的步骤,现在我们做一个较为完整的案例,来巩固一下如何自定义自己的starter。
- 创建配置属性类
首先,我们创建一个配置属性类,用于读取配置文件中的属性。
package com.example.starter;
import org.springframework.boot.context.properties.ConfigurationProperties;
// 使用@ConfigurationProperties注解指定前缀,表示所有以coder.academy开头的属性都会映射到这个类中
@ConfigurationProperties(prefix = "coder.academy")
public class CoderAcademyProperties {
private String name = "defaultName";
private int age = 20;
// Getter和Setter方法,用于读取和设置属性值
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 创建服务类
接下来,我们创建一个服务类,使用这些配置属性提供一些服务功能。
package com.example.starter;
public class CoderAcademyService {
private final String name;
private final int age;
// 通过构造函数注入配置属性
public CoderAcademyService(String name, int age) {
this.name = name;
this.age = age;
}
// 提供一个方法,用于打印欢迎信息
public String welcome() {
return "Welcome to Coder Academy, " + name + "! You are " + age + " years old.";
}
}
- 创建自动配置类
然后,我们创建一个自动配置类,用于配置和初始化服务类。
package com.example.starter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// 使用@Configuration注解表示这是一个配置类
@Configuration
// 使用@EnableConfigurationProperties注解启用我们创建的配置属性类
@EnableConfigurationProperties(CoderAcademyProperties.class)
public class CoderAcademyAutoConfiguration {
// 创建一个Bean方法,返回我们的服务类实例
// 使用@ConditionalOnMissingBean注解,表示只有在Spring容器中没有其他同类型的Bean时,才会创建这个Bean
@Bean
@ConditionalOnMissingBean
public CoderAcademyService coderAcademyService(CoderAcademyProperties properties) {
return new CoderAcademyService(properties.getName(), properties.getAge());
}
}
- 配置spring.factories文件
在resources/META-INF/spring.factories
文件中指定自动配置类,这样Spring Boot在启动时会自动加载这个配置类。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.starter.CoderAcademyAutoConfiguration
- 测试自定义Starter
最后,我们在一个新的Spring Boot项目中引入这个自定义Starter,并编写测试用例来验证它的功能。
package com.example.demo;
import com.example.starter.CoderAcademyService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
// 使用@SpringBootApplication注解表示这是一个Spring Boot应用
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
// 使用CommandLineRunner来执行一些启动后的逻辑
@Bean
public CommandLineRunner commandLineRunner(CoderAcademyService coderAcademyService) {
return args -> {
// 打印服务类的欢迎信息
System.out.println(coderAcademyService.welcome());
};
}
}
在application.properties
中配置属性:
coder.academy.name=John Doe
coder.academy.age=30
- 运行结果:
启动Spring Boot应用程序后,你应该会看到控制台输出:
Welcome to Coder Academy, John Doe! You are 30 years old.
看这个完整的代码示例,你大概率能够独立创建自己的starter了。
总结
我工作这么多年,遇到的微服务项目几乎都有自定义starter来封装一些独立可重用的功能,使用效果极佳。
最后说一句(求关注!别白嫖!)
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。
关注公众号:woniuxgg,在公众号中回复:笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!