繁体   English   中英

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

[英]Spring Injection: What is the correct way of using context

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

基本教程告诉我们,我们应该创建一个上下文以获得豆:

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

非常感谢。

您可以始终使用批注@Autowired来标记这是您要在类中注入的bean

使用上下文的正确方法是什么,以便可以保证只创建一个整个系统用于获取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

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

public Class1 implement ApplicationContextAware{

   private ApplicationContext context;

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

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

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

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

为什么不创建一个单独的类并创建一个以bean名称作为参数的方法,而您只能从上下文中获取bean并返回它。 因此,您将获得与不反复加载spring配置文件相同的实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM