原文: https://javatutorial.net/introduction-to-spring-bean

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

Sping Bean 简介 - 图1

什么是 Sping Bean?

Bean 是构成应用程序的对象,并由 Spring IoC 容器管理。 Spring Framework 文档的正式定义是:
在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 Bean。 Bean 是由 Spring IoC 容器实例化,组装和以其他方式管理的对象。

如果您不熟悉 Spring IoC 容器,强烈建议您单击此处。您将被重定向到我撰写的有关该主题的文章。

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

如何声明一个 Bean?

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

  1. @Configuration
  2. public class DemoConfig{
  3. @Bean
  4. public String demoService() {
  5. return "Hello World!";
  6. }
  7. }

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

域类

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

Company.java

  1. public class Company {
  2. private Employee employee;
  3. public Company(Employee employee) {
  4. this.employee = employee;
  5. }
  6. public void setEmployee(Employee employee) {
  7. this.employee = employee;
  8. }
  9. public Employee getEmployee() {
  10. return employee;
  11. }
  12. }

现在,让我们看看每个员工的结构:

  1. public class Employee {
  2. private int id;
  3. private String firstName;
  4. private String lastName;
  5. public Employee(int id, String firstName, String lastName) {
  6. this.id = id;
  7. this.firstName = firstName;
  8. this.lastName = lastName;
  9. }
  10. public setFirstName(String fName) {
  11. firstName = fName;
  12. }
  13. public setLastName(String lName) {
  14. lastName = lName;
  15. }
  16. public int getId() {
  17. return id;
  18. }
  19. public String getFirstName() {
  20. return firstName;
  21. }
  22. public String getLastName() {
  23. return lastName;
  24. }
  25. }

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

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

  1. Emplyoee employee = new Employee(1, "John", "Smith");
  2. Company company = new Company(employee);

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

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

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

AppConfig.java

  1. @Configuration
  2. @ComponentScan(basePackageClasses = Company.class)
  3. public class AppConfig {
  4. @Bean
  5. public Employee getEmployee() {
  6. return new Eployee(1, "John", "Smith");
  7. }
  8. }

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

  1. ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

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

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

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