# Spring Boot `@Component`

> 原文： [http://zetcode.com/springboot/component/](http://zetcode.com/springboot/component/)

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。

```java
pom.xml
src
├───main
│   ├───java
│   │   └───com
│   │       └───zetcode
│   │           │   Application.java
│   │           │   MyRunner.java
│   │           └───service
│   │                   RandomNameGenerator.java
│   └───resources
│           application.properties
└───test
    └───java

```

这是项目结构。

`pom.xml`

```java
<?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`

```java
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`

```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`

```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()`方法。

```java
@Component
public class MyRunner implements CommandLineRunner {

```

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

```java
@Autowired
private RandomNameGenerator randGenerator;

```

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

```java
@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`

```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`注解的便捷注解。

```java
$ 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`注解。 您可能也对相关教程感兴趣： [Spring Boot `@Controller`教程](/springboot/controller/)， [Spring Boot `@Repository`教程](/springboot/repository/)， [Java 教程](/lang/java/)或列出全部 Spring 入门教程。