ZetCode

Spring Boot 导入 Bean

最后修改于 2023 年 7 月 21 日

Spring Boot 导入 Bean 教程展示了如何将额外的 Bean 导入 Spring Boot 应用程序的应用程序上下文。

Spring Boot 是一个流行的应用程序框架,用于在 Java、Kotlin 或 Groovy 中创建企业应用程序。

@SpringBootApplication 是一个便捷的注解,它允许在应用程序类上定义自动配置、组件扫描和定义额外的 Bean。

在现代应用程序中,Spring Bean 通常通过组件扫描注册到应用程序上下文中。但也可以使用 @Import 注解或 SpringApplicationBuildersources 方法来导入 Bean。

Spring Boot 导入 Bean 示例

在下面的应用程序中,我们关闭组件扫描,并使用 @Importsources 注册服务 Bean。

build.gradle
...
src
├── main
│   ├── java
│   │   └── com
│   │       └── zetcode
│   │           ├── Application.java
│   │           └── service
│   │               └── TimeService.java
│   └── resources
└── test
    └── java

这是 Spring Boot 应用程序的项目结构。

build.gradle
plugins {
    id 'org.springframework.boot' version '3.1.1'
    id 'io.spring.dependency-management' version '1.1.0'
    id 'java'
}

group = 'com.zetcode'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
}

这是 Gradle 的 build.gradle 文件。

com/zetcode/service/TimeService.java
package com.zetcode.service;

import org.springframework.stereotype.Service;

import java.time.LocalTime;

@Service
public class TimeService {

    public LocalTime getTime() {

        return LocalTime.now();
    }
}

我们有一个简单的服务 Bean,它返回当前的本地时间。

com/zetcode/Application.java
package com.zetcode;

import com.zetcode.service.TimeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@EnableAutoConfiguration
@Configuration
@Import(value=TimeService.class)
public class Application implements CommandLineRunner {

    public static void main(String[] args) {

        new SpringApplicationBuilder(Application.class)
//                .sources(TimeService.class)
                .build()
                .run(args);
    }

    @Autowired
    private TimeService timeService;

    @Override
    public void run(String... args) throws Exception {

        System.out.println(timeService.getTime());
    }
}

我们有意没有使用 @SpringBootApplication 注解,也没有指定 @ComponentScan 注解。为了注册和使用 TimeService Bean,我们必须导入它。

@EnableAutoConfiguration
@Configuration
@Import(value=TimeService.class)
public class Application implements CommandLineRunner {

我们将 TimeService Bean 导入应用程序上下文。

	        new SpringApplicationBuilder(Application.class)
//                .sources(TimeService.class)
                .build()
                .run(args);

导入 Bean 的另一种方法是使用 SpringApplicationBuildersources 方法。由于我们已经导入了 Bean,因此该行已被注释掉。

@Autowired
private TimeService timeService;

现在 Bean 已经注册,我们可以将其注入到字段中。

System.out.println(timeService.getTime());

最后,我们调用 Bean 的 getTime 方法。

$ ./gradlew -q bootRun
...
17:43:10.494434800

我们运行应用程序。

在本文中,我们展示了如何将额外的 Bean 导入应用程序上下文。

作者

我的名字是 Jan Bodnar,我是一个充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已经撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 Spring Boot 教程