BeanFactory

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27868061/article/details/82934450

BeanFactory为spring容器的顶级接口,定义了容器的基本操作

package org.springframework.beans.factory;

import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;

/**
 * 访问spring容器的根接口,进一步的接口为
 * ListableBeanFactory
 * org.springframework.beans.factory.config.ConfigurableBeanFactory
 *
 * 这个接口由包含许多Bean定义的对象实现,每个都有String名称唯一标识
 * 根据Bean的定义,工厂将返回指定类的独立实例(prototype模式),或单个共享实例(single模式)
 *
 * BeanFactory的重点在于应用程序组件的中央注册表,和应用程序组件的集中性配置
 *
 * 注意,最好是通过setter,constructor依赖注入(推)的方式配置应用程序对象
 * 这比通过BeanFactory查找(拉)的方式要好
 *
 * BeanFactory将加载存储在配置中的bean定义(例如XML文档)
 *
 * 与ListableBeanFactory相比,接口中所有方法都会见车父工厂,如果这是一个HierarchicalBeanFactory
 * 如果在当前BeanFactory实例中没有找到,将会向父工厂查找
 * 当前工厂实例暴露的Bean将会覆盖父工厂实例的同名Bean
 *
 * Bean的初始化顺序为
 * BeanNameAware's
 * BeanClassLoaderAware
 * BeanFactoryAware
 * EnvironmentAware's {@code setEnvironment}
 * EmbeddedValueResolverAware's {@code setEmbeddedValueResolver}
 * ResourceLoaderAware's {@code setResourceLoader}
 * ApplicationEventPublisherAware's {@code setApplicationEventPublisher}
 * MessageSourceAware's {@code setMessageSource}
 * ApplicationContextAware's {@code setApplicationContext}
 * ServletContextAware's {@code setServletContext}
 * {@code postProcessBeforeInitialization} methods of BeanPostProcessors
 * 's {@code afterPropertiesSet}
 * {@code postProcessAfterInitialization} methods of BeanPostProcessors
 *
 * Bean的销毁顺序为
 * {@code postProcessBeforeDestruction} methods of DestructionAwareBeanPostProcessors
 * DisposableBean's {@code destroy}
 * 定制的destroy-method
 */

/**
 * spring bean容器的根接口,注意与FactoryBean区分
 */
public interface BeanFactory {

	/**
	 * 前缀,用于获取相应名称bean的FactoryBean
	 * 当一个Bean由工厂Bean创建时,如果使用指定名称获取Bean,会得到Bean的实例
	 * 名称前加上前缀,会获取到FactoryBean实例
	 */
	String FACTORY_BEAN_PREFIX = "&";


	/**
	 * 返回指定名称Bean的实例,可以是共享的或者独立的
	 * 这个方法允许spring BeanFactory可以被用作单例或原型设计模式
	 * 调用者可以保留单例模式返回对象的引用
	 * 转换别名为相应的规范bean名称
	 * 当在此工厂实例找不到时,会向父工厂请求
	 */
	Object getBean(String name) throws BeansException;

	/**
	 * 返回指定名称指定类型的Bean实例,如果类型不对,则抛出BeanNotOfRequiredTypeException
	 */
	<T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;

	/**
	 * 获取指定名称Bean,允许指定显式构造函数参数/工厂方法参数,覆盖bean定义中指定的默认参数
	 * 这个Bean必须被标志为原型模式,否则抛出BeanDefinitionStoreException
	 */
	Object getBean(String name, Object... args) throws BeansException;

	/**
	 * 返回唯一的指定类型对象的Bean实例,如果有多个,抛出异常
	 * 指定类型可以是接口或者超类
	 *
	 */
	<T> T getBean(Class<T> requiredType) throws BeansException;

	/**
	 * 指定类型必须为原型模式
	 */
	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;


	/**
	 * 容器是否包含指定名称的Bean
	 * 如果给定名称为别名,它将会被转换为相应的规范bean名称
	 * 如果工厂是分层的,会询问任何父工厂
	 */
	boolean containsBean(String name);

	/**
	 * 指定名称Bean是否为共享单例Bean
	 * 如果为别名将会转换为规范bean名称,如果此工厂实例中找不到将询问父工厂
	 */
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 指定名称Bean为原型模式吗
	 */
	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 检查具有指定名称的Bean是否与指定的类型相匹配
	 */
	boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

	/**
	 * 指定名称的Bean是否与指定类型相匹配
	 */
	boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

	/**
	 * 获取指定名称Bean的类型
	 */
	@Nullable
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 返回给定Bean名称的别名
	 * 在getBean调用中使用时,所有这些别名都指向同一个Bean
	 * 如果参数为别名,则返回原始bean名称和其他别名
	 */
	String[] getAliases(String name);

}

可以看到,BeanFactory主要定义了一些获取Bean,类型匹配,存在查询之类的方法

1.别名系统:一个Bean有一个唯一规范名称,也有一系列别名,在可以使用name的地方都可以使用别名代替,BeanFactory只声明了获取别名方法,没有注册别名方法

2.设计模式:Bean有单例(singleton),原型(prototype)两种模式,单例Bean为所有调用共享,原型模式每次调用返回独立Bean

3.指定参数获取Bean:有两个方法可以指定获取Bean时的构造函数参数/工厂方法参数,而且只有在原型模式时可以使用

猜你喜欢

转载自blog.csdn.net/qq_27868061/article/details/82934450