【问题标题】:Other ways to create a Bean Factory in Spring Framework在 Spring Framework 中创建 Bean Factory 的其他方法
【发布时间】:2021-11-30 14:36:59
【问题描述】:

我了解BeanFactoryApplicationContext 之间的区别。

我还知道可以从 xml 文件创建 BeanFactory 实例,这些文件位于类路径或文件系统中的任何其他位置。因此,在这种情况下会创建一个 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,属性文件等?如果是,请提供它的sn-p。我只在寻找 BeanFactory 而不是任何 ApplicationContext 实现。

【问题讨论】:

  • 如果您有 LDAP 的 BeanFactory 实现,它可以来自那里。如果您提供正确的实现,您可以从任何地方提取它们。 Spring 仅提供使用属性文件、xml 和 java 配置(或 groovy/ruby)的实现。
  • @M.Deinum 你说的属性文件是指spring boot application.properties吗?
  • @M.Deinum 除了 Spring 框架本身,还有其他 BeanFactory 的实现吗?
  • 阅读博客。 ApplicationContext 也是 BeanFactory。在使用属性的示例中,您可以使用 DefaultListableBeanFactory 而不是 GenericApplicationContext 并获得完全相同的结果。

标签: java spring factory spring-bean


【解决方案1】:

this blog 中解释了如何加载 ApplicationContext,它是 steriod 上的 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 支持开箱即用

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多