在 Spring Framework 中创建 Bean Factory 的其他方法

Other ways to create a Bean Factory in Spring Framework

我了解 BeanFactoryApplicationContext 之间的区别。

我还知道可以从 xml 文件创建 BeanFactory 实例,这些文件位于类路径或文件系统中的任何其他位置。因此,在这种情况下会创建一个 XMLBeanFactory 实例。

与此同时,我正在研究 BeanFactory 文档并偶然发现了这个。

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/BeanFactory.html

Normally a BeanFactory will load bean definitions stored in a configuration source (such as an XML document), and use the org.springframework.beans package to configure the beans. However, an implementation could simply return Java objects it creates as necessary directly in Java code. There are no constraints on how the definitions could be stored: LDAP, RDBMS, XML, properties file, etc. Implementations are encouraged to support references amongst beans (Dependency Injection).

那么,这是否意味着 bean 定义也可以采用非 XML 格式?即,LDAP、RDBMS、属性文件等?如果是,请提供其中的片段。我只寻找 BeanFactory 而不是任何 ApplicationContext 实现。

ApplicationContext 是类固醇的 BeanFactory,在 this blog 中有说明。

public class SpringContextsApplication {

  public static void main(String[] args) throws Exception {
    GenericApplicationContext contextFromProperties =
      new GenericApplicationContext();

    BeanDefinitionReader reader =
      new PropertiesBeanDefinitionReader(contextFromProperties);
    reader.loadBeanDefinitions("classpath:application-context.properties");
    contextFromProperties.refresh();

    doGreeting(contextFromProperties);

    contextFromProperties.stop();
  }

  private static void doGreeting(ApplicationContext ctx) {
    Greeter greeter = ctx.getBean(Greeter.class);
    Person person = ctx.getBean(Person.class);
    greeter.greet(person);
  }
}

在有 GenericApplicationContext 的地方,也可以使用 DefaultListableBeanFactory 代替并获得相同的结果。

public class SpringContextsApplication {

  public static void main(String[] args) throws Exception {
    GenericApplicationContext contextFromProperties =
      new DefaultListableBeanFactory();

    BeanDefinitionReader reader =
      new PropertiesBeanDefinitionReader(contextFromProperties);
    reader.loadBeanDefinitions("classpath:application-context.properties");

    doGreeting(contextFromProperties);

    contextFromProperties.stop();
  }

  private static void doGreeting(BeanFactory ctx) {
    Greeter greeter = ctx.getBean(Greeter.class);
    Person person = ctx.getBean(Person.class);
    greeter.greet(person);
  }
}

要加载 bean 定义,需要 BeanDefinitionReader 用于您要使用的特定实现。这是 属性 文件,但您也可以为 LDAP、JDBC、YAML 等编写 BeanDefinitionReader

Spring 支持开箱即用

但是,如果需要,您可以创建任何您喜欢的实现。