String源码分析之BeanFactory

public interface BeanFactory {

	/**
	 * 对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象,    
	 * 如果需要得到工厂本身,需要转义 .
	 */
	String FACTORY_BEAN_PREFIX = "&";

	/**
	 * 返回一个指定名字的bean的实例,这个bean可能是被共享的或者是独立的。
	 * 这个方法允许Spring BeanFactory被用来替代Singleton 或者 Prototype的设计模式。
	 * 调用者应该持有这个对象的引用。
	 * 这个正规bean名字的bean的实例的一些个别名也会保持一致。
	 * 如果给定的这个bean的名字的实例在当前的这个factory实例中没有找到的话,那么就会去他的父factory里面去寻找。
	 * @param 我们要去寻找的目标bean的名字
	 * @return 返回一个bean的实例,注意是Object类型的
	 * @throws 如果没有这样的一个指定bean的名字的定义,那么就会抛出NoSuchBeanDefinitionException
	 * @throws 如果这个的一个bean没有得到,那么就会抛出BeansException
	 */
	Object getBean(String name) throws BeansException;

	/**
	 * 返回一个指定名字的bean的实例,这个bean可能是被共享的或者是独立的。
	 * <p>这个方法的表现形式和 {@link #getBean(String)}是一样的, 但是他提供了一个类型安全机制,
	 * 那就是如果给定的指定名字的bean的类型不是我们指定的Class类型,那么就会抛出一个BeanNotOfRequiredTypeException异常
	 * 这意味着在转型的时候出现了ClassCastException异常,就好像在使用{@link #getBean(String)}方法时,出现强制类型转换的异常是一样的。
	 * 这个正规bean名字的bean的实例的一些个别名也会保持一致。
	 * 如果给定的这个bean的名字的实例在当前的这个factory实例中没有找到的话,那么就会去他的父factory里面去寻找。
	 * @param 我们要去寻找的目标bean的名字
	 * @param requiredType 这个类型必须与bean的类型保持一致,可以是接口,超类,或者是直接的实际的类
	 * @return 返回这个bean的实例
	 * @throws 如果没有这样的一个指定bean的名字的定义,那么就会抛出NoSuchBeanDefinitionException
	 * @throws 如果给定的指定名字的bean的类型不是我们指定的Class类型,那么就会抛出一个BeanNotOfRequiredTypeException异常
	 * @throws 如果这个的一个bean没有被创建,那么就会抛出BeansException
	 */
	<T> T getBean(String name, Class<T> requiredType) throws BeansException;

	/**
	 * 返回匹配这个Class类型的实例
	 * @param requiredType 返回的bean必须和这个Class类型匹配; 这个Class类型可以是接口也可以是超类.null值是不允许的
	 * @return 返回一个匹配该required type的single bean
	 * @throws 如果给定的指定Class类型找不到对应的bean,那么就会抛出一个NoSuchBeanDefinitionException异常
	 * @throws 如果给定的指定Class类型找到了多个对应的bean,那么就会抛出一个NoUniqueBeanDefinitionException
	 */
	<T> T getBean(Class<T> requiredType) throws BeansException;

	/**
	 * 返回一个实例,这个实例可能是independent或者是被共享的即single的.
	 * 允许你去指定一些参数,例如构造参数或者是factory method arguments,这样你就可去重写那些你在bean的definition中指定的一些默认参数了。
	 * @param name 我们要去寻找的目标bean的名字
	 * @param args 指定的这些参数用于去创建prototype的bean的
	 * @return 返回这个bean的实例
	 * @throws 如果没有这样的一个指定bean的名字的定义,那么就会抛出NoSuchBeanDefinitionException
	 * @throws 参数已经给定了,但是这个bean却不是prototype类型的,那么就会抛出BeanDefinitionStoreException
	 * @throws 如果这个bean不能被创建,那么就会抛出BeansException
	 */
	Object getBean(String name, Object... args) throws BeansException;

