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);
}
09-23