2012-03-12 3 views
3

Я изучаю Spring, и у меня возникает вопрос, как вы используете его в автономных приложениях (а также при использовании его для создания веб-приложений). Примеры, которые я уже кодировал до сих пор, использовали простой основной метод, когда я извлекаю bean-компоненты, вызывая getBean на. Контекстный объект. Однако вы, вероятно, захотите сделать это в нескольких классах, так что сначала вы получаете контекст, а затем вызываете getBean или есть другие альтернативы для чистых? Или это так, как вы это делаете в автономных и веб-приложениях?Использование Spring в автономных приложениях

ответ

7

Если вы звоните context.getBean() во всем мире, вам, вероятно, не хватает всей точки Spring, которая представляет собой инфраструктуру инъекций зависимостей.

В автономном приложении вы обычно вызываете context.getBean() только один раз (или, по крайней мере, очень редко), чтобы получить «корневой» компонент. Этот компонент вводится весной другими фасолью и так далее.

В веб-приложении все зависит от того, какую структуру вы используете. Но, как правило, вы регистрируете прослушиватель в web.xml, который загружает контекст для вас, а контроллеры создаются и/или вводятся Spring.

+0

О, так что вы используете его только для загрузки, обвязывающего приложение. – LuckyLuke

+0

Да, точно, как показано в @Thomasz Nurkiewiczs. –

+0

Хорошо, спасибо. Не могли бы вы объяснить, что вы подразумеваете под этим, я скучаю по поводу рамки DI? Чтобы я мог читать. Также почему вы должны только вызывать его один раз? – LuckyLuke

1

Один класс (ваш основной класс, возможно) должен быть осведомлен о Spring для создания контекста. Все остальные классы могут быть связаны друг с другом с помощью Spring и не нуждаются в контекстном знании.

1

Это зависит от приложения, которое вы пишете, но вы должны ограничить getBean() призывом к минимуму, предпочтительно одному. Вы извлекаете первый компонент непосредственно из контекста и ставите остальную часть логики в самих бобов. Что-то вдоль линий:

Bootstrap boot = context.getBean(Bootstrap.class); 
boot.start(); 

И все остальные логики приложения происходит внутри start(). Он может создавать темы, прослушивать события и т. Д.

3

Вы находитесь на правильных линиях. Ваш основной метод будет инициализировать ваш контекст приложения, как вы обнаружили. Тогда трюк должен использовать этот контекст приложения, чтобы создать точку входа в ваше приложение. Этот компонент, созданный с пружиной, будет подключен для вас.

import org.springframework.beans.factory.BeanFactoryUtils; 
import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 


public class ApplicationMain { 

    public static void main(String[] args) { 

     AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:/META-INF/spring/applicationContext.xml"); 

     MyApplication app = BeanFactoryUtils.beanOfType(ctx, MyApplication.class); 

     app.init(); 
    } 

} 
+0

Я бы просто настроить app.init как приложение init-method off. таким образом, поиск и явный вызов не нужны. все управляется весной. – Laures

+0

@Laures - Согласитесь, это * может * быть сделано более неявным, но иногда явный вызов делает вещи более ясными. Обратите внимание, что Spring имеет интерфейс 'org.springframework.context.Lifecycle', который может быть применим здесь. Когда 'start()', 'stop()' или 'isRunning()' вызывается в контексте приложения, все компоненты, реализующие интерфейс Lifecycle, имеют эквивалентный метод. В простых примерах, подобных этому, я думаю, что это слишком много. – sw1nn

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