Spring学习05--BeanFactory接口和BeanDefinition接口

一、BeanFactory接口
bean的工厂接口,我们通常使用的ApplicationContext也是BeanFactory的子类,不过中间有多重实现而已。
作为IOC容器的老祖宗,它应该提供了大部分我们所需要的方法,来看一下源码:

package org.springframework.beans.factory;

import org.springframework.beans.BeansException;

/*
 * @author Rod Johnson
 * @author Juergen Hoeller
 * @since 13 April 2001
 */
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;


    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);

}

果不其然,其中getBean就有多种写法,还有判断bean的类型的方法。
那么,我们就可实现这个接口,然后重写相应的方法,以达到我们所需要的BeanFactory的实例。最常用的就是ApplicationContext。如果一个工厂想实现这样的功能,那么这个工厂需要有一下几点功能:
1、需要有各种类型的bean的定义,否则无法完成实例化;
2、需要持有bean之间的依赖关系,否则实例化时也将会出问题;
3、还需要有读取xml文件的能力,否则怎么拿到配置的bean呢?

基于第一点,我们知道,我们在使用ApplicationContext是的时候,是需要什么bean,就取什么bean,而且,我们也知道,容器在启动时,就将读取配置文件,将所有的bean实例化,这里仅限于延迟加载为false的情况,如果配置了lazy-init为true的话,将不会在启动时初始化,那么,正式由于延迟加载的情况,我们没有办法一次性将所有的bean都加载出来,并且实例化,放到一个Map

package org.springframework.beans.factory.config;

import org.springframework.beans.BeanMetadataElement;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.core.AttributeAccessor;


public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {


    String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;


    String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;


    int ROLE_APPLICATION = 0;


    int ROLE_SUPPORT = 1;


    int ROLE_INFRASTRUCTURE = 2;


    String getParentName();


    void setParentName(String parentName);


    String getBeanClassName();


    void setBeanClassName(String beanClassName);


    String getFactoryBeanName();


    void setFactoryBeanName(String factoryBeanName);


    String getFactoryMethodName();


    void setFactoryMethodName(String factoryMethodName);


    String getScope();


    void setScope(String scope);


    boolean isLazyInit();


    void setLazyInit(boolean lazyInit);


    String[] getDependsOn();


    void setDependsOn(String[] dependsOn);


    boolean isAutowireCandidate();


    void setAutowireCandidate(boolean autowireCandidate);


    boolean isPrimary();


    void setPrimary(boolean primary);


    ConstructorArgumentValues getConstructorArgumentValues();


    MutablePropertyValues getPropertyValues();


    boolean isSingleton();


    boolean isPrototype();


    boolean isAbstract();


    int getRole();


    String getDescription();


    String getResourceDescription();


    BeanDefinition getOriginatingBeanDefinition();

}

是不是看到肯多熟悉的词呢,Class,Name , lazy-init , depends-on,还有自动装载Autowire等等,代码很简单,这个便是spring中的bean定义接口,所以其实我们工厂里持有的bean定义,就是一堆这个玩意,或者是他的实现类和子接口。这个接口并非直接的祖宗接口,他所继承的两个接口一个是core下面的AttributeAccessor,继承这个接口就以为这我们的bean定义接口同样具有处理属性的能力,而另外一个是beans下面的BeanMetadataElement,字面翻译这个接口就是bean的元数据元素,它可以获得bean的配置定义的一个元素。在XML文件中来说,就是会持有一个bean标签。
仔细观看,能发现beanDefinition中有两个方法分别是String[] getDependsOn()和void setDependsOn(String[] dependsOn),这两个方法就是获取依赖的beanName和设置依赖的beanName。也就是说,如果我们实现该接口,我们就用于了处理bean实例的能力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值