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聲明了
銷毀方法,該方法也會被調用