Spring学习(四)

bean的生命周期(完整过程):

  1. 实例化:当我们的程序加载配置文件,把bean实例化到内存(要求bean的scope="singleton")
  2. 调用set方法设置属性
  3. 如果实现了BeanNameAware接口,则可以通过setBeanName获取id号
  4. 如果实现了BeanFactoryAware接口,则可以获取beanFactory
  5. 如果实现了ApplicationContextAware接口,则可以获取ApplicationContext
  6. 如果一个bean关联了BeanPostProcessor(后置处理器),则会调用后置处理器的ObjectPostProcessBeforeInitialization()方法
  7. 如果实现了InitializingBean接口,则会调用afterPropertiesSet()方法
  8. 调用定制的初始化方法(需要在配置的bean中配置init-method方法,并且需要在bean中实现这个方法)
  9. 调用后置处理器的ObjectPostProcessAfterInitialization()方法
  10. 如果实现了DisposableBean接口,则会调用destory()方法
  11. 调用定制的销毁方法(需要在配置的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工厂创建的生命周期更简单

posted @ 2017-12-13 16:34  酒肉穿肠过I  阅读(204)  评论(0编辑  收藏  举报