Spring源碼之路-DefaulListableBeanFactory
總結
- 這個接口比較簡單,主要是擴展自接口
{org.springframework.beans.factory.BeanFactory}
,在BeanFactory的基礎之上增加了支持父子容器的擴展。
- 父子容器我們在用web.xml配置spring的時候,大部分都是用過,比如我們在裏面配置了一個
<listener>
<listenre-class>org.springframework.web.context.ContextLoaderListener</listenre-class>
</listener>
<servlet>
<servlet-name>SpringMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
這個配置其實就是配置兩個spring的容器,由listener創建的容器爲父容器,由servlet創建的容器爲字容器,子容器可以訪問父容器的實例,而父容器不能訪問子容器的實例。
源碼註釋的大概翻譯
/**
* 支持分層的BeanFactory
*
* 可以在ConfigurableBeanFactory接口中找到用於bean
* 工廠的相應{@code setParentBeanFactory}方法,
* 該方法允許以可配置的方式設置父對象。
*
* spring中父子容器的核心,在web.xml中配置的 一個是通過Listener加載的
* 一個是通過Servlet加載的,這個時候的兩個BeanFactory是由父子關係的
* @author Rod Johnson
* @author Juergen Hoeller
* @since 07.07.2003
* @see org.springframework.beans.factory.config.ConfigurableBeanFactory#setParentBeanFactory
*/
public interface HierarchicalBeanFactory extends BeanFactory {
/**
* 返回父beanFactory,如果沒有,則返回{@code null}。
*/
@Nullable
BeanFactory getParentBeanFactory();
/**
* 返回本地beanFactory是否包含給定名稱的bean,
* 而忽略在祖先上下文中定義的bean。
* <p>這是{@code containsBean}的替代方法,
* 忽略了祖先bean工廠中具有給定名稱的bean
* @param name 要查詢的bean的名稱
* @return 返回是否在本地工廠中定義了具有給定名稱的bean
* @see BeanFactory#containsBean
*/
boolean containsLocalBean(String name);
}