# Sping Bean 简介

> 原文： [https://javatutorial.net/introduction-to-spring-bean](https://javatutorial.net/introduction-to-spring-bean)

在本教程中，您将学习什么是 Sping Bean 以及如何使用它。

![spring-featured-image](img/d2f73752d8ae931b119dec1eac866973.jpg)

## 什么是 Sping Bean？

Bean 是构成应用程序的对象，并由 Spring IoC 容器管理。 [Spring Framework 文档](https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-introduction)的正式定义是：
在 Spring 中，构成应用程序主干并由 Spring IoC 容器管理的对象称为 Bean。 Bean 是由 Spring IoC 容器实例化，组装和以其他方式管理的对象。

如果您不熟悉 Spring IoC 容器，[强烈建议您单击此处](https://javatutorial.net/java-spring-ioc-container-example)。您将被重定向到我撰写的有关该主题的文章。

bean 的定义包含称为**配置元数据的内容**。容器需要知道如何创建 Bean，Bean 的生命周期详细信息以及 Bean 的依赖关系。

## 如何声明一个 Bean？

我们可以简单地通过使用`@Bean`注解来声明一个 bean。 声明带有`@Bean`注解的方法的示例：

```java
@Configuration
public class DemoConfig{
    @Bean
    public String demoService() {
        return "Hello World!";
    }
}

```

值得一提的是，当 JavaConfig 遇到`@Bean`方法时，它将执行该方法并将返回值注册为`BeanFactory`中的 bean。

### 域类

假设我们有一个名为`Company`的类，该类具有一个将`Employee`实例分配给实例变量的构造函数。 它还具有该员工的相应的 setter 和 getter 方法。

`Company.java`

```java
public class Company {
    private Employee employee;

    public Company(Employee employee) {
        this.employee = employee;
    }

	public void setEmployee(Employee employee) {
		this.employee = employee;
	}

	public Employee getEmployee() {
		return employee;
	}
 }
```

现在，让我们看看每个员工的结构：

```java
public class Employee {
   private int id;
   private String firstName;
   private String lastName;

   public Employee(int id, String firstName, String lastName) {
      this.id = id;
      this.firstName = firstName;
      this.lastName = lastName;
   }

   public setFirstName(String fName) {
      firstName = fName;
   }

   public setLastName(String lName) {
      lastName = lName;
   }

   public int getId() {
      return id;
   }

   public String getFirstName() {
      return firstName;
   }

   public String getLastName() {
      return lastName;
   }
}
```

具有单个构造函数和 setters/getters 方法的标准方法。

从以上两个类别中，您将如何将员工分配到特定公司？ 好吧，首先您将实例化一个`Employee`对象，然后将实例化一个`Company`对象，并将`Employee`对象作为构造函数参数传递。 像这样：

```java
Emplyoee employee = new Employee(1, "John", "Smith");
Company company = new Company(employee);
```

这是通常的做法。 这种方法有什么问题？ 想象一下，如果我们有数百堂课。 这将很难管理，甚至可能无法管理。

由于这个问题，我们有控制反转。 对象可以从 IoC 容器中检索其依赖关系，而不必自己构造依赖关系。

让我们看看如何通过包含本文的主要主题`@Bean`来改进上述示例。

`AppConfig.java`

```java
@Configuration
@ComponentScan(basePackageClasses = Company.class)
public class AppConfig {
    @Bean
    public Employee getEmployee() {
        return new Eployee(1, "John", "Smith");
    }
}
```

现在我们已经编写了配置类，我们需要创建`AnnotationConfigApplicationContext`类的实例：

```java
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
```

现在完成！ 我们已经使 IoC 容器初始化了 bean。 还有另一件事要做。 检查是否正确创建了 bean。

为此，只需实例化一个`Company`实例，然后我们可以使用`assertEquals`方法检查更正。

```java
Company company = context.getBean("company", Company.class);
assertEquals("John", company.getEmployee().getFirstName());
assertEquals(1, company.getEmployee().getId());
```