Spring源码分析 BeanFactory与FactoryBean
BeanFactory源码如下
public interface BeanFactory
{
public abstract Object getBean(String s)
throws BeansException;
public abstract Object getBean(String s, Class class1)
throws BeansException;
public abstract Object getBean(Class class1)
throws BeansException;
public transient abstract Object getBean(String s, Object aobj[])
throws BeansException;
public abstract boolean containsBean(String s);
public abstract boolean isSingleton(String s)
throws NoSuchBeanDefinitionException;
public abstract boolean isPrototype(String s)
throws NoSuchBeanDefinitionException;
public abstract boolean isTypeMatch(String s, Class class1)
throws NoSuchBeanDefinitionException;
public abstract Class getType(String s)
throws NoSuchBeanDefinitionException;
public abstract String[] getAliases(String s);
/*For example, if the bean named myJndiObject is a FactoryBean,
* getting &myJndiObject will return the factory,
* not the instance returned by the factory*/
public static final String FACTORY_BEAN_PREFIX = "&";
}
源码分析如下:
- FACTORY_BEAN_PREFIX 返回factorybean本身,而不是返回facotry工厂创建返回的实例
- public abstract Object getBean(String s) 通过bean-id的名称获取实例,实例需要转换成对象,返回实例可能是共享的、单例模式下可以对实例的引用
- T getBean(Class requiredType) jdk1.5后通过bean-id的名称和需转换对象,自动获取完匹配成传入的转换对象
- public abstract boolean containsBean(String s) 判断工厂里面是否包含给定bean-id名称的实例
- public abstract boolean isSingleton(String s) 判断bean-id名称是否是单例模式
- public abstract String[] getAliases(String s) 返回bean-id名称给定的别名,bean对应有多个别名
FactoryBean 源码如下
public interface FactoryBean
{
public abstract Object getObject()
throws Exception;
public abstract Class getObjectType();
public abstract boolean isSingleton();
}
源码分析:
- public abstract Object getObject() 从工厂中获取对象本身
- public abstract Class getObjectType(); 从工厂中获取对象所属的class
- public abstract boolean isSingleton(); 判断是否单例
总结:
BeanFactory:Spring的根容器,所有的子接口对应容器的一些处理原则和生命周期方法。spring整个层次体系中,BeanFactory处于最顶层,其它组建必须实现这个方法,常用ApplicationContext也是间接继承BeanFactory
FactoryBean:本身存在BeanFactory中,这个特殊的工厂用于创建由FactoryBean创建出来的对象,FactoryBean本身创建出来的对象不是本身,而是工厂创建出来的对象,在AOP中得到大量使用,主要用于装饰或代理,AOP本身也是通过动态字节码注入和代理生成
作者简介:张程 技术研究
更多文章请关注微信公众号:zachary分解狮 (frankly0423)