在傳統的Java應用中,bean的生命周期很簡單。使用Java關鍵字new進行bean實例化,然后bean就可以被使用了,一旦該bean不再使用,Java就自動進行垃圾回收。然而,在Spring中,bean的生命周期就比較復雜了。下面是一個bean裝載到Spring應用上下文的過程:
如圖所示:在你準備調用bean之前,bean工廠執行了若干啟動步驟:
1.Spring對bean進行實例化;
2.Spring將值和bean的引用注入到bean對應的屬性中;
3.如果bean實現了BeanNameAware接口,Spring將bean的ID傳遞給setBean-Name()方法;
4.如果bean實現了BeanFactoryAware接口,Spring將調用setBeanFactory()方法,將BeanFactory容器實例傳入;
5.如果bean實現了ApplicationContextAware接口,Spring將調用setApplicationContext()方法,將bean所在的應用上下文的引用傳入進來;
6.如果bean實現了BeanPostProcessor接口,Spring將調用它們的post-ProcessBeforeInitialization()方法;
7.如果bean實現了InitializingBean接口,Spring將調用它們的after-PropertiesSet()方法。類似地,如果bean使用initmethod聲明了初始化方法,該方法也會被調用;
8.如果bean實現了BeanPostProcessor接口,Spring將調用它們的post-ProcessAfterInitialization()方法;
9.此時,bean已經準備就緒,可以被應用程序使用了,它們將一直駐留在應用上下文中,直到該應用上下文被銷毀;
10.如果bean實現了DisposableBean接口,Spring將調用它的destroy()接口方法。同樣,如果bean使用destroy-method聲明了銷毀方法,該方法也會被調用。
一,創建可以被發現的Bean
在廚師的眼中,一套好的刀是必不可少的,它能夠將平淡的食物素材加工成精致的藝術品。
1
2
3
4
5
6
|
package cooking; public interface knife{ void cut(); } |
現在,我們創建一個名為knife(刀)的接口,它擁有cut(切)的功能。接下來我們實現這個接口
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package cooking @Component public class beef implements knife{ private int weight = 2 ; private double price = 32.1 ; public void cut(){ System.out.println(“This is perfect beef”,+“weight:”+weight +“kg”+“,”+“It's price is”+price+ "$" ); } } |
請注意,我們在beef類上使用了@Component注解。這個簡單的注解表明 該類是一個組件類,并告訴Spring要為這個類創建bean。
在默認情況下,組件掃描是不啟用的,我們需要顯示配置一下Spring,命令Spring去尋找帶有@Component注解的類,并為其創建bean
1
2
3
4
5
6
7
8
|
package cooking @Configuration @ComponentScan public class knifeConfig{ } |
注意到,在knifeConfig類上加上了@ComponentScan注解,該注解能夠在Spring中開啟組件掃描,如果沒有其他配置的話,@ComponentScan默認會掃描與配置類相同的包,去查找帶有@Component的注解類,并在Spring中自動為其創建一個bean。如果你更傾向于使用XML來啟用組件掃描的話,那么可以使用Spring context命名空間的<context:component-scan>元素。
<context:component-scan base-package="cooking"/> 該標簽會開啟組件掃描,去cooking包下尋找帶有@Component的注解類。
以上就是Spring中Bean的使用方法,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://www.cnblogs.com/Dantes-Tang/p/7289362.html