BeanFactory
package org.springframework.beans.factory;import org.springframework.beans.BeansException;import org.springframework.core.ResolvableType;import org.springframework.lang.Nullable;public interface BeanFactory { String FACTORY_BEAN_PREFIX = "&"; Object getBean(String name) throws BeansException; <T> T getBean(String name, Class<T> requiredType) throws BeansException; Object getBean(String name, Object... args) throws BeansException; <T> T getBean(Class<T> requiredType) throws BeansException; <T> T getBean(Class<T> requiredType, Object... args) throws BeansException; <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType); <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType); boolean containsBean(String name); boolean isSingleton(String name) throws NoSuchBeanDefinitionException; boolean isPrototype(String name) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException; @Nullable Class<?> getType(String name) throws NoSuchBeanDefinitionException; @Nullable Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException; String[] getAliases(String name);}
- String FACTORY_BEAN_PREFIX = "&";
String FACTORY_BEAN_PREFIX = "&"; 这句代码定义在BeanFactory这个最顶级的接口中。他的作用是如果在应用beanName获取Bean时,在BeanName前增加这个前缀, 那么应用这个BeanName取得的Bean实例是其所在FactoryBean的实例,也就是实现 FactoryBean 接口的那个类的Bean实例。
- Object getBean(String name) throws BeansException;
通过Bean名称获取Bean
- <T> T getBean(String name, Class<T> requiredType) throws BeansException;
依据名称和类型获取Bean
- Object getBean(String name, Object... args) throws BeansException;
通过name和对象参数获取Bean
- <T> T getBean(Class<T> requiredType) throws BeansException;
通过类型获取Bean
- <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
通过类型和参数获取Bean
- <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
返回指定ObjectProvider,提供提早加载性能
- <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
Class,Field,Method 类型的提早加载性能
- boolean containsBean(String name);
容器中是否蕴含名字为name的Bean
- boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
Bean是否是单例
- boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
判断bean是不是原型
- boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
查看具备给定名称的bean是否与指定的类型(Class,Field,Method 类型)匹配。
- boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
查看具备给定名称的bean是否与指定的类型匹配。
- Class<?> getType(String name) throws NoSuchBeanDefinitionException;
确定具备给定名称的bean的类型
- Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;
确定具备给定名称的bean的类型
- String[] getAliases(String name);
返回给定bean名称的别名
ObjectFactory
package javax.naming.spi;import java.util.Hashtable;import javax.naming.*;public interface ObjectFactory { //为指定对象和环境创立一个对象实例 public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?,?> environment) throws Exception;}
相同点
BeanFactory和ObjectFactory都提供依赖查找的能力
区别
- BeanFactory实现了ObjectFactory接口
- ObjectFactory仅仅关注一个或者一种类型Bean的查找,并且本身不具备依赖查找的能力.
- BeanFactory则提供繁多类型,汇合类型和层次性的依赖查找能力.
原文: https://rumenz.com/rumenbiji/Spring-BeanFactory-ObjectFactory.html