首先我们有一个模块叫testOne
该模块就只定义一个类UserService。
我们要将UserService自动装配到Springboot中。
一下是testOne的各个文件。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hy</groupId>
<artifactId>testOne</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>testOne</name>
<description>testOne</description>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.7.9</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
UserService类
package com.hy.testone.service;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix ="com.hy" )
public class UserService {
public String sex;
public String name;
public int age;
public String getSex() { return sex; }
public void setSex(String sex) { this.sex = sex; }
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; }
}
代码结构如下
至此,我们一个模块已经建设好了。
接下来我们开始实现将UserService自动装配到Springboot中。
1.在resource下新建META-INF文件夹。
2.META-INF文件夹下新建spring.factories文件。文件内容如下
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.hy.testone.service.UserService
3.新建一个springboot项目名为testTwo,在main函数中调用UserService。我们将testTwo在maven中引用testOne模块以下为testTwo 的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.bobo</groupId>
<artifactId>testTwo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.hy</groupId>
<artifactId>testOne</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
接着在application.xml中定义UserService的属性
启动项目,即可得到以下结果
原理:springboot在启动时会去扫描resources/META-INF/sping.factories文件。
里边配置的key为org.springframework.boot.autoconfigure.EnableAutoConfiguration。
value为com.hy.testone.service.UserService。意为允许UserService开启自动装配。当springboot启动时监测到有这个文件是会自动加载value中的类。
他的实现机制是一种SPI机制。
补充:还可以在resources/META-INF文件下添加spring-autoconfigure-metadata.properties文件,内容为
com.hy.testone.config.UserService.ConditionalOnClass=com.hy.testone.condition
效果为在UserService的类上标注了一个@ConditionalOnClass注解。在springboot检测到有com.hy.testone.condition这个类时,才会去加载UserService。在该文件中可以编写各种加载类的限制。