BeanFactory與FactoryBean
Spring定義了兩個與Bean生産相關的接口,他們分别是BeanFactory和FactoryBean。
這兩個接口的實作都可以生産bean對象,那麼他們有什麼不一樣呢?
BeanFactory:以Factory結尾,表示它是一個工廠類,是用于管理Bean的一個工廠。
FactoryBean: 以Bean結尾,表示它隻是一個普通的bean,具備自己生産自己的能力。
Spring在初始化對象時通過這兩個接口的實作類來完成,其中Spring底層通過BeanFactory來實作。
如果我們需要通過自己的方式向Spring容器中注入對象,那麼我們可以選擇有以下幾種選擇:
方式一:實作一個簡單的bean,然後通過配置檔案或者注解注入Spring容器;
方式二:實作一個bean,并且實作FactoryBean接口,然後通過配置檔案注入;
其中,方式一實際采用的就是BeanFactory方式初始化并添加到Spring容器中的,而方式二則采用的是FactoryBean的方式初始化并添加到Bean容器中。
很顯然,通過方式二實作getObject方法時,我們可以添加一些必要的業務邏輯,并且根據需要進行靈活的變通,是以,我們在面臨這種需要添加業務邏輯或者需要靈活變通的情況時就可以選擇使用FactoryBean來向Spring容器中添加對象。
FactoryBean示例
接下來,我們借用Shiro過濾器注入Spring容器的例子來介紹FactoryBean的使用過程。
Shiro的認證與授權均需要通過過濾器來完成,是以Shiro如果需要讓Spring來管理Shiro的過濾器,那麼就需要将過濾器注入Spring容器中。是以Shiro定義了一個ShiroFilterFactoryBean類,并且實作了接口FactoryBean,此時ShiroFilterFactoryBean就可以通過實作getObject方法來向Spring容器中注入對象。
步驟一:實作一個bean,并且實作接口FactoryBean
步驟二:實作FactoryBean的方法getObejct
第三步:在Spring配置檔案中添加bean
備注:配置檔案中定義的shiroFilter并非ShiroFilterFactoryBean示例,而是其getObject方法傳回的執行個體,也就是SpringShiroFilter類的執行個體對象。