Калитка: Инъекция зависимости - PullRequest
1 голос
/ 04 февраля 2012

У меня есть несколько вопросов о DI в калитке:

Нужен ли DI, когда мой бизнес-уровень (в данном случае мой отдыхающий веб-сервис) уже получил весенний DI?

В чем разница между ними?

Нужен ли объект и компонент DI в калитке?

Когда я читаю о DI, он говорит, что, когда местоположение моего ресурса изменится, мне не придется беспокоиться об этом. Что это значит? Изменяется ли импортированная банка? Я думаю, что я не получил эту концепцию, хотя после прочтения нескольких статей об этом.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2012

Нужен ли DI, когда мой бизнес-уровень (в данном случае мой спокойный веб-сервис) уже получил Spring DI?

Чтобы получить ссылку на Spring beanВы можете использовать DI (@SpringBean) или получить их непосредственно из контекста приложения Spring:

    WebApplication application = WebApplication.get();
    ServletContext sc = application.getServletContext();
    WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sc);
    MyService myService = ctx.getBean(MyService.class);

В чем разница между ними?

Предполагая, что 'оба' означают DI Spring и Wicket DI (wicket-ioc), DI Wicket знает о жизненном цикле Wicket и заставит его работать правильно.

Что я имею в виду, Wicket будет сериализовать страницупосле каждого запроса.Если вы используете @Autowire для внедрения ваших зависимостей в страницы и компоненты, он либо потерпит неудачу (если внедренный компонент не Serializable), либо сериализует весь компонент вдоль страницы (что, вероятно, является нежелательным поведением).

Когда вы вводите зависимость в свои компоненты с помощью @SpringBean, то будет внедрен не сам компонент, а сериализуемый прокси, который будет искать настоящий компонент по требованию и освобождать его после запроса (точно так же, какLoadableDetachableModel относится к данным).

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

Нужен ли объект и компонент DI в калитке?

Предполагается, что «Объект» означает «Spring DI», а «Компонент» означает «Wicket DI»,да и нет.

Spring намного лучше внедряет сервисы в целом и работает вне цикла запросов Wicket (например, в запланированном задании Quartz).wicket-ioc не будет.

wicket-ioc + wicket-spring - просто связующее звено между Spring и Wicket.Если вы хотите использовать инъекцию зависимостей в ваших компонентах и ​​страницах, я думаю, что вы должны использовать их, потому что Wicket работает.

Я думаю, что начиная с Spring 3.0, прокси-серверы Spring (<aop:scoped-proxy/>) также доступны для сериализации.Они также ищут компонент по требованию, как и wicket-ioc, и не связаны с циклом запросов Wicket.Проблема в том, что они глобально объявлены в конфигурации Spring, поэтому каждый экземпляр, скажем, MyService будет проксироваться, а не только экземпляры, внедренные в компоненты Wicket.И, поскольку компоненты Wicket не внедряются (вы вызываете new каждый раз, когда они вам нужны), «традиционные» механизмы инжекции Spring не будут работать, вам понадобится что-то вроде @Configured и AspectJ, или вызов ApplicationContext.getAutowireCapableBeanFactory().configureBean(bean, beanName) на каждом компоненте.Это может быть проблемой или нет, в зависимости от вашего эстетического восприятия:)

Когда я читаю о DI, он говорит, что когда мое местоположение ресурса изменится, мне не придется беспокоиться об этом.Что это значит?Изменяется ли импортированная банка?Я думаю, что не понял эту концепцию, хотя после прочтения нескольких статей о ней.

В этом случае «ресурсы», вероятно, включают как внешние ресурсы, такие как пулы соединений с базами данных, так и реализации компонентов.,Если IP-адрес вашей базы данных изменяется, и вы жестко закодированы в класс, вы должны изменить класс и перекомпилировать его.Если он настроен извне (например, в файле XML или файла свойств), вам просто нужно изменить или заменить его, что является гораздо более безопасной операцией.

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

2 голосов
/ 05 февраля 2012

O.K. несколько вопросов одновременно ...

Вам нужен DI?

Нет. Калитка отлично работает без DI. Со своей стороны (и я большой поклонник DI), я использую DI почти исключительно для введения DAO в мои компоненты. Это хорошо, это легко, но это определенно не обязательно.

Какая разница между ними?

Предполагая, что вы имеете в виду разницу между DI в Wicket и DI в вашем бизнес-уровне ... Нет никакой разницы, о которой я знаю.

Нужен ли объект и компонент DI в калитке?

На этот вопрос я не могу ответить, так как не знаю, о чем ты говоришь.

О последней части. Я не знаю, какие ресурсы могут иметь отношение к DI. Когда вы используете, например, Guice для DI, вы определяете свои внедренные объекты в одном центральном месте (модуле) и просто соответствующим образом комментируете свои классы. В случае компонентов wicket интеграция Wicket-Guice гарантирует, что компоненты передаются в Guice для инъекций при их создании. Для других объектов вызов Guice-Injector заменяет new большую часть времени. Таким образом, когда вы изменяете одну из своих реализаций, вы просто изменяете один класс (модуль), и обо всем заботятся (при условии, что интерфейс остается прежним (тот же интерфейс, а не неизмененный интерфейс).

...