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

问题描述 投票:0回答:1

我了解

BeanFactory
ApplicationContext
之间的区别。

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

同时,我正在深入研究

BeanFactory
文档并偶然发现了这一点。

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

通常 BeanFactory 将加载存储在配置源(例如 XML 文档)中的 bean 定义,并使用 org.springframework.beans 包来配置 bean。然而,实现可以简单地返回它根据需要直接在 Java 代码中创建的 Java 对象。定义的存储方式没有限制:LDAP、RDBMS、XML、属性文件等。鼓励实现支持 bean 之间的引用(依赖注入)。

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

java spring factory spring-bean
1个回答
1
投票

如何加载

ApplicationContext
,这是一个
BeanFactory
:.

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 支持开箱即用

  • XML
  • 属性(从 Spring 5.3 开始已弃用,可能会在 Spring 6 中删除)
  • 格罗维
  • Java 类
  • JDBC(纯粹作为示例,在 5.3 中弃用并在 Spring 6 中删除)

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

© www.soinside.com 2019 - 2024. All rights reserved.