实现Springboot的自动装配

2023-12-18 17:17:28

首先我们有一个模块叫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。在该文件中可以编写各种加载类的限制。

文章来源:https://blog.csdn.net/qq_38087131/article/details/135063947
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。