一、Spring Bean 作用域

当我们在 Spring 中定义了一个 Bean 之后,必须给我们的 Bean 定义一个作用域。

当然啊,我们之前弄得内个 HelloWorld 的时候,貌似并没有给这个 Spring 定义作用域。其实不然,Spring 其实默认给与了 Bean 一个作用域,就是:singleton。

这时候有人会问了,这个作用域有啥用?

这里我们需要知道一下 Spring 的作用域有那些,分别代表的是什么意思。

spring 得作用域_java

Spring 一共有五种作用域,每个作用域有不同的功能,默认的 singleton 可以说就是全局唯一,Bean 以单例的方式存在。

如果我们需要每次都从容器中从新生成一个 Bean,那么我们就需要给这个 Bean 的作用域配置成 prototype。

这里我还要说一句,我们常用的一般只有这两个,其他的了解即可~~~

接下来我们来使用一下,感受感受这两个作用域。

1. singleton

我们创建一个 Singleton 的类,并在类中定义一个 msg 的属性,顺便写上 get、set 方法。

spring 得作用域_spring 得作用域_02

然后我们再配置一下 beans.xml 这个文件。

spring 得作用域_bean_03

当然啊,这个 scope 我们可以写可以不写,不写的话,Spring 会帮我们默认成 singleton,我们为了学习,就先写上。

接着写一个测试类。

spring 得作用域_spring boot_04

很简单的一个测试类啊,我们就看看最后两个 Bean 能不能都输出 aaa 这个东西。运行一下~

spring 得作用域_bean_05

是 ok 的啊。

2. prototype

这个 prototype 作用域是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。

我们其实还是使用上面的那个例子,然后,我们只需要修改一下作用域,然后直接测试即可,其他的不需要动。

spring 得作用域_spring 得作用域_06

接着来测试

spring 得作用域_spring boot_07

是不是啊,我们就获取不到 null 了。

二、Spring Bean 的生命周期

其实 Bean 的生命周期和这个 Servlet 很类似。

Bean的生命周期可以表达为:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁

当然啊,有一些在 Bean 实例化和销毁之间发生的活动,但是本章将只讨论两个重要的生命周期回调方法,它们在 bean 的初始化和销毁的时候是必需的。

初始化回调

初始化回调可以通过实现接口或者是通过配置进行回调,我们来介绍一下这两种方法。

1. 接口回调

接口回调,需要我们实现 InitializingBean 这个接口,下面我们创建一个 Bean,然后实现这个接口。

spring 得作用域_java_08

自己配置一下 Bean,然后我们来测试一下这个方法

spring 得作用域_bean_09

spring 得作用域_spring 得作用域_10

可以看到,我们是先执行回调之后,然后才去执行 say 方法。

2. 配置回调

配置回调我们可以不去实现接口,通过在 bean.xml 配置来实现回调

spring 得作用域_spring boot_11

spring 得作用域_bean_12

然后再来运行测试方法。

spring 得作用域_bean_13

是没有问题的。

销毁回调

同样啊,销毁回调也有两种方法,实现接口或者配置

1. 实现接口

销毁的回调接口是 DisposableBean

spring 得作用域_spring_14

其他的不变,我们这次修改一下测试代码,我们添加一个方法调用

spring 得作用域_spring boot_15

这里还需要注意的是,我们需要将之前的 ApplicationContext 修改成 AbstractApplicationContext。

然后我们测试

spring 得作用域_bean_16

也是没有问题的啊。

2. 配置实现

同样需要配置到 bean.xml 中,属性是 destroy-method。

spring 得作用域_java_17

spring 得作用域_java_18

再来测试一下

spring 得作用域_bean_19

 

好了,这一篇就先到这里,先看着,慢慢消化。