Spring02-Bean的生命周期

基本概念

有关Spring的概念可以去看上一篇文章

Bean:被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的。bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。

IoC:IoC是spring的核心思想之一,它也是指Spring中的IoC容器去管理Bean的生命周期。包括Bean的实例化,初始化,销毁,是否延迟加载等。所以讨论Bean的生命周期,必须对IoC有重复的了解。

Bean的生命周期

1.实例化Bean

实例化Bean指的就是当我们在代码层去向IoC容器注入这个Bean后,当我们想要调用或者容器一旦建立,这个Bean对象产生的第一步。注入的方式有两种:

1>通过xml配置文件的<bean ></bean>标签

在这个标签中,我们需要注意它的一些属性:

 class:用来创建 bean 的 bean 类。

id/name: 唯一的 bean 标识符。在 XML 中,使用 ID 和/或 name 属性来指定 bean 标识符。

scope: 指定由特定的 bean 定义创建的对象的作用域

constructor-arg/properties: 注入依赖关系

lazy-initializationmode: 延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例。

init-method: 在 bean 的所有必需的属性被容器设置之后,调用回调方法。它将会在 bean 的生命周期章节中进行讨论。

Deastory-method: 当包含该 bean 的容器被销毁时,使用回调方法。它将会在 bean 的生命周期章节中进行讨论。

2>通过一些注解:@Component @Controller @Service @Repositry

以上的属性和标签,IoC会根据它们管理Bean的生命周期

2.设置对象属性

这个步骤也是我们常说的依赖注入,在xml文件中,我们可以用constructor-arg/properties属性去实现固定赋值,如果是注解,可以用value去固定赋值,还有用@Autowried去自动装配。注入的方法有很多,例如工厂注入。

3.处理Aware接口

如果在创建Bean类的时候,我们实现了Aware接口的相关方法,那么我们就能拿到一些关于Bean的相关资源。

 比如BeanNameAware接口,它就可以给我们Bean的name,类似Aware的接口都继承了Aware总父类。

4.BeanPostProcessor前置处理

我只们直接看实现的接口,如果Bean类实现这个接口,我们可以在初始化Bean前对Bean做一些操作比如判断,然后返回回去 

5.InitianlizingBean

如果Bean实现了InitializingBean这个接口,那么我们可以调用afterPropertiesSet方法去处理赋值后的操作。 

6.init-method

如果也可以自己定义初始化的方法,然后再<bean>标签中通过init-method属性指定这个方法的位置。当我们要初始化对象时就对调用该方法。一般我们这个方法会是工厂类的一个生产bean的方法。

7.BeanPostProcessor后置处理

还是BeanPostProcessor这个接口,我们也可以再初始化结束后去执行一些操作,然后将这个Bean返回。当这个操作结束后,这个Bean就算是成为了一个正常的对象等待被调用。我们可以用这个对象去执行我们想要的操作

8.DisposableBean

当我们对对象的操作完成后,如果对象实现了DIsposableBean接口

 那么这个对象就会调用系统默认的destory方法去销毁这个对象,释放内存

9.Destory-method

我们也可以再xml配置文件中指定属性去让bean对象执行我们设计的destory方法

 通过这个方法,Bean会按照我们希望的方式去销毁,比如释放一些特定资源等。

Bean的作用域

Singleton:单例模式。在整个SpringIoC容器中,使用singleton定义的Bean将只有一个实例,这是默认的配置。

Prototype:原型模式。每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例。

request:对于每次HTTP请求,使用request定义的Bean都将产生一个新的实例,即每次HTTP请求都会产生不同的Bean实例。当然只有在WEB应用中使用Spring时,该作用域才真正有效。

session:对于每次HTTPSession,使用session定义的Bean都将产生一个新的实例时,即每次HTTP Session都将产生不同的Bean实例。同HTTP一样,只有在WEB应用才会有效。

小结:Bean的作用域对Bean的生命周期有很大的影响,尤其不同的作用域的销毁方式不同,因此当我们设计Bean时需要注意它的作用域。

总结

Bean的生命周期是一个复杂的过程,针对不用的Bean我们的操作范围也不同,比如我们无法对系统工具类去进行@Value操作,因为我们无法修改原码。所以在设计程序时,针对不同的bean对象,我们必须充分考虑这个对象的整个生命周期发生的变化,然后调用相应的接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值