zoukankan      html  css  js  c++  java
  • spring中bean的生命周期

    1. Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化

    2. Bean实例化后对将Bean的引入和值注入到Bean的属性中

    3. 如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法

    4. 如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入

    5. 如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来。

    6. 如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法。

    7. 如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用

    8. 如果Bean 实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法。

    9. 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。

    10. 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用

    代码实现:

    public class Book implements BeanNameAware,BeanFactoryAware,
    ApplicationContextAware,InitializingBean,DisposableBean {

    private String bookName;
    public Book(){
    System.out.println("Book Initializing ");
    }

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
    System.out.println("Book.setBeanFactory invoke");
    }

    public void setBeanName(String name) {
    System.out.println("Book.setBeanName invoke");
    }

    public void destroy() throws Exception {
    System.out.println("Book.destory invoke");
    }

    public void afterPropertiesSet() throws Exception {
    System.out.println("Book.afterPropertiesSet invoke");
    }

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    System.out.println("Book.setApplicationContext invoke");
    }

    public String getBookName() {
    return bookName;
    }

    public void setBookName(String bookName) {
    this.bookName = bookName;
    System.out.println("setBookName: Book name has set.");
    }

    public void myPostConstruct(){
    System.out.println("Book.myPostConstruct invoke");
    }

    // 自定义初始化方法
    @PostConstruct
    public void springPostConstruct(){
    System.out.println("@PostConstruct");
    }

    public void myPreDestory(){
    System.out.println("Book.myPreDestory invoke");
    System.out.println("---------------destroy-----------------");
    }

    // 自定义销毁方法
    @PreDestroy
    public void springPreDestory(){
    System.out.println("@PreDestory");
    }

    @Override
    protected void finalize() throws Throwable {
    System.out.println("------inside finalize-----");
    }
    }

    自定义实现BeanPostProcessor 的MyBeanPostProcessor:

    public class MyBeanPostProcessor implements BeanPostProcessor {

    // 容器加载的时候会加载一些其他的bean,会调用初始化前和初始化后方法
    // 这次只关注book(bean)的生命周期
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    if(bean instanceof Book){
    System.out.println("MyBeanPostProcessor.postProcessBeforeInitialization");
    }
    return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    if(bean instanceof Book){
    System.out.println("MyBeanPostProcessor.postProcessAfterInitialization");
    }
    return bean;
    }
    }

    在resources 目录下新建Bean-Lifecycle.xml:

    <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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 扫描bean -->
    <context:component-scan base-package="com.bean.lifecycle"/>

    <!-- 实现了用户自定义初始化和销毁方法 -->
    <bean id="book" class="com.bean.lifecycle.Book" init-method="myPostConstruct" destroy-method="myPreDestory">
    <!-- 注入bean 属性名称 -->
    <property name="bookName" value="thingking in java" />
    </bean>

    <!--引入自定义的BeanPostProcessor-->
    <bean class="com.bean.lifecycle.MyBeanPostProcessor"/>

    </beans>

    测试类:

    public class SpringBeanLifecycleApplication {

    public static void main(String[] args) throws InterruptedException {
    // 为面试而准备的Bean生命周期加载过程
    ApplicationContext context = new ClassPathXmlApplicationContext("Bean-Lifecycle.xml");
    Book book = (Book)context.getBean("book");
    System.out.println("Book name = " + book.getBookName());
    ((ClassPathXmlApplicationContext) context).destroy();

    }

    }

    结果:

    Book Initializing
    setBookName: Book name has set.
    Book.setBeanName invoke
    Book.setBeanFactory invoke
    Book.setApplicationContext invoke
    MyBeanPostProcessor.postProcessBeforeInitialization
    @PostConstruct
    Book.afterPropertiesSet invoke
    Book.myPostConstruct invoke
    MyBeanPostProcessor.postProcessAfterInitialization
    Book name = thingking in java

    @PreDestory
    Book.destory invoke
    Book.myPreDestory invoke
    ---------------destroy-----------------

  • 相关阅读:
    C# 使用微软的Visual Studio International Pack 类库提取汉字拼音首字母
    .net简单录音和播放音频文件代码
    一个简单的小例子让你明白c#中的委托-终于懂了!
    你是高级程序员?那就来挑战一下!
    .NET中的三种Timer的区别和用法
    C#中判断空字符串的3种方法性能分析
    解决statusStrip控件上的项目不能靠右对齐的问题
    C#的WebBrowser操作frame如此简单
    Python学习---Python安装与基础1205
    Java学习---IKAnalyzer中文分词器V2012_FF使用手册
  • 原文地址:https://www.cnblogs.com/blackdd/p/12522397.html
Copyright © 2011-2022 走看看