Spring的BeanFactory

BeanFactory是最顶层也是最基本的工厂接口,定义了基本的获取Bean的方法,并定义了获取Bean属性的方法。
public interface BeanFactory {
//FactoryBean的转义符
String FACTORY_BEAN_PREFIX = "&";
//获取Bean的方法
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType);
<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;
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}
BeanFactory的直接继承接口:
HierarchicalBeanFactory
为实现bean工厂的层级关系提供支持,定义了
BeanFactory getParentBeanFactory()
方法;比如常见的Web应用中,ContextLoaderListener创建的容器为父容器,而DispatcherServlet创建的容器为子容器。容器有父子之分,父容器对子容器可见,子容器对父容器不可见。
AutowireCapableBeanFactory
提供自动装配Bean的能力,主要方法为
void autowireBean(Object existingBean)
。//引入Autowire之前 <bean id="example" class="com.maxwell.learning.spring.Example"> <property name="a" ref="nameA"/> <property name="b" ref="nameB"/> <property name="c" ref="nameC"/> </bean> //引入Autowire之后 <bean id="example" class="com.maxwell.learning.spring.Example" autowire="byName">
autowire包含4中模式:
no:默认值,Spring建议使用该值,即我们在配置中显式指明其依赖,而不是靠Spring根据类型或名字来判断
byName:根据依赖Bean的名字去获取依赖Bean
byType:根据依赖Bean的类型去获取依赖Bean
constructor:在构造时,按照依赖Bean的类型去获取依赖Bean
ListableBeanFactory
BeanFactory可以提供getBeanByName或者getBeanByType的能力,而ListableBeanFactory还可以枚举所有的Bean实例。
ConfigurableBeanFacory:提供对BeanFactory的配置功能,比如BeanFactory的父级BeanFactory是哪个,BeanFactory使用哪个ClassLoader去加载Bean,是否需要缓存Bean的元信息,解析Bean时使用哪个EL表达式解析器,BeanFactory有哪些BeanPostProcessor等等。
ConfigurableListableBeanFactory