- BeanFactory 定义了 IOC 容器的最基本形式,并提供了 IOC 容器应遵守的的最基本的接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
- BeanFactory 会在 bean 的生命周期的各个阶段中对 bean 进行各种管理,并且 Spring 将这些阶段通过各种接口暴露给我们,让我们可以对 bean 进行各种处理,我们只要让 bean 实现对应的接口,Spring 就会在 bean 的生命周期调用实现的接口来处理该 bean.
方法 |
说明 |
getBean(String name) |
返回给定名称注册的 bean 实例。
该方法会根据传入的名称查找对应的 Bean 定义,并且根据定义创建一个新的 Bean 实例
根据 bean 的配置情况,如果是 singleton 模式将返回一个共享实例,否则将返回一个新建的实例,如果没有找到指定 bean, 该方法可能会抛出异常 |
getBean(String name, Class<T> requiredType) |
返回以给定名称注册的 bean 实例,并转换为给定 class 类型
该方法会根据传入的名称查找对应的 Bean 定义,并且根据定义创建一个新的 Bean 实例
根据 bean 的配置情况,如果是 singleton 模式将返回一个共享实例,否则将返回一个新建的实例,如果没有找到指定 bean, 该方法可能会抛出异常
其中 requiredType 表示要获取的 Bean 的类型。 |
getBean(String name, Object... args) |
返回给定名称注册的 bean 实例,并且可以传入参数。
根据 bean 的配置情况,如果是 singleton 模式将返回一个共享实例,否则将返回一个新建的实例,如果没有找到指定 bean, 该方法可能会抛出异常
该方法会根据传入的名称查找对应的 Bean 定义,并且根据定义创建一个新的 Bean 实例。如果该 Bean 定义中有构造函数参数,则可以通过 args 参数来传递这些参数。 注 getBean(String name, Object... args) 方法返回的是 Object 类型,需要进行类型转换才能使用 |
getBean(Class<T> requiredType) |
根据指定的类型获取对应的 Bean 实例。
其中,requiredType 参数表示要获取的 Bean 的类型。
该方法会在容器中查找所有符合指定类型的 Bean 定义,并返回第一个匹配的实例。如果找不到对应类型的 Bean,则会抛出 NoSuchBeanDefinitionException 异常。 注 如果容器中存在多个符合指定类型的 Bean 定义,则该方法只会返回第一个匹配的实例
方法也可以接受泛型参数,例如 getBean(List.class),这样就可以获取 List 类型对应的 Bean 实例。 |
getBean(Class<T> requiredType, Object... args) |
根据指定的类型获取对应的 Bean 实例,并且可以传入参数。
其中,requiredType 参数表示要获取的 Bean 的类型。如果该 Bean 定义中有构造函数参数,则可以通过 args 参数来传递这些参数。
该方法会在容器中查找所有符合指定类型的 Bean 定义,并返回第一个匹配的实例。如果找不到对应类型的 Bean,则会抛出 NoSuchBeanDefinitionException 异常。 注 如果容器中存在多个符合指定类型的 Bean 定义,则该方法只会返回第一个匹配的实例
方法也可以接受泛型参数,例如 getBean(List.class),这样就可以获取 List 类型对应的 Bean 实例。 |
containsBean(String name) |
判断工厂中是否包含给定名称的 bean 定义,若有则返回 true |
isSingleton(String name) |
根据bean名字得到bean实例,并同时判断这个bean是不是单例 |
isPrototype(String name) |
根据bean名字得到bean实例,并同时判断这个bean是不是原型 |
isTypeMatch(String name, ResolvableType typeToMatch) |
用于判断指定名称的 Bean 是否与给定类型匹配。
其中,name 参数表示要判断的 Bean 的名称,typeToMatch 参数表示要匹配的类型
该方法会根据传入的名称查找对应的 Bean 定义,并获取该 Bean 的类型信息。然后,它会将 typeToMatch 参数与该类型信息进行比较,判断是否匹配。
如果指定名称的 Bean 不存在,则会抛出 NoSuchBeanDefinitionException 异常。如果存在对应名称的 Bean 定义,但是无法获取其类型信息,则会抛出 BeansException 异常。 注 isTypeMatch(String name, ResolvableType typeToMatch) 方法可以接受 ResolvableType 类型参数。ResolvableType 是 Spring 框架中用于描述泛型类型信息的类,可以通过它来获取更加精确和详细的类型信息。 |
isTypeMatch(String name, Class<?> typeToMatch) |
用于判断指定名称的 Bean 是否与给定类型匹配。
其中,name 参数表示要判断的 Bean 的名称,typeToMatch 参数表示要匹配的类型。
如果指定名称的 Bean 不存在,则会抛出 NoSuchBeanDefinitionException 异常。如果存在对应名称的 Bean 定义,但是无法获取其类型信息,则会抛出 BeansException 异常。 注 isTypeMatch(String name, Class<?> typeToMatch) 方法可以接受 Class 类型参数 |
getType(String name) |
返回给定名称的 bean 的 Class, 如果没有找到指定的 bean 实例,则排除 NoSuchBeanDefinitionException 异常 |
getType(String name, boolean allowFactoryBeanInit) |
用于获取指定名称的 Bean 的类型信息。其中,name 参数表示要获取的 Bean 的名称,allowFactoryBeanInit 参数表示是否允许初始化 FactoryBean
该方法会根据传入的名称查找对应的 Bean 定义,并获取该 Bean 的类型信息。如果该 Bean 是一个 FactoryBean,则根据 allowFactoryBeanInit 参数决定是否初始化它。
如果指定名称的 Bean 不存在,则会抛出 NoSuchBeanDefinitionException 异常。如果存在对应名称的 Bean 定义,但是无法获取其类型信息,则会抛出 BeansException 异常。 注 getType(String name, boolean allowFactoryBeanInit) 方法返回的是 Class<?> 类型,即该 Bean 对应的类或接口类型。 |
getAliases(String name) |
返回给定 bean 名称的所有别名 |
- BeanFactory 接口并不是 IOC 容器的具体实现,但是 Spring 容器实现多种接口,如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext 等,其中 XmlBeanFactory 就是常用的一个,该实现将以 XML 方式描述组成应用的对象及对象间的依赖关系。
示例
@Test
public void test(){
Resource resource = new FileSystemResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
}
示例
@Test
public void test(){
ClassPathResource resource = new ClassPathResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
}
示例
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]
{"applicationContext.xml", "applicationContext-part2.xml"});
BeanFactory factory = (BeanFactory) context;
}