Spring框架系列(三)--Bean的作用域和生命周期


Bean的作用域

Spring應用中,對象實例都是在Container中,負責創建、裝配、配置和管理生命周期(new到finalize())

Spring Container分為兩種:

  1、BeanFactory:提供DI支持

  2、ApplicationContext:基於BeanFactory構建,提供應用框架級別的服務

ApplicationContext實現類

  1、AnnotationConfigApplicationContext:從一個或多個基於Java的配置類中加載Spring應用上下文

  2、AnnotationConfigWebApplicationContext:從一個或多個基於Java的配置類中加載Spring Web應用上下文

  3、ClassPathXmlApplicationContext:從類路徑下的一個或多個XML配置文件中加載上下文定義,把應用上下文的定義文件作為類資源

  4、FileSystemXmlapplicationcontext從文件系統下的一個或多XML配置文件中加載上下文定義

  5、XmlWebApplicationContext:從Web應用下的一個或多個XML配置文件中加載上下文定義

加載上下文的方式都很相似:都是直接new。例如:ApplicationContext applicationContext = new ClassPathXmlApplicationContext

("applicationContext.xml"); 之后就是調用應用上下文的getBean()獲取bean

Spring作用域:

  1、單例Singleton:在整個應用中,只創建bean的一個實例,在IOC容器中共享,容器創建的時候就實例化了這個bean

  2、原型Prototype:每次注入或者通過Spring應用上下文獲取的時候,都會創建一個新的bean實例,相當於每次都new bean(),容器創建的

時候沒有實例化了bean,而是請求獲取的時候才會創建對象

  3、會話Session:只是在Web應用中,為每個http session創建一個bean實例

  4、請求Rquest:只是在Web應用中,為每個http請求創建一個bean實例,這個bean實例只在當前request請求內有效,請求結束的時候,這個

bean實例被銷毀

  5、全局會話GlobalSession:只是在Web應用中使用,僅在使用portlet context的時候有效

1、Singleton:

默認為Singleton,對於無狀態的bean可以使用單例,如果使用非單例,通過@Scope設置

無狀態Bean:

  無狀態是指沒有成員變量,例如service、dao,雖然service里面有dao,但是dao是沒有狀態的

  有狀態是指有成員變量,例如controller內部一般有類似UserDTO的有狀態bean,所以一般使用prototype

容器實例化的時候就會初始化bean,可以通過lazy-init="true"/@Lazy設置延遲加載,當第一次獲取bean的時候進行初始化

@Lazy(true)
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class Student {    }

2、Prototype:

scope使用Prototype,默認懶加載,即等到獲取bean的時候進行初始化,而不是容器實例化的時候

當容器關閉的時候,destroy()不會被執行

Bean的生命周期

流程:

  1、Spring對bean進行實例化

  2、Spring將值和bean的引用注入到bean對應的屬性中

  3、如果bean實現了BeanNameAware接口, Spring將bean的ID傳遞給setBeanName()

  4、如果bean實現了BeanFactoryAware接口, Spring將調用setBeanFactory(),將BeanFactory容器實例傳入

  5、如果bean實現了ApplicationContextAware接口, Spring將調用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將調用它的destroy()接口方法。同樣,如果bean使用destroy-method聲明了

毀方法,該方法也會被調用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM