spring之Bean的生命周期

Bean的生命周期:

Bean的定义——Bean的初始化——Bean的使用——Bean的销毁

Bean的定义

Bean 是 Spring 装配的组件模型,一切实体类都可以配置成一个 Bean ,进而就可以在任何其他的 Bean 中使用,一个 Bean 也可以不是指定的实体类,这就是抽象 Bean 。

Bean的初始化

Spring中bean的初始化回调有两种方法
一种是在配置文件中声明init-method="init",然后在一个实体类中用init()方法来初始化

另一种是实现InitializingBean接口,覆盖afterPropertiesSet()方法。

第一种:

配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

	<bean id="init-one" class="org.spring.test.BeanInitDemo1" init-method="init">
		<property name="message" value="这里是配置文件中为message赋值"></property>
	</bean>
</beans>

BeanInitDemo1类:

package org.spring.test;

public class BeanInitDemo1 {
	private String message;

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
	public void init(){
		this.setMessage("这里是init()方法初始化设值");
	}
}

测试类:

package org.spring.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		BeanInitDemo1 bid = (BeanInitDemo1) context.getBean("init-one");
		System.out.println(bid.getMessage());
	}

}

运行结果:
这里是init()方法初始化设值
原因:init()初始化方法的调用是在配置文件的Bean初始化之后执行的, 所以改变了配置文件中对message的赋值。

第二种:
配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

	<bean id="init-two" class="org.spring.test.BeanInitDemo2">
		<property name="message" value="这里是配置文件中为message赋值"></property>
	</bean>
</beans>

编写BeanInitDemo2类,使其实现InitializingBean接口

package org.spring.test;

import org.springframework.beans.factory.InitializingBean;

public class BeanInitDemo2 implements InitializingBean{
	private String message;

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public void afterPropertiesSet() throws Exception {
		// TODO Auto-generated method stub
		this.setMessage("这里覆盖了InitializingBean接口的afterPropertiesSet()方法设值");
	}

}

测试:

package org.spring.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		BeanInitDemo2 bid = (BeanInitDemo2) context.getBean("init-two");
		System.out.println(bid.getMessage());
	}

}

运行结果: 这里覆盖了InitializingBean接口的afterPropertiesSet()方法设值
 原因相同,afterPropertiesSet()方法在配置文件的Bean初始化后执行,所以改变了配置文件中对message的赋值

Bean的使用

Spring中有两种使用bean的方法:

1, BeanFactory:


BeanFactory factory= new XmlBeanFactory(new ClassPathResource("bean.xml"));
factory.getBean("student");
BeanFactory是延迟加载,如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用getBean方法才会抛出异常,也就是说当使用BeanFactory实例化对象时,配置的bean不会马上被实例化。当你使用该bean时才会被实例化(getBean)。
2, ApplicationContext:


ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
如果使用ApplicationContext,则配置的bean如果是singleton不管你用还是不用,都被实例化。ApplicationContext在初始化自身时检验,这样有利于检查所依赖属性是否注入。ApplicationContext是BeanFactory的子类,除了具有BeanFactory的所有功能外还提供了更完整的框架功能,例如国际化,资源访问等。所以通常情况下我们选择使用ApplicationContext。

Bean的销毁

Bean的销毁和初始化一样,都是提供了两个方法
一是在配置文件中声明destroy-method="cleanup",然后在类中写一个cleanup()方法销毁
二是实现DisposableBean接口,覆盖destory()方法

第一种:
配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

	<bean id="destory-one" class="org.spring.test.BeanDestoryDemo1" destroy-method="cleanup">
		<property name="message" value="这里是配置文件中为message赋值"></property>
	</bean>
</beans>

BeanDestoryDemo1类:

package org.spring.test;

public class BeanDestoryDemo1 {
	private String message;

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
	public void cleanup(){
		System.out.println("销毁之前可以调用一些方法");
	}
}

测试:

package org.spring.test;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DestortTest {
	public static void main(String[] args) {
		AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		BeanDestoryDemo1 bdd = (BeanDestoryDemo1) context.getBean("destory-one");
		System.out.println(bdd.getMessage());
		context.registerShutdownHook();
	}
}

运行结果:

context.registerShutdownHook()是为spring注册关闭吊钩,程序退出之前关闭spring容器,如果没有context.registerShutdownHook();将不会执行cleanup()方法。

第二种:
配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

	<bean id="destory-two" class="org.spring.test.BeanDestoryDemo2">
		<property name="message" value="这里是配置文件中为message赋值"></property>
	</bean>
</beans>

BeanDestoryDemo2类:

package org.spring.test;

import org.springframework.beans.factory.DisposableBean;

public class BeanDestoryDemo2 implements DisposableBean{
	private String message;

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public void destroy() throws Exception {
		// TODO Auto-generated method stub
		System.out.println("同样,销毁之前调用的方法");
	}
}

测试:

package org.spring.test;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DestortTest {
	public static void main(String[] args) {
		AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		BeanDestoryDemo2 bdd = (BeanDestoryDemo2) context.getBean("destory-two");
		System.out.println(bdd.getMessage());
		context.registerShutdownHook();
	}
}

运行结果:

Spring可以管理singleton作用域(默认的)的Bean的生命周期,所以在Bean初始化及销毁之前可以做一些工作,更灵活的管理Bean。

时间: 2024-10-01 09:46:49

spring之Bean的生命周期的相关文章

spring入门(4) spring中Bean的生命周期总结

Spring中Bean的生命周期,在学习spring的过程中bean的生命周期理解对学习spring有很大的帮助,下面我就分别介绍在 ApplicationContext和BeanFactory中Bean的生命周期. 1.在ApplicationContext中Bean的生命周期 生命周 期执行的过程如下: 1.需找所有的bean根据bean定义的信息来实例化bean 2.使用依赖注入,spring按bean 定义信息配置bean的所有属性 3.若bean实现了BeanNameAware接口,工

j2ee-Spring ApplicationContext Bean的生命周期是怎么样的?

问题描述 Spring ApplicationContext Bean的生命周期是怎么样的? spring 3.x企业应用开发实践一书中写道: ApplicationContext的初始化和BeanFactory有一个重大的区别:BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例目标Bean:而ApplicationContext则在初始化应用上下文时就实例化所有单实例的Bean. 但是在介绍ApplicationContext Bean的生命周期时,配

Spring Bean的生命周期管理

本文来自阅读Life Cycle Management of a Spring Bean这篇文章所做的笔记和实验. 按图索骥 bean的生命周期 知识点 1. BeanNameAware接口 Spring Bean存活于容器之中,一般情况下spring bean对context的情况并不了解,如果希望某个bean知道自己在context中的代号:bean name,即可让该bean的类型实现BeanNameAware接口. package org.test.spittr.spi; import

Spring Bean的生命周期详细介绍_java

Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring容器.这里,我们讲的也是 ApplicationContext中Bean的生命周期.而实际上BeanFactory也是差不多的,只不过处理器需要手动注册. 一.生命周期流程图: Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,这其中包含了一系列关

Bean的生命周期

原文:Bean的生命周期 1.实现各种生命周期控制访问的NewCar package com.beanprocess; import org.springframework.beans.BeansException; import org.springframework.beans.factory.*; /** * Created by gao on 16-3-18. */ public class NewCar implements BeanFactoryAware,BeanNameAware

【spring框架】bean的生命周期

生命周期: a)lazy-init(不重要) 指的是在容器进行初始化的时候它不进行初始化 ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化.提前实例化意味着作为初始化过程的一部分,ApplicationContext实例会创建并配置所有的singleton bean.通常情况下这是件好事,因为这样在配置中的任何错误就会即刻被发现(否则的话可能要花几个小时甚至几天). 有时候这种默认处理可能并不是你想要的.如果你不想让一个singlet

关于Stateful Session Bean的生命周期问题

问题描述 在Glassfish的EJB容器设置中,EJBCache的一个选项CacheResizeQuantity:缓存中的Bean达到最大数目后,被容器从备份存储中删除的钝化Bean的数目.为什么缓存中Bean达到最大数目后要从备份存储中删除钝化Bean呢?这对解决缓存无法增加Bean实例有什么作用呢?而且还有一个选项是RemovalSelectionPolicy:从缓存中删除有状态Bean依据的策略.这一项应该是和上一项结合使用的吧,那么既然是从缓存中删除有状态Bean,就应该是缓存中的Be

【Spring】Spring常用配置-Bean的初始化和销毁(生命周期)

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 分析 在我们实际开发的时候,经常会遇到在Bean使用之前或者之后做些必要的操作,Spring对Bean的生命周期的操作提供了支持. 有如下2种方式: 1.Java配置方式:使用@Bean的initMethod和destroyMethod(相当于xml配置的init-method和destroy-method) 2.注解方式: 利用JSR-250的@PostConstruct和@Pr

【Spring实战】—— 4 Spring中bean的init和destroy方法讲解

本篇文章主要介绍了在spring中通过配置init-method和destroy-method方法来实现Bean的初始化和销毁时附加的操作. 在java中,我们并不需要去管理内存或者变量,而在C或C++中,可以通过new和delete等方式来创建和删除变量或者对象.在Spring中,如果想要对一个bean进行初始化和结束附加一定的操作,则可以使用上述的两个方法来实现. 在介绍这两个方法前,读者需要了解Spring中bean的生命周期,最常使用的两种生命周期是:singleton和prototyp