Spring基礎課三:bean 的生命週期管理

bean的創建

  1. bean 的創建有三種方式,xml,javaConfig 和自動掃描;

  2. bean 的作用域,有 Singleton,Prototype,Session,Request,默認是 Singleton;

  3. 如果需要使用 request 或者 session 作用域的 bean,只指定 scope 的 value,是不夠的,還需要指定 proxyMode,因爲假設 beanA 是單例的,依賴於 request 的 beanB,那麼 beanA 只會被構造和注入一次,而 beanB 是每個 request,構建一次,所以就不知道如何注入,聲明 proxyMode 後,注入 beanB ,就是通過代理類;

	// 使用 request 的作用域,還需要 RequestContextLoaderListener
	@Component
	@Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode= 		 
		ScopeProxyMode.INTERFACES/ScopeProxyMode.TARGET_CLASS CGLIB)

bean的依賴管理

  1. @Autowired 是按類型注入的,如果 classpath 中類型有重複,可以使用 @Qualifier 來指定名稱;

  2. @Resource 是按名稱注入的,名稱是 @Bean 的方法名,如果 @Component 或 @Service 修飾的 bean,beanName 默認是首字符小寫的類名;

  3. 通過 @Autowired private ApplicationContext applicationContext 可以自動注入上下文,不需要 bean 實現ApplicationContextAware 接口;

  4. spring profile 可以根據不同的參數注入不同的 bean,達到多環境的差異化配置,與 maven 的 profile 不同,maven 是在構建 war 包時,進行替換,而 spring profile 是運行時生效,通過 application.properties 中的 spring.profiles.active 和spring.profiles.default 屬性(spring.profiles.active優先級更高),如果都沒有設置,就不會創建定義在 @Profile 下的 bean;

	@Configuration
	class SpringApplicationCtx{
	    @Bean
	    @Profile("dev")
	    public DataSource dataSource(){
	        return new("開發數據庫")}
	    @Bean
	    @Profile("test")
	    public DataSource dataSource(){
	       return new("測試數據庫")}
	}

bean的生命週期

  1. bean 的生命週期,包括創建,使用,銷燬整個過程;

  2. 首先 xml 或註解形式的 bean,被轉化成 beanDefination 對象;

  3. 容器初始化之後,會執行 BeanFactoryPostProcessor 的 postProcessBeanFactory 方法;

  4. 如果 bean 實現了 BeanNameAware,BeanFactoryAware,或者 ApplicationContextAware 接口,會執行其setBeanName(String beanId),setBeanFactory(BeanFactory),setApplicationContext(ApplicationContext) 方法,使得 bean內部可以訪問其自身的 beanName,ioc容器,應用上下文;

  5. 如果上下文中存在實現 BeanPostProcessor 的 bean,會調用其 postProcessBeforeInitialization 方法,在 bean 構造之前,執行一些邏輯;

  6. 如果上下文中存在實現 InitializingBean 接口的 bean,會調用其 afterPropertiesSet() 方法;

  7. 如果某個 bean 配置了 init-method 屬性,那麼會調用其 init-method 指定的方法;

  8. 根據 beanDefination 完成類加載,構造,注入;

  9. 如果有實現 BeanPostProcessor 接口的 bean,將調用其 postAfterInitialization 方法,這就完成了整個 bean 的實例化;

bean 的銷燬

  1. 首先執行 @PreDestroy 修飾的方法,然後執行實現 DisposableBean 的 destory 方法,最後執行 @Bean 配置的 destory-method 指定的方法;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章