Spring Boot @Component 教程显示了如何在 Spring 应用中使用@Component
注解。 在示例中,我们创建一个 Spring Boot 控制台应用。
Spring 是流行的 Java 应用框架,而 Spring Boot 是 Spring 的演进,可以帮助轻松地创建独立的,生产级的基于 Spring 的应用。
@Component
@Component
是最通用的 Spring 注解。 在类路径扫描期间找到装饰有@Component
的 Java 类,并在上下文中注册为 Spring Bean。 @Service
,@Repository
和@Controller
是@Component
的专业,用于更具体的情况。
@ComponentScan
确保找到用@Component
装饰的类并将其注册为 Spring Bean。 @ComponentScan
自动包含在@SpringBootApplication
中。
@Bean
具有与@Component
类似的目的。 不会自动检测到。 用@Bean
装饰的方法会在配置阶段生成一个由 Spring 容器管理的 bean。
Spring Boot @Component
示例
以下应用演示了@Component
的用法。 它使用注解创建一个随机生成名称的 bean。
pom.xml
src
├───main
│ ├───java
│ │ └───com
│ │ └───zetcode
│ │ │ Application.java
│ │ │ MyRunner.java
│ │ └───service
│ │ RandomNameGenerator.java
│ └───resources
│ application.properties
└───test
└───java
这是项目结构。
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>
<groupId>com.zetcode</groupId>
<artifactId>springbootcomponentex</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
这是 Maven pom.xml
文件。 spring-boot-starter-parent
是父 POM,它为使用 Maven 构建的应用提供依赖关系和插件管理。 spring-boot-starter
是一个核心启动器,包括自动配置支持,日志记录和 YAML。 spring-boot-maven-plugin
将 Spring 应用打包到可执行的 JAR 或 WAR 归档文件中。
resources/application.properties
spring.main.banner-mode=off
logging.level.org.springframework=ERROR
logging.pattern.console=%d{dd-MM-yyyy HH:mm:ss} %magenta([%thread]) %highlight(%-5level) %logger.%M - %msg%n
application.properties
是 Spring Boot 中的主要配置文件。 我们关闭 Spring 横幅,通过仅选择错误消息来减少 Spring 框架的日志记录数量,并设置控制台日志记录模式
com/zetcode/service/RandomNameGenerator.java
package com.zetcode.service;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Random;
@Component
public class RandomNameGenerator {
public String generate() {
var names = List.of("Peter", "Roland", "Lucy", "Robert", "Jane");
var r = new Random();
int i = r.nextInt(names.size());
return names.get(i);
}
}
RandomNameGenerator
是装饰有@Component
的 Java 类。 在组件扫描过程中将检测到它,并将其注册为 Spring Bean。
com/zetcode/MyRunner.java
package com.zetcode;
import com.zetcode.service.RandomNameGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class MyRunner implements CommandLineRunner {
private static final Logger logger = LoggerFactory.getLogger(MyRunner.class);
@Autowired
private RandomNameGenerator randGenerator;
@Override
public void run(String... args) {
logger.info("Generating random name: {}", randGenerator.generate());
logger.info("Generating random name: {}", randGenerator.generate());
logger.info("Generating random name: {}", randGenerator.generate());
}
}
通过实现CommandLineRunner
,将在应用启动后执行MyRunner
类的run()
方法。
@Component
public class MyRunner implements CommandLineRunner {
MyRunner
也装饰有@Component
,因此也会自动检测并注册。
@Autowired
private RandomNameGenerator randGenerator;
使用@Autowired
注解,我们将RandomNameGenerator
bean 注入到randGenerator
字段中。
@Override
public void run(String... args) {
logger.info("Generating random name: {}", randGenerator.generate());
logger.info("Generating random name: {}", randGenerator.generate());
logger.info("Generating random name: {}", randGenerator.generate());
}
在run()
方法中,我们记录包含随机名称的消息。
com/zetcode/Application.java
package com.zetcode;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Application
是设置 Spring Boot 应用的入口。 @SpringBootApplication
注解启用自动配置和组件扫描。 它是@Configuration
,@EnableAutoConfiguration
和@ComponentScan
注解的便捷注解。
$ mvn -q spring-boot:run
...
30-04-2019 12:22:44 [main] INFO com.zetcode.MyRunner.run - Generating random name: Roland
30-04-2019 12:22:44 [main] INFO com.zetcode.MyRunner.run - Generating random name: Peter
30-04-2019 12:22:44 [main] INFO com.zetcode.MyRunner.run - Generating random name: Lucy
应用运行后,我们可以在控制台中看到日志消息。
在本教程中,我们展示了如何在 Spring 应用中使用@Component
注解。