spring Bean實例生命週期行爲

    花了一下午的時間,整理測試了一下Bean的生命週期行爲.
java

    首先排一個序。完整的測試代碼後面貼出來。
spring

  1. 加載當前Bean的構造器    
    ide

  2. 加載@Autowired注入的依賴關係的構造器。(也就是加載依賴的Bean)post

  3. 加載普通的依賴Bean構造器(<property name="person" ref="person"/>)測試

  4. 注入依賴關係<property name="person" ref="person"/>this

  5. 執行@PostConstruct註解的方法spa

  6. 執行afterPropertiesSet    code

  7. 執行 init-methodcomponent

  8. 執行 服務邏輯xml

  9. 執行@PreDestroy註解(須要銷燬Bean纔會執行)

  10. 執行destroy(須要銷燬Bean纔會執行)     

  11. 執行destroy-method(須要銷燬Bean纔會執行

    通常實際生產都採用零配置,爲了測試經過XML加載指定Bean。

代碼 :

Car.java 依賴Bean,經過@Autowired注入House實力

package com.peach.springtest.model;

public class Car {

    public Car() {
        System.out.println("Test car constructor");
    }

}

House.java 主Bean

package com.peach.springtest.model;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;


public class House implements InitializingBean, DisposableBean {

    private Person person;

    @Autowired
    private Car car;

    public House() {
        System.out.println("Test house Constructor");
    }

    public void status() {
        System.out.println("There is one person and one car");
    }

    @Autowired

    public void setPerson(Person person) {
        System.out.println("Test House setPerson");
        this.person = person;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("Test house afterPropertiesSet");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("Test house postConstruct");
    }

    public void initMethod() {
        System.out.println("Test house initMethod");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("Test house preDestroy");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("Test house destroy");
    }

    public void destroyMethod() {
        System.out.println("Test house destroyMethod");
    }
}

Person.java 經過XML property ref 注入到House實力

package com.peach.springtest.model;

public class Person {

    public Person() {
        System.out.println("Test Person constructor");
    }

}

SpringDriver.java  加載spring 容器

package com.peach.springtest;

import com.peach.springtest.model.House;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringDriver {

    public static void main(String[] args) {
        AbstractApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        House house = (House) context.getBean("house");
        house.status();
        context.registerShutdownHook();
    }
}

ApplicationContext.xml  

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-4.2.xsd">

    <!--<context:component-scan base-package="com.peach.springtest.*"/>-->

    <context:annotation-config />
    <bean id="house" class="com.peach.springtest.model.House" init-method="initMethod" destroy-method="destroyMethod">
        <property name="person" ref="person"/>
    </bean>
    <bean id="person" class="com.peach.springtest.model.Person"/>
    <bean id="car" class="com.peach.springtest.model.Car"/>

</beans>


執行結果:

相關文章
相關標籤/搜索