接下来,我们挨个对出现的类做个介绍:
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String name) throws BeansException;
T getBean(String name, Class requiredType) throws BeansException;
T getBean(Class requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
T getBean(Class requiredType, Object... args) throws BeansException;
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class> targetType) throws NoSuchBeanDefinitionException;
Class> getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}
BeanFactory基类,包括以下成员:
String FACTORY_BEAN_PREFIX = "&"; 一个常量成员,用来解引用一个FactoryBean实例,和区分由FactoryBean创建的一系列bean(解引用的含义可以参考C++编程思想一书,这里不做介绍),例如一个FactoryBean A, 那么获取&A拿到的就是工厂而不是bean实例。
Object getBean(String name) throws BeansException; 按名字获取bean实例
Object getBean(String name, Object... args) throws BeansException; 按名字和显示声明的参数来创建实例,注意显示声明的参数是用来创建原型的
boolean containsBean(String name);bean工厂是否含有名为name的bean
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;bean是否是单例
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;bean是否是原型
boolean isTypeMatch(String name, Class> targetType) throws NoSuchBeanDefinitionException;名为name的bean的类类型是否是targetType
String[] getAliases(String name);获取所有bean的所有依赖,详见spring的配置文件
接下来是它的主要的两个子接口之一HierarchicalBeanFactory,字面理解是分层Bean工厂,从提供的函数接口看是在BeanFactory的基础上增加了通向父容器的通道,但只能获取(父子容器,举例ApplicationContext是父容器,DispatcherServlet是子容器可以多个,子容器能get付容器从而访问其内容,反之则不行):
public interface HierarchicalBeanFactory extends BeanFactory {
BeanFactory getParentBeanFactory();
boolean containsLocalBean(String name);
}
BeanFactory getParentBeanFactory();获取父容器
boolean containsLocalBean(String name); 判断当前容器是否包含名为name的bean而忽略父容器里的bean。
以下是BeanFactory的另一个重要子接口ListableBeanFactory:
public interface ListableBeanFactory extends BeanFactory {
boolean containsBeanDefinition(String beanName);
int getBeanDefinitionCount();
String[] getBeanDefinitionNames();
String[] getBeanNamesForType(Class> type);
String[] getBeanNamesForType(Class> type, boolean includeNonSingletons, boolean allowEagerInit);
Map getBeansOfType(Class type) throws BeansException;
Map getBeansOfType(Class type, boolean includeNonSingletons, boolean allowEagerInit)
throws BeansException;
String[] getBeanNamesForAnnotation(Class extends Annotation> annotationType);
Map getBeansWithAnnotation(Class extends Annotation> annotationType) throws BeansException;
A findAnnotationOnBean(String beanName, Class annotationType)
throws NoSuchBeanDefinitionException;
}
官方解释说这个类用来枚举有xml定义的类,比如像XmlBeanFactory这样基于xml的BeanFactory。它只会查询通过自身这个渠道创建的bean而忽略其他渠道创建的(比如HierarchicalBeanFactory)。
好了,到这里就基本介绍完了spring里面一个比较重要的IOC容器BeanFactory。