Spring Framework源码(一):spring beans之BeanFactory

先来认识一下两个重要容器BeanFactory和ApplicationContext的类图:

   

 接下来,我们挨个对出现的类做个介绍:

public interface BeanFactory {
	String FACTORY_BEAN_PREFIX = "&";
	Object getBean(String name) throws BeansException;
	<T> T getBean(String name, Class<T> requiredType) throws BeansException;
	<T> T getBean(Class<T> requiredType) throws BeansException;
	Object getBean(String name, Object... args) throws BeansException;
	<T> T getBean(Class<T> 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实例

        <T> T getBean(String name, Class<T> requiredType) throws BeansException; 一个泛型方法,按名字和类类型的类获取bean实例。

        <T> T getBean(Class<T> requiredType) throws BeansException;一个泛型方法,按类类型获取bean实例。

         Object getBean(String name, Object... args) throws BeansException; 按名字和显示声明的参数来创建实例,注意显示声明的参数是用来创建原型的

        <T> T getBean(Class<T> requiredType, 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);
	<T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
	<T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)
			throws BeansException;
	String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);
	Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;
	<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
			throws NoSuchBeanDefinitionException;

}

         官方解释说这个类用来枚举有xml定义的类,比如像XmlBeanFactory这样基于xml的BeanFactory。它只会查询通过自身这个渠道创建的bean而忽略其他渠道创建的(比如HierarchicalBeanFactory)。
         好了,到这里就基本介绍完了spring里面一个比较重要的IOC容器BeanFactory。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值