Spring bean生命周期---ApplicationContext

时间:2021-01-30 14:42:51

可以先看看以下几篇博客:
http://blog.csdn.net/zsm653983/article/details/8129064
http://mislay.iteye.com/blog/364698
http://blog.csdn.net/kkdelta/article/details/7282782

首先来看看一张spring Bean的生命周期图:
https://img-blog.csdn.net/20151110115123339
配置信息:
https://img-blog.csdn.net/20151110115241245
其他代码:

package com.xll;

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.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class Student implements BeanNameAware,BeanFactoryAware , ApplicationContextAware{

	private String mark;
	private String name;
	
	public Student(){
		System.out.println("实例化Student");
	}

	public String getMark() {
		return mark;
	}

	public void setMark(String mark) {
		this.mark = mark;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	public void init(){
		System.out.println("初始化Student");
	}
	@Override
	public void setBeanName(String beanName) {
		System.out.println(beanName);
	}
	@Override
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		System.out.println(beanFactory);
		
	}
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		System.out.println(applicationContext);
	}
	public void close(){
		System.out.println("关闭所有资源!");
	}
}

    package com.xll;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanDefinition;
    import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
    import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
    public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor{
    	@Override
    	public void postProcessBeanFactory(ConfigurableListableBeanFactory bf) throws BeansException {
    		BeanDefinition bd = bf.getBeanDefinition("student");
    		bd.getPropertyValues().addPropertyValue("mark", "A");
    		System.out.println("调用MyBeanFactoryPostProcessor.postProcessBeanFactory()方法");
    	}
    }

package com.xll;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
	@Override
	public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {
		System.out.println("调用MyBeanPostProcessor.postProcessAfterInitialization()方法:" + arg1);
		return arg0;
	}
	@Override
	public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {
		System.out.println("调用MyBeanPostProcessor.postProcessBeforeInitialization()方法:" + arg1);
		return arg0;
	}
}

package com.xll;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {		
	public static void main(String[] args){
		ApplicationContext acc = new ClassPathXmlApplicationContext("ApplicationContext.xml");
		Student stu = (Student)acc.getBean("student");
		System.out.println(stu.getMark());
		((ClassPathXmlApplicationContext) acc).close();
	}
}

如果scope=”prototype”最后是不会触发close()方法调用的,并且((ClassPathXmlApplicationContext) acc).close();这句话是引起close()方法被调用的关键