Spring学习(四)
bean的生命周期(完整过程):
- 实例化:当我们的程序加载配置文件,把bean实例化到内存(要求bean的scope="singleton")
- 调用set方法设置属性
- 如果实现了BeanNameAware接口,则可以通过setBeanName获取id号
- 如果实现了BeanFactoryAware接口,则可以获取beanFactory
- 如果实现了ApplicationContextAware接口,则可以获取ApplicationContext
- 如果一个bean关联了BeanPostProcessor(后置处理器),则会调用后置处理器的ObjectPostProcessBeforeInitialization()方法
- 如果实现了InitializingBean接口,则会调用afterPropertiesSet()方法
- 调用定制的初始化方法(需要在配置的bean中配置init-method方法,并且需要在bean中实现这个方法)
- 调用后置处理器的ObjectPostProcessAfterInitialization()方法
- 如果实现了DisposableBean接口,则会调用destory()方法
- 调用定制的销毁方法(需要在配置的bean中配置destory-method方法,并且需要在bean中实现这个方法
我们常用的过程:实例化-注入属性-使用bean-容器关闭-销毁
实体类:
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; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class User implements BeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean,DisposableBean{ private String username; public User(){ System.out.println("User的构造方法被调用!"); } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; System.out.println("User的set方法被调用!"); } public void sayHi(){ System.out.println("hi," + username); } @Override public void setBeanName(String arg0) { // TODO Auto-generated method stub System.out.println("实现BeanNameAware接口的setBeanName方法!!!" + arg0); } @Override public void setBeanFactory(BeanFactory arg0) throws BeansException { // TODO Auto-generated method stub System.out.println("实现BeanFactoryAware接口的setBeanFactory方法!!!" + arg0); } @Override public void setApplicationContext(ApplicationContext arg0) throws BeansException { // TODO Auto-generated method stub System.out.println("实现ApplicationContextAware接口的setApplicationContext方法!!!"); } @Override public void afterPropertiesSet() throws Exception { // TODO Auto-generated method stub System.out.println("实现了InitializingBean接口的afterPropertiesSet方法!!!"); } public void init(){ System.out.println("自定义的init方法!!!"); } @Override public void destroy() throws Exception { // TODO Auto-generated method stub System.out.println("实现了DisposableBean接口的destroy方法!!!"); } }
自定义后置处理器:
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 { // TODO Auto-generated method stub System.out.println("关联后置处理器调用的postProcessAfterInitialization方法!!!" + arg1); return arg0; } @Override public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException { // TODO Auto-generated method stub System.out.println("关联后置处理器调用的postProcessBeforeInitialization方法!!!" + arg1); return arg0; } }
applicationContext.xml:
<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="user" class="com.bdqn.pojo.User" init-method="init"> <property name="username" value="张三" /> </bean> <bean id="MyBeanPostProcessor" class="com.bdqn.pojo.MyBeanPostProcessor"></bean> </beans>
测试类代码:
import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.bdqn.pojo.User; public class AppTest { @Test public void showUser(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); User user = (User) context.getBean("user"); user.sayHi(); } }
执行结果:
这是通过ClassPathXmlApplicationContext的方法实现的
那么,如果通过bean工厂方式实现,bean的生命周期如下:
实现代码:
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); User user = (User) factory.getBean("user"); user.sayHi();
运行结果如下:
和应用上下文实例化相比,用bean工厂创建的生命周期更简单