欢迎回来各位亲爱的小伙伴!我们已经滑过Spring的门槛,现在我们要深入学习Spring框架中的基础组件。抓紧坐稳,让我们开始本次的知识之旅!

一、 什么是Bean及Bean的生命周期

在Spring大家庭中,Bean就像是家中的重要一员。何为Bean呢?Bean相当于是普通Java类的兄弟,这个兄弟有点特别,他被Spring容器创建、管理并且他还决定了他们的生命周期。生命周期,这个好听的词就像是一部好莱坞大片,其实也差不多。Bean的生命周期中包含了实例化、初始化、使用以及销毁等步骤。养成良好的生活习惯,了解清楚他们的生命周期,这样Bean们才能更好地为我们服务。

我们前面已经提到,Bean在Spring框架中扮演了一个重要的角色。它们是Spring框架的基本组成块。如同世间万物一样,Bean有自己的生命周期,下面是一个具体的例子:
实例化(Instantiation): Bean开始它的生命周期。比如,我们可以通过构造器(Constructor)或工厂方法(Factory method)来实例化一个Bean。

public class HelloWorld {
   private String message;
   //Getters and Setters
}

初始化(Initialization): 一旦Bean被实例化,它就会通过Spring的依赖注入(DI)机制进行初始化。
使用(Usage): 当所有的初始化都完成以后,Bean就可以被应用程序使用了。
销毁(Destruction): Bean的生命周期结束,Spring容器将调用Bean的销毁方法。
我们可以通过覆盖Bean的@PostConstruct和@PreDestroy方法来在生命周期的不同阶段进行一些自定义操作。

二、 什么是依赖注入(DI)与控制反转(IOC)

别被这些专业术语吓破胆,虽然他们俩是Spring中重要的两个概念,其实很easy了。
依赖注入(DI),顾名思义,就是把依赖的东东注入到需要的组件中。想象一下,你在厨房做饭,现在需要用到水,你可以自己到井里打水,但是这明显不现实。然后你想到了水龙头,打开水龙头就有水了,水龙头就像Spring,把需要的东西(比如,服务、组件等)送到你手里,这就是依赖注入。

说完DI,就不得不说说它的好朋友,控制反转(IOC)。IOC其实是DI的另一种表达,把本来由我们自己来控制的东西交给别人来处理(使用对象时,原本需要new出来,现在不用了,直接从spring取),相当于是把控制权从自己手中反转给了别人,这就叫控制反转。DI和IOC都是Spring用来把活动分配给Java中的各个角色的方式。

让我们用一个实例来理解依赖注入(DI)的概念。假设我们有一个TextEditor类和一个SpellChecker类。在没有Spring的情况下,我们可能这样使用它们:

class TextEditor {
    private SpellChecker checker;
    public TextEditor() {
        this.checker = new SpellChecker();
    }
}

但Spring提倡“不要找依赖,依赖就应该找到你”。所以,使用Spring和DI,我们的代码如下:

@Component
class TextEditor {
    private SpellChecker checker;
    @Autowired
    public TextEditor(SpellChecker checker) {
        this.checker = checker;
    }
}

这就是DI的力量。它让TextEditor“逃脱”了创建SpellChecker实例的繁琐。

三、 Spring的作用域与生命周期

我总是告诫大家,每个Bean都是个有生命的实体,他有自己的生命周期,包括出生、成长、成熟和消亡。同样的,Spring容器也是如此。它为内部的Bean提供了六种作用域:
Spring系列学习三、Spring的基础组件-LMLPHP

Spring容器给我们提供了这么多选择,那么我们就需要根据实际情况来仔细考虑当我们的Bean应该属于哪种作用域,多数情况下都是使用默认作用域 singlton(单例模式),偶尔会使用 prototype(原型模式),其他四个作用域用的较少。

关于Spring的作用域,让我们具体解释一下,并提供一个例子。假设我们有一个名为shoppingCart的Bean,它的作用域为"session"。那么每个用户会话都将有其自己的shoppingCart实例。如果将作用域改为"singleton",那么所有的用户会话将共享同一个shoppingCart实例,这是不合理的。

@Configuration
public class AppConfig {

   @Bean
   @Scope("prototype")
   public ShoppingCart shoppingCart() {
      return new ShoppingCart();
   }
}

四、 Spring的配置方式(XML与基于注解的配置)

Spring对Bean的管理支持两种方式,XML与注解的方式,本着,能简单就不要复杂,现在多数都
不想写一堆繁琐的XML配置文件,而是使用注解的方式,通过简简单单的一行注解,就可以完成很多复杂的事情。相比之下,XML配置方式虽然看起来难度较大,但实际上在某些场合,如需要集中管理大量的配置信息或配置改动频繁的时候,使用XML则有更好的维护性和稳定性。

最后,让我们看一个基于XML和基于注解的配置的例子。假设我们要注册一个名为"teaStore"的Bean。

<bean id="teaStore" class="com.example.TeaStore"/>

这是XML方式的配置,而在注解配置方式下:

@Configuration
public class AppConfig {

 @Bean
  public TeaStore teaStore() {
     return new TeaStore();
  }
}

五、HelloWorld示例

1、创建项目,并引入spring依赖;
Spring系列学习三、Spring的基础组件-LMLPHP
Spring系列学习三、Spring的基础组件-LMLPHP

2、创建HelloWorldService并交给Spring管理
Spring系列学习三、Spring的基础组件-LMLPHP
Spring系列学习三、Spring的基础组件-LMLPHP
3、在main方法中,从Spring中获取helloWorldService Bean,并调用其方法输出;
Spring系列学习三、Spring的基础组件-LMLPHP

六、结语

通过本章的学习和实践,我想你已经明了Spring中的Bean的生命周期,关键是如何使用,同时依赖注入和控制反转又是如何帮助我们简化编程的,还有那些作用域和配置方式又是如何影响我们的编程的。我期待你在接下来的学习中,能够把这些知识应用到实践中去,让这些理论知识转变为你解决问题的有力武器。

12-28 19:49