	/**
	 * bean factory是否包含给定的bean,如果给定的bean的名字是一个别名,那么他也会像正规名字一样进行处理。
	 * 如果这个factory是hierarchical的,那么如果在当前这个factory实例中没有找到这个bean,那么会去他的父factory实例中去寻找.
	 * 如果一个bean的定义或者有个singleton的实例和我们给定的名字是匹配的,那么这个方法的返回值就是true,不管这个bean的定义是
	 * 具体的,抽象的,是懒加载的还是eager的,在scope里面或者不在里面. 
	 * 那么请注意,即使这个方法的返回值是true,也并不代表我们可以通过{@link #getBean}这个方法就一定可以得到相同的这个bean的名字的一个实例.
	 * @param name 我们给定的bean的名字
	 * @return 返回这个bean是否存在
	 */
	boolean containsBean(String name);

	/**
	 * 这个bean是否是singleton的?,如果是的话,那么{@link #getBean}这个方法每次返回的都是同一个实例。
	 * 请注意:这个方法返回false并不意味着这个实例就是独立的实例,他只能说明这个bean不是singleton的,
	 * 但是他或许是其他的scoped的bean。
	 * 我们要使用{@link #isPrototype}是检查这个bean是不是independent instances。
	 * 使用别名和使用正规的名字在这里的情况都是一样的。
	 * 如果给定的这个bean的名字的实例在当前的这个factory实例中没有找到的话,那么就会去他的父factory里面去寻找。
	 * @param name 我们给定的bean的名字
	 * @return 返回这个bean是不是 singleton instance
	 * @throws 如果没有这样的一个指定bean的名字的定义,那么就会抛出NoSuchBeanDefinitionException
	 */
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 这个bean是否是prototype的?,如果是的话,那么{@link #getBean}这个方法每次返回的都是不同的实例。
	 * <p>Note: This method returning {@code false} does not clearly indicate
	 *  请注意:这个方法返回false并不意味着这个实例就是singleton的实例,他只能说明这个bean不是prototype的,
	 *  但是他或许是其他的scoped的bean。
	 *  我们要使用{@link #isSingleton}是检查这个bean是不是singleton instances。
	 * 使用别名和使用正规的名字在这里的情况都是一样的。
	 * 如果给定的这个bean的名字的实例在当前的这个factory实例中没有找到的话,那么就会去他的父factory里面去寻找。
	 * @param name 我们给定的bean的名字
	 * @return 返回这个bean是不是  independent instances
	 * @throws 如果没有这样的一个指定bean的名字的定义,那么就会抛出NoSuchBeanDefinitionException
	 */
	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 检查一下我们给定的bean和我们给定的Class类型是否匹配。
	 * 使用别名和使用正规的名字在这里的情况都是一样的。
	 * 如果给定的这个bean的名字的实例在当前的这个factory实例中没有找到的话,那么就会去他的父factory里面去寻找。
	 * @param 我们给定的bean的名字
	 * @param 我们给定的Class类型
	 * @return 如果匹配的话返回值是true,
	 * @throws 如果没有这样的一个指定bean的名字的定义,那么就会抛出NoSuchBeanDefinitionException
	 */
	boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;

	/**
	 * 获取给定名字的bean的Class类型.
	 * 使用别名和使用正规的名字在这里的情况都是一样的。
	 * 如果给定的这个bean的名字的实例在当前的这个factory实例中没有找到的话,那么就会去他的父factory里面去寻找。
	 * @param name 我们给定的bean的名字
	 * @return 返回这个bean的Class类型
	 * @throws 如果没有这样的一个指定bean的名字的定义,那么就会抛出NoSuchBeanDefinitionException
	 */
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 返回给定的bean的名字的别名.
	 * 所有的这些别名指代的都是通过{@link #getBean}这个方法获取到的bean是同一个bean
	 * 如果给定的bean的名字本身就是一个别名,那么原始名称和其他的别名就会一同被返回,并且原始名字是
	 * 作为返回的数组中的第一个元素.
	 * 如果给定的这个bean的名字的实例在当前的这个factory实例中没有找到的话,那么就会去他的父factory里面去寻找。
	 * @param name 被给定的bean的名称
	 * @return the aliases,返回的别名数组,如果没有别名,那么就返回一个空的数组
	 */
	String[] getAliases(String name);

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值