Spring Boot 导入 Bean
最后修改于 2023 年 7 月 21 日
Spring Boot 导入 Bean 教程展示了如何将额外的 Bean 导入 Spring Boot 应用程序的应用程序上下文。
Spring Boot 是一个流行的应用程序框架,用于在 Java、Kotlin 或 Groovy 中创建企业应用程序。
@SpringBootApplication 是一个便捷的注解,它允许在应用程序类上定义自动配置、组件扫描和定义额外的 Bean。
在现代应用程序中,Spring Bean 通常通过组件扫描注册到应用程序上下文中。但也可以使用 @Import 注解或 SpringApplicationBuilder 的 sources 方法来导入 Bean。
Spring Boot 导入 Bean 示例
在下面的应用程序中,我们关闭组件扫描,并使用 @Import 和 sources 注册服务 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 的另一种方法是使用 SpringApplicationBuilder 的 sources 方法。由于我们已经导入了 Bean,因此该行已被注释掉。
@Autowired private TimeService timeService;
现在 Bean 已经注册,我们可以将其注入到字段中。
System.out.println(timeService.getTime());
最后,我们调用 Bean 的 getTime 方法。
$ ./gradlew -q bootRun ... 17:43:10.494434800
我们运行应用程序。
在本文中,我们展示了如何将额外的 Bean 导入应用程序上下文。