Нужен ли 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 дляпредложить очень гибкий, универсальный способ сделать внешнюю настройку.Он также удаляет создание экземпляров служебных компонентов из кода, что упрощает изменение как конкретного класса, так и его параметров построения.