花了一下午的時間,整理測試了一下Bean的生命週期行爲.
java
首先排一個序。完整的測試代碼後面貼出來。
spring
加載當前Bean的構造器
ide
加載@Autowired注入的依賴關係的構造器。(也就是加載依賴的Bean)post
加載普通的依賴Bean構造器(<property name="person" ref="person"/>)測試
注入依賴關係(<property name="person" ref="person"/>)this
執行@PostConstruct註解的方法spa
執行afterPropertiesSet code
執行 init-methodcomponent
執行 服務邏輯xml
執行@PreDestroy註解(須要銷燬Bean纔會執行)
執行destroy(須要銷燬Bean纔會執行)
執行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>
執行結果: