1.写在前面
笔者前面已经介绍SpringBoot的一些应用,其中包括自动配置的原理,自动配置的用的一些注解,如何读取配置文件等等,具体的可以查看笔者的上一篇博客的《SpringBoot的应用(一)》今天笔者要讲的就是在上一篇博客中基础上,怎么来书写自己的自定义组件,然后和SpringBoot进行整合。废话不多说,直接上代码吧!
2.自定义组件
笔者打算做一个最简单的组件,就是读取SpringBoot中的配置文件,我们先创建一个项目,名字可以随便起,笔者这儿取得名字是my-spring-boot-start
,可能不是很规范,我们先来看项目的pom.xml
吧。具体的内容如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/>
</parent>
<dependencies>
<!-- 自定义springboot的组件,必须引入此依赖作为入口 -->
<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>
</dependencies>
差不多就上面的几个简单的依赖,然后我们直接书写读取配置的文件的代码,具体的代码如下:
package com.ys;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "user")
public class UserProperties {
private String name;
private Integer age;
private String gender;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "UserProperties{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
", address='" + address + '\'' +
'}';
}
}
就是利用SpringBoot的一个注解@ConfigurationProperties
,具体这个注解是干嘛的,读者可以查看上一篇博客,文中开头已经给了链接,这个类主要的功能就是配置文件中user
的一些属性。同时笔者也重写了toString
的方法。便于后面的调用测试。接下来笔者就带着大家创建一个类似测试类,便于读者后面调用,查看是否整合成功,具体的代码如下:
package com.ys;
public class UserService {
private UserProperties userProperties;
public UserService(UserProperties userProperties) {
this.userProperties = userProperties;
}
public UserService() {
}
public void getMyUser(){
System.out.println(userProperties);
}
}
笔者在这只是简单的写了一个UserService
类,然后写了一个getMyUser
方法,然后打印userProperties
属性,这个时候需要书写和SpringBoot整合的类,就是自动装配的类,具体的代码如下:
package com.ys;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
//注入UserProperties类
@EnableConfigurationProperties(UserProperties.class)
@ConditionalOnClass(UserService.class)
@ConditionalOnProperty(prefix = "user", value = "enable", matchIfMissing = true)
public class UserServiceAutoConfiguration {
@Autowired
private UserProperties properties;
@Bean
@ConditionalOnMissingBean(UserService.class)
public UserService userService(){
return new UserService(properties);
}
}
上面的条件的注解,笔者在前一篇博客中也是有讲过,在这笔者就不做过多的赘述了。如果不懂的话,可以去看下笔者之前的一篇博客。这个时候代码就书写完了,接下来就是最重要的一点,就是怎么让SpringBoot
扫描到我这个类,同时加载到容器中,通过笔者上篇博客中自动装配的原理,可以得到,我们只需要在resource
目录下创建一个文件夹META-INF
文件夹,然后在这个文件下创建一个spring.properties
文件,具体的内容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.ys.UserServiceAutoConfiguration
这个时候我们一个简单的组件的就创建完成了,这个时候笔者需要把这个项目打包成一个jar,同时需要创建的一个SpringBoot的项目,然后引入进来就可以了。具体的打包命令如下:
mvn clean install -DskipTests=true
打包完成后的如下:
3.SpringBoot引入自定义组件
上面的准备工作都完成了,这个时候笔者需要做的就是怎么把这个自定义的组件和SpringBoot进行整合,首先我们需要创建一个SpringBoot的项目,具体的pom.xml
如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
</parent>
<dependencies>
<!--自己写好的自定义组件-->
<dependency>
<groupId>org.example</groupId>
<artifactId>my-spring-boot-start</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
这个时候创建对应的yml文件,然后再yml文件书写以下的内容,具体的内容如下:
user:
#enable: false
name: zhangsan
age: 18
gender: man
address: China
然后书写我们对应的测试类,具体的代码如下:
package com.ys;
import com.ys.controller.Student;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class SpringBootDemoTest {
@Autowired
UserService userService;
@Test
public void testUser(){
userService.getMyUser();
}
}
然后运行,具体的运行的结果如下:
可以发现我们写的自定义的组件是被SpringBoot给扫描到了,同时也注入了进来。
4.写在最后
笔者在这篇博客简单的教大家写了一个自定义的组件,市面上其他的组件的实现的规则也是差不多的,笔者打算下一篇博客介绍一下
SpringBoot如何整合SpringMVC的,同时介绍一下对应的源码。