以下例子代码在github中,代码链接
Spring Boot起步依赖(starter)大大简化了项目构建中的依赖配置,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制的依赖,这些依赖项是使项目快速启动和运行所需的依赖项,如spring-boot-starter-web起步依赖,聚合了spring-boot-starter、spring-boot-starter-json、spring-boot-starter-tomcat、spring-web、spring-webmvc等依赖,使得我们的web项目无需引入多个web相关的依赖项以及为了解决版本冲突等问题。
官方starter命名的格式是spring-boot-starter-*,如spring-boot-starter-actuator、spring-boot-starter-web、spring-boot-starter-test等官方starter,平常我们自己定义的starter一般命名格式是thirdProject-spring-boot-starter
-
本文示例代码项目结构是写一个自定义的demo-spring-boot-starter引入两个jar包demo1和demo2,然后在project项目中引入demo-spring-boot-starter,项目结构如图所示:
一、demo1项目
(1)pom文件如下:
4.0.0
com.fiuty
demo1
1.0-SNAPSHOT
(2)demo1只有一个Student类:
@Data
public class Student {
private String name;
private Integer age;
}
二、demo2
(1)pom文件如下:
4.0.0
com.fiuty
demo2
1.0-SNAPSHOT
(2)同样,demo2也只有一个类Teacher:
@Data
public class Teacher {
private String name;
private Integer age;
}
三、demo-spring-boot-starter项目
(1)定义starter需要引入spring-boot-starter依赖、spring-boot-autoconfigure依赖以及第三方jar demo1和demo2的依赖,如果需要配置元信息的话,还需引入spring-boot-configuration-processor依赖。
(2)引入demo1和demo2的pom文件:
com.fiuty
demo1
1.0-SNAPSHOT
com.fiuty
demo2
1.0-SNAPSHOT
完整的pom文件如下:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.4.0
com.fiuty
demo-spring-boot-starter
0.0.1-SNAPSHOT
demo-spring-boot-starter
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-autoconfigure
org.springframework.boot
spring-boot-configuration-processor
true
com.fiuty
demo1
1.0-SNAPSHOT
com.fiuty
demo2
1.0-SNAPSHOT
org.springframework.boot
spring-boot-maven-plugin
(3)demo-spring-boot-starter的代码结构如下图所示,有一个DemoConfiguration配置类(注入了两个bean,demo1的student和demo2的teacher),还有两个properties配置类用于读取yaml文件的配置值,还有自动装配类DemoAutoConfiguration和自动装配配置文件spring.factories,用于项目启动时初始化bean并且被spring容器管理:
- TeacherProperties配置类:
@ConfigurationProperties(prefix = "com.demo2")
@Configuration
@Data
public class TeacherProperties {
private String name = "defaultTeacher";
private Integer age = 30;
}
- StudentProperties配置类
@ConfigurationProperties(prefix = "com.demo1")
@Configuration
@Data
public class StudentProperties {
private String name = "defaultStudent";
private Integer age = 10;
}
- DemoConfiguration配置类,将yaml文件的配置值赋值到两个bean,demo1的student和demo2的teacher:
@Configuration
//允许导入配置类,配置类bean被spring容器管理
@EnableConfigurationProperties({StudentProperties.class, TeacherProperties.class})
@Slf4j
public class DemoConfiguration {
@Bean
public Student getStudent(StudentProperties studentProperties) {
Student student = new Student();
log.info("初始化student");
student.setName(studentProperties.getName());
student.setAge(studentProperties.getAge());
return student;
}
@Bean
public Teacher getTeacher(TeacherProperties teacherProperties) {
Teacher teacher = new Teacher();
teacher.setName(teacherProperties.getName());
teacher.setAge(teacherProperties.getAge());
return teacher;
}
}
- DemoAutoConfiguration自动装配类
//自动装配,项目启动即在spring容器中注册管理相关bean
@Import(DemoConfiguration.class)
@Configuration
public class DemoAutoConfiguration {
}
- META-INF spring.factories配置自动装配类,需要注意的是spring.factories需放在resource
的目录下,在引入starter的时候spring容器会注册相关自动装配bean。
# Auto Confiure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.fiuty.demo.spring.boot.starter.configure.DemoAutoConfiguration,\
com.fiuty.demo.spring.boot.auto.assemble.AssembleAutoConfiguration
四、project项目
(1)project项目结构如下,引入自定义starter,在yaml文件配置starter的两个配置类,最后注入demo1的student bean和demo2的teacher bean,获取其name和age的值:
(2)引入自定义的starter的pom文件如下:
com.fiuty
demo-spring-boot-starter
0.0.1-SNAPSHOT
完整的pom文件:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.4.0
com.fiuty
project
0.0.1-SNAPSHOT
project
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-web
com.fiuty
demo-spring-boot-starter
0.0.1-SNAPSHOT
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
(3)代码如下
- DemoController
@RestController
@RequestMapping("/api")
public class DemoController {
@Autowired
private DemoService demoService;
@GetMapping("/student/info")
public String studentInfo() {
return demoService.studentInfo();
}
@GetMapping("/teacher/info")
public String info() {
return demoService.teacherInfo();
}
}
- DemoService
public interface DemoService {
String studentInfo();
String teacherInfo();
}
- DemoServiceImpl
@Service
public class DemoServiceImpl implements DemoService {
@Autowired
private Student student;
@Autowired
private Teacher teacher;
@Override
public String studentInfo() {
return student.getName() + ":" + student.getAge();
}
@Override
public String teacherInfo() {
return teacher.getName() + ":" + teacher.getAge();
}
}
- application.yaml
com:
demo1:
age: 18
name: zhangsan
demo2:
name: lili
age: 25
在写yaml文件的时候可以看到有相关提示,如下图所示:
-
最后项目跑起来,浏览器访问: