核心接口 BeanFactory

Exisi 2022-06-28 07:40:00
Categories: Tags:
  • 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 容器实现多种接口,如 DefaultListableBeanFactoryXmlBeanFactoryApplicationContext 等,其中 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;

}