Spring Boot @Component

来源:这里教程网 时间:2026-02-17 21:33:24 作者:

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.xmlsrc├───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=offlogging.level.org.springframework=ERRORlogging.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;@Componentpublic 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;@Componentpublic 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()方法。

@Componentpublic class MyRunner implements CommandLineRunner {

MyRunner也装饰有@Component,因此也会自动检测并注册。

@Autowiredprivate RandomNameGenerator randGenerator;

使用@Autowired注解,我们将RandomNameGenerator bean 注入到randGenerator字段中。

@Overridepublic 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;@SpringBootApplicationpublic 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: Roland30-04-2019 12:22:44 [main] INFO  com.zetcode.MyRunner.run - Generating random name: Peter30-04-2019 12:22:44 [main] INFO  com.zetcode.MyRunner.run - Generating random name: Lucy

应用运行后,我们可以在控制台中看到日志消息。

在本教程中,我们展示了如何在 Spring 应用中使用@Component注解。

相关推荐