Spring規定所有的IOC容器都必須實現BeanFactory接口,
BeanFactory是一個頂級的容器接口。
BeanFactory
BeanFactory裏有一個特殊的屬性,String FACTORY_BEAN_PREFIX = "&";
這個用來獲取FactoryBean本身的實例。注意FactoryBean和BeanFactory是完全不一樣的兩個東西 。
BeanFactory是容器的頂級 接口,定義了Bean工廠的一些操作方法。比如根據名字獲取實例,根據類型獲取實例==。
而FactoryBean也是一個接口,實現該接口的類實現 getObject
方法來 生成一個Bean.工廠類也是一個類,他的作用是用來生成我們需要的其他的類,而不是注入到其他地方。
Spring在初始化的時候,會把這個接口的實現類給取出來,調用getObject
來生成我們想要的Bean.
例子 :
public class UserFactoryBean implements FactoryBean<User> {
@Override
public User getObject() throws Exception {
return new User();
}
@Override
public Class<?> getObjectType() {
return User.class;
}
}
<bean class="com.fuyouj.model.factory.UserFactoryBean" id="userFactoryBean"></bean>
可以看到,使用了轉義字符的名稱獲取到的是工程類的本身。
BeanFactory的繼承體系
ListableBeanFactory
正如該接口的名字表達的意思,該接口定義了一列表的形式提供Bean的相關信息,這個接口最大的特點就是可以批量列出工長生產的實例信息 。
方法getBeanDefinitionCount
獲取該容器內註冊的Bean的總數,getBeanDefinitionNames
獲取BeanDefinition名字的集合==。
HierarchicalBeanFactory
此接口使得容器具備層次的關係
簡單的兩個方法,一個是返回本工廠的父工廠,一個是在本層級內查找是否有某個Bean.
實現了本 接口的容器可以在應用中起多個BeanFactory,並且可以設置父子關係關聯起來。這樣子就可以很好地適配三層架構,比如可以 讓A容器管理控制層的Bean,B容器管理業務層的Bean.然後通過層級關係關聯起來。
AutowireCapableBeanFactory
賦予了容器具備自動裝配Bean的能力(自動滿足Bean之間的依賴)
裏面定義了5種常量,
我們使用的最多的就是現成的@Autowired標籤,該註解最終注入的方式是通過 resolveDependency
來實現的依賴注入。而該接口裏面定義的5中常量對應着我們日常使用注入的幾種方式。
DefaultListableBeanFactory
DefaultListableBeanFactory是真正第一個可以獨立運行的IOC容器
實現了BeanDefinitionRegistry接口,顧名思義,可以註冊BeanDefinition.
在本類中,有一個醒目的成員變量。BeanDefinitionMap,存放的是本容器內BeanDefinition