【问题标题】:Spring Injection: What is the correct way of using contextSpring Injection:使用上下文的正确方法是什么
【发布时间】:2013-12-25 12:36:08
【问题描述】:

我有一个关于 Spring Injection 的问题。

基础教程告诉我们应该创建一个上下文来获取 bean:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

但是,如果我在每个类中创建一个上下文,我可以从这些上下文中获取的 bean 包含不同的实例。例如

public class MyClass1 {
    public void myMethod() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        MyBean myBean1 = (MyBean)context.getBean("myBean");
    }
}

public class MyClass2 {
    public void myMethod() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        MyBean myBean2 = (MyBean)context.getBean("myBean");
    }
}

这里,myBean1 和 myBean2 是两个不同的对象,虽然它应该是一个单例。

使用上下文的正确方法是什么,这样我可以保证我只创建一个上下文,整个系统都使用它来获取 bean?

有没有办法像 Google Guice 一样使用 Spring,它使用注解来解决依赖注入问题?

非常感谢。

【问题讨论】:

标签: java spring guice code-injection


【解决方案1】:

你总是可以使用注解@Autowired 来标记这是一个你想在你的类中注入的bean

【讨论】:

    【解决方案2】:

    使用上下文的正确方法是什么,这样我可以保证我只创建一个上下文,整个系统都使用它来获取 bean?

    WhateverApplicationContext 的构造函数只调用一次 ...

    有没有办法像 Google Guice 一样使用 Spring,它使用注解来解决依赖注入问题?

    当然有。它记录在弹簧参考手册的以下部分:

    http://docs.spring.io/spring/docs/4.0.0.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#beans-annotation-config

    http://docs.spring.io/spring/docs/4.0.0.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#beans-classpath-scanning

    您甚至可以使用与 Guice 或 CDI 相同的注解进行注入:

    http://docs.spring.io/spring/docs/4.0.0.BUILD-SNAPSHOT/spring-framework-reference/htmlsingle/#beans-standard-annotations

    【讨论】:

      【解决方案3】:

      启动上下文一次,如果你想在你的类中使用它,请实现 ApplicationContextAware。

      public Class1 implement ApplicationContextAware{
      
         private ApplicationContext context;
      
         private void setApplicationContext(ApplicationContext applicationContext) {
             this.context = applicationContext;
         }
      

      上下文启动后会自动调用该方法。

      【讨论】:

        【解决方案4】:

        您不应该自己使用 Spring 的ApplicationContext 来设置您的应用程序。您应该让 Spring 的ApplicationContext 为您设置应用程序。

        常见的模式是在应用程序的启动点实例化您的ApplicationContext,无论是main() 方法还是ServletContextListener (Spring MVC)。您在上下文中声明 bean 以及它们之间的关系,例如注入目标。您永远不会在同一个应用程序中两次初始化相同的上下文。

        【讨论】:

          【解决方案5】:

          你为什么不创建一个单独的类并创建一个以 bean 名称作为参数的方法,你可以从上下文中获取 bean 并返回它。因此,您将获得相同的实例,因为您不会一次又一次地加载弹簧配置文件。

          【讨论】:

            猜你喜欢
            • 2012-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-31
            • 1970-01-01
            • 2017-04-12
            相关资源
            最近更新 更多