157.md 4.2 KB
Newer Older
W
init  
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# 春豆简介

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

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

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

## 什么是春豆?

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?

W
wizardforcel 已提交
20
我们可以简单地通过使用@Bean 注解来声明一个 bean。 声明带有@Bean 注解的方法的示例:
W
init  
wizardforcel 已提交
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137

```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());
```