bean的創建
-
bean 的創建有三種方式,xml,javaConfig 和自動掃描;
-
bean 的作用域,有 Singleton,Prototype,Session,Request,默認是 Singleton;
-
如果需要使用 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的依賴管理
-
@Autowired 是按類型注入的,如果 classpath 中類型有重複,可以使用 @Qualifier 來指定名稱;
-
@Resource 是按名稱注入的,名稱是 @Bean 的方法名,如果 @Component 或 @Service 修飾的 bean,beanName 默認是首字符小寫的類名;
-
通過 @Autowired private ApplicationContext applicationContext 可以自動注入上下文,不需要 bean 實現ApplicationContextAware 接口;
-
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的生命週期
-
bean 的生命週期,包括創建,使用,銷燬整個過程;
-
首先 xml 或註解形式的 bean,被轉化成 beanDefination 對象;
-
容器初始化之後,會執行 BeanFactoryPostProcessor 的 postProcessBeanFactory 方法;
-
如果 bean 實現了 BeanNameAware,BeanFactoryAware,或者 ApplicationContextAware 接口,會執行其setBeanName(String beanId),setBeanFactory(BeanFactory),setApplicationContext(ApplicationContext) 方法,使得 bean內部可以訪問其自身的 beanName,ioc容器,應用上下文;
-
如果上下文中存在實現 BeanPostProcessor 的 bean,會調用其 postProcessBeforeInitialization 方法,在 bean 構造之前,執行一些邏輯;
-
如果上下文中存在實現 InitializingBean 接口的 bean,會調用其 afterPropertiesSet() 方法;
-
如果某個 bean 配置了 init-method 屬性,那麼會調用其 init-method 指定的方法;
-
根據 beanDefination 完成類加載,構造,注入;
-
如果有實現 BeanPostProcessor 接口的 bean,將調用其 postAfterInitialization 方法,這就完成了整個 bean 的實例化;
bean 的銷燬
- 首先執行 @PreDestroy 修飾的方法,然後執行實現 DisposableBean 的 destory 方法,最後執行 @Bean 配置的 destory-method 指定的方法;