2013-12-25 4 views
0

У меня есть вопрос о Spring Injection.Spring Injection: Каков правильный способ использования контекста

Основной учебник говорит, что мы должны создать контекст для того, чтобы получить бобы:

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

Однако, если я создаю контекст, в каждом классе, боб я могу получить от этого контекста содержит другой экземпляр. например

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-компонентов?

Можно ли использовать Spring, например, Google Guice, который использует аннотацию для адресной инъекции зависимостей?

Большое спасибо.

+0

Вы можете сделать это по весеннему аннотации. Обратитесь к этому http://docs.spring.io/spring/docs/1.2.9/reference/beans.html. –

ответ

0

вы всегда можете использовать аннотацию @Autowired, чтобы отметить, что это боб вы хотите, чтобы ввести в классе

0

Что такое правильный способ использования контекста, так что я могу гарантировать, что я создаю только один контекст который используется всей системой для получения боба?

Вызвать конструктор WhateverApplicationContext только один раз ...

Есть ли способ использовать Spring, как Google Guice, которая использует аннотацию для решения инъекции зависимостей?

Конечно, есть. Она описана в следующих разделах пружинного справочника:

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

0

Запустите контекст один раз, и если вы хотите использовать его в своем классе, реализуйте ApplicationContextAware.

public Class1 implement ApplicationContextAware{ 

    private ApplicationContext context; 

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

Метод будет автоматически вызываться после начала контекста.

0

Вы не должны использовать Spring ApplicationContext самостоятельно, чтобы настроить свое приложение. Вы должны позволить Spring ApplicationContext настроить приложение для вас.

Общая модель заключается в создании экземпляра ApplicationContext в точке запуска приложения, будь то метод main() или ServletContextListener (Spring MVC). Вы объявляете bean-компоненты в вашем контексте и отношения между ними, например, целями инъекции. Вы никогда не инициализируете один и тот же контекст дважды в одном приложении.

0

Почему вы не делаете отдельный класс и не делаете метод, который принимает имя bean как параметр, и вы можете просто получить компонент из контекста и вернуть его. Таким образом, вы получите тот же экземпляр, что и вы не загружаете файл конфигурации пружины снова и снова.

Смежные вопросы