Spring学习(四)-Bean的生命周期

BeanFactory中的Bean的生命周期

在这里直接通过例子分析Bean的整个生命周期。

例子
package Car;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;


public class Car implements BeanFactoryAware, BeanNameAware,InitializingBean,DisposableBean{
	private String brand;
	private String color;
	private int maxSpeed;
	
	private BeanFactory beanFactory;
	private String beanName;
	
	
	public Car(){
		System.out.println("调用Car()构造方法。");
	}

	public String getBrand() {
		return brand;
	}

	public void setBrand(String brand) {
		System.out.println("调用SetBrand()方法");
		this.brand = brand;
	}

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}

	public int getMaxSpeed() {
		return maxSpeed;
	}

	public void setMaxSpeed(int maxSpeed) {
		this.maxSpeed = maxSpeed;
	}
	
	public Car(String brand,String color,int maxSpeed){
		this.brand = brand;
		this.color = color;
		this.maxSpeed = maxSpeed;
	}

	public void introduce(){
		System.out.println("brand:"+brand+";color:"+color+";maxSpeed:"+maxSpeed);
	}
	
	//BeanFactoryAware接口方法
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException{
		System.out.println("调用BeanFactoryAware.setBeanFactory()");
		this.beanFactory=beanFactory;
	}
	//BeanNameAware接口方法
	public void setBeanName(String beanName){
		System.out.println("调用BeanNameAware.setBeanName()");
		this.beanName=beanName;
	}
	//InitializingBean接口方法
	public void afterPropertiesSet() throws Exception{
		System.out.println("调用InitializingBean.afterPropertiesSet()");
	}
	//DisposableBean接口方法
	public void destroy() throws Exception{
		System.out.println("调用DisposableBean.destroy()");
	}
	//通过<bean>的init-method属性指定初始化方法
	public void myInit(){
		System.out.println("调用初始化方法,maxSpeed为240.");
	}
	//通过<bean>的destroy-method属性指定销毁方法
	public void myDestroy(){
		System.out.println("调用销毁方法.");
	}	

}

这里实现各种生命周期控制访问的Car,Car类实现了BeanFactoryAware, BeanNameAware,InitializingBean,DisposableBean这些Bean级的生命周期控制接口,同时定义了myInit()和myDestroy()方法,以便在配置文件中通过的init-method属性指定初始化方法与destroy-method属性指定销毁方法。

package BeanFactoryLifeCycle;

import java.beans.PropertyDescriptor;

import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;

public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter{
	//接口方法,在实例化之前调用
	public Object postProcessBeforeInstantiation(Class beanClass, String beanName) throws BeansException{
		
		//对容器中Bean进行处理
		if("car".equals(beanName)){
			System.out.println("InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation");
		}
		return null;
		
	}
	//接口方法,在实例化之后调用
	public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException{
		
		//对容器中Bean进行处理
		if("car".equals(beanName)){
			System.out.println("InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation");
		}
		return true;
		
	}
	//接口方法,在设置某个属性时调用
	public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds,Object bean, String beanName) throws BeansException{
		//仅对容器中Bean进行某个特定属性处理,还可以通过pdst入参进行过滤
		if("car".equals(beanName)){
			System.out.println("InstantiationAwareBeanPostProcessor.postProcessPropertyValues");
		}
		return pvs;
		
	}
	
}

MyInstantiationAwareBeanPostProcessor通过扩展InstantiationAwareBeanPostProcessor适配器InstantiationAwareBeanPostProcessorAdapter提供实现。在MyInstantiationAwareBeanPostProcessor中,通过过滤条件仅对car Bean进行处理,而对其他Bean一概不做处理。
此外,提供了一个BeanPostProcessor实现类,在该实现类中,只对car Bean进行处理,对配置文件所提供的属性设置值进行判断,做到补缺补漏。

package BeanFactoryLifeCycle;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

import Car.Car;

public class MyBeanPostProcessor implements BeanPostProcessor {

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName)
			throws BeansException {
		if(beanName.equals("car")){
			Car car = (Car)bean;
			if(car.getMaxSpeed()>=200){
				System.out.println("调用BeanPostProcessor.postProcessBeforeInitialization(),maxSpeed为200");
				car.setMaxSpeed(199);
				}
		}
		return bean;
	}

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName)
			throws BeansException {
		if(beanName.equals("car")){
			Car car = (Car)bean;
			if(car.getColor()==null){
				System.out.println("调用BeanPostProcessor.postProcessAfterInitialization(),color为空,设置默认为黑色");
				car.setColor("黑色");
				}
		}
		return bean;		
	}

}

在MyBeanPostProcessor中postProcessAfterInitialization()、postProcessBeforeInitialization()这两个方法便是对我们所设置的bean进行查缺补漏,若触发条件,便会进行处理。

package BeanFactoryLifeCycle;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

import Car.Car;

public class BeanLifeCycle {
	
	private static void LifeCycleInBeanFactory(){
		
		Resource res = new ClassPathResource("BeanFactoryLifeCycle/beans.xml");
		BeanFactory bf = new XmlBeanFactory(res);
		//向容器中注册MyBeanPostProcessor和MyInstantiationAwareBeanPostProcessor后处理器
		((ConfigurableBeanFactory)bf).addBeanPostProcessor(new MyBeanPostProcessor());
		((ConfigurableBeanFactory)bf).addBeanPostProcessor(new MyInstantiationAwareBeanPostProcessor());
		
		Car car1 = (Car)bf.getBean("car");
		car1.introduce();
		car1.setColor("红色");
		
		Car car2 = (Car)bf.getBean("car");
		
		System.out.println("car1==car2:"+(car1==car2));
		
		((XmlBeanFactory)bf).destroySingletons();
		
	
	}	
	public static void main(String[] args) {
		LifeCycleInBeanFactory();
	}

}

装载了配置文件并启动容器并且向容器中注册MyBeanPostProcessor和MyInstantiationAwareBeanPostProcessor后处理器。后处理器的实际调用顺序与注册顺序是无关的,在具有多个后处理器的情况下,可通过org.springframework.core.Ordered接口以确定调用顺序。

配置文件:

运行结果:


从整个运行结果看出,通过getBean()调用某个Bean后调用了InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation()方法→实例化→InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation()方法→
InstantiationAwareBeanPostProcessor的postProcessPropertyValues()方法→设置属性值→调用BeanNameAware的setBeanName()方法→调用BeanFactoryAware的setBeanFactory()方法→调用BeanPostProcessor的postProcessBeforeInitialization()方法→调用InitializingBean的afterPropertiesSet()方法→通过init-method属性配置的初始化方法→调用BeanPostProcessor的postProcessAfterInitialization()方法→【singleton】Spring缓存池中准备就绪的Bean→调用DisposableBean的destroy()方法→通过destroy-method属性配置的销毁方法。

如果Bean的作用范围定义为scope=“prototype”,则第二次getBean()时,生命周期方法会再次调用,因为prototype范围的Bean每次都返回新的实例。

ApplicationContext中的Bean的生命周期

Bean在应用上下文的生命周期与BeanFactory中生命周期类似,不同的是,如果Bean实现了org.springframework.context.ApplicationContextAware接口会增加一个调用该接口方法setApplicationContext()的步骤。
此步骤加在BeanFactoryAware.setBeanFactory()→调用BeanPostProcessor.postProcessBeforeInitialization()之间。工厂后处理器是容器级的,仅在应用上下文初始化时调用一次,其目的是完成一些配置文件的加工处理工作。
ApplicationContext和BeanFactory另一个最大的不同之处在于,前者会利用Java反射机制自动识别出配置文件中定义的InstantiationAwareBeanPostProcessorBeanPostProcessorBeanFactoryPostProcessor,并自动将它们注册到上下文中,而后者需要在代码中通过手工调用addBeanPostProcessor()方法进行注册。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值