Spring Injection:使用上下文的正确方法是什么

时间:2013-12-25 12:36:09

标签: java spring guice code-injection

我对弹簧注射有疑问。

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

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

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

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,它使用注释来解决依赖注入问题?

非常感谢。

5 个答案:

答案 0 :(得分:0)

你可以随时使用注释@Autowired来标记这是你要在课堂上注入的bean

答案 1 :(得分:0)

  

使用上下文的正确方法是什么,这样我才能保证只创建一个整个系统用来获取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

答案 2 :(得分:0)

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

public Class1 implement ApplicationContextAware{

   private ApplicationContext context;

   private void setApplicationContext(ApplicationContext applicationContext) {
       this.context = applicationContext;
   }

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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