可以先看看以下几篇博客:
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()方法被调用的关键