Spring bean的初始化及销毁

摘要:
Spring bean有几个属性:scope、init方法、destroy方法、dependent等。Spring容器中的scope是指它创建的bean对象相对于其他bean对象的请求可见性范围。Init方法是指创建bean时调用的方法。注意,它不是用于创建bean的方法。Depends on用于指定bean初始化和销毁的顺序。Spring允许bean在初始化之后和销毁之前执行特定操作。

Spring bean的几个属性:scopeinit-methoddestroy-methoddepends-on等。

Scope

在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围。

scope分类:singleton, prototype, request, session, global session。

这里的singleton和设计模式里面的单例模式不一样,标记为singleton的bean是由容器来保证这种类型的bean在同一个容器内只存在一个共享实例,而单例模式则是保证在同一个Classloader中只存在一个这种类型的实例。

init-method

是指创建bean时调用的方法,注意,不是创建bean的方法。

destroy-method

是指销毁bean时调用的方法,同样,不是销毁bean的方法。

注意:scope为prototype的bean,容器会将创建好的对象实例返回给请求方,之后,容器就不再拥有其引用请求方需要自己负责当前对象后继生命周期的管理工作,包括该对象的销毁

所以:scope为singleton的bean的destroy方法则是在容器关闭时执行,而scope为prototype的bean是不会执行destroy方法的。

depends-on

用于指定bean初始化及销毁时的顺序。注意上面的结论

<bean id="helloApi" class="cn.javass.spring.chapter2.helloworld.HelloImpl"/>
<bean id="decorator" 
class="cn.javass.spring.chapter3.bean.HelloApiDecorator" 
depends-on="helloApi">
<property name="helloApi"><ref bean="helloApi"/></property>
</bean>

“decorator”指定了“depends-on”属性为“helloApi”,所以在“decorator”Bean初始化之前要先初始化“helloApi”而在销毁“helloApi”之前先要销毁“decorator”,大家注意一下销毁顺序。

Spring 允许 Bean 在初始化完成以及销毁执行特定的操作。下面是常用的三种指定特定操作的方法:

    通过实现 InitializingBean / DisposableBean 接口;
    通过<bean> 元素的 init-method / destroy-method属性;
    通过@PostConstruct或@PreDestroy注解。

Bean在实例化的过程中:Constructor > @PostConstruct >InitializingBean > init-method

Bean在销毁的过程中:@PreDestroy > DisposableBean > destroy-method

参考:

Spring bean 的init-method和destroy-method
Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
Spring scope属性详解

----------------------------------------------------------

可以和@Component一起使用的注解:

@Lazy(true) -- 延迟初始化

@DependsOn({"managedBean"}) --  初始化及销毁时的顺序

@Qualifier -- 见 Spring 依赖注入(DI)的注解

@Primary -- 当有多个候选时,被注解的bean作为首选项,否则异常。

 

免责声明:文章转载自《Spring bean的初始化及销毁》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【SequoiaDB】5 巨杉数据库SequoiaDB基本操作MFC位图按钮下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SpringBoot + MyBatis(注解版),常用的SQL方法

一、新建项目及配置 1.1 新建一个SpringBoot项目,并在pom.xml下加入以下代码   <dependency>    <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starte...

nextcloud nginx搭建完后(初始化数据库后)登录不了

nextcloud搭建完初始化数据库(mysql8.0)后,输入用户名、密码后登录不了、登录没反应(还是跳转当前登录页面)呈现如下: 原因是web、php nginx 和  ../php/session/ 不是同一个用户 这里的../php/session是php在你当前系统安装的位置,很多博客、论坛也说明了问题,但是给的session的位置不一定对,如下...

OA日志模块

最近两天做了工作日志模块,虽然最后通知因时间紧急,此模块取消,但已具雏形,在此记录一下。 1.查询显示登录用户所有日志 Code<%@ page language="java" pageEncoding="gb2312"%><%@ taglib uri="http://jakarta.apache.org/struts/tags-be...

SpringBoot启动过程解析(简化)

springBoot web方式启动过程 在这个启动过程中会有各种SpringBoot对外提供的扩展接口来对不同启动阶段进行自定义操作。 了解启动过程也是为了让我们更好理解SpringBoot提供的扩展接口使用   jar包启动或者外置war包启动都是调用SpringApplication.run()方法进行项目启动 tomcat会查询context上下文...

线程属性--十分重要的概念

http://blog.chinaunix.net/uid-23193900-id-3346199.html 一.线程属性 线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。我们用pthread_attr_init函数对其初始化,用pthread_attr_destroy对其去除初始化。...

Camera Service

上面这张图比较清楚的表现了camera provider进程在camera架构中位置,作为承上启下的部分,和cameraserver进程和底层的驱动交互,camera provider进程非常重要,camera HAL层几乎全部运行在camera provider进程中完成。 首先看下camera provider所在源码中的位置:hardware/in...