Хобрук: Ваш путь к мастерству в программировании

Внедрение зависимостей без использования Spring Framework

У меня довольно наивный вопрос. Можем ли мы вводить зависимости с помощью ядра Java так же, как мы вводим с помощью среды Spring?

На данный момент я делаю что-то вроде этого:

В веб.xml:

<context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

весенний контекст приложения.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="mybean" class="com.test.app.MyService" />

</beans>

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

public class MyResource {

    @Autowired
    private MyService mybean;

     public MyResponse doService(MyRequest req) {
           mybean.doBusiness(req);
     }
}

}

Итак, есть ли способ сделать эту инъекцию зависимостей с помощью ядра java? Я немного читал о CDI, но не очень хорошо это понял. Кроме того, казалось, что это не прямая замена того, что делает Spring.

Пожалуйста, помогите и поправьте меня, если я ошибаюсь.


  • Что вы подразумеваете под ядром Java? Это не общепризнанный термин. 19.03.2014
  • я изменил название. это более уместно? 19.03.2014
  • Это легче понять. 19.03.2014

Ответы:


1

javax.inject (JSR-330) и CDI (JSR-299, JSR-346) — это просто API, а не реализации. Существуют реализации этих API, которые работают в Java SE (в отличие от Java EE, что, я полагаю, вы подразумеваете под «основной Java»), например. Сварка SE.

CDI основан на JSR-330.

Хотя javax.inject касается только базового внедрения и не затрагивает области действия и жизненные циклы, справедливо будет сказать, что CDI и Spring Core более или менее одинаково эффективны. Оба могут использоваться в Java SE.

27.05.2014

2

@Autowired — это аннотация Spring, которая не стандартизирована. Соответствующая стандартная аннотация — @Inject из javax.inject.

Помимо Spring, Google Guice также поддерживает javax.inject

Другой чрезвычайно простой фреймворк для внедрения зависимостей (который не поддерживает javax.inject) — PicoContainer.

19.03.2014

3

Вы также можете взглянуть на HK2, который является полным JSR-330 и работает в базовом JDK. Он имеет функции для базового JDK, такие как безопасность. Подробнее здесь:

Главная страница HK2

20.03.2014

4

Внедрение зависимостей — это шаблон. То, что вам нужно, и то, что лежит в основе Spring, — это контейнер Inversion of Control.

Нет, Java SE и Java EE не предоставляют такой контейнер Inversion of Control.

Java EE предоставляет API в форме CDI для внедрения зависимостей. Существует эталонная реализация под названием Weld, которую вы можете использовать.

В других ответах указан ряд других контейнеров IoC.

19.03.2014

5

Возможно, вы захотите взглянуть на javax.inject. API доступен в виде отдельного jar-файла, и существует несколько инфраструктур внедрения зависимостей, которые зависят от этого jar-файла и используют его.

Среди них Guava и более легкий Кинжал.

Ваш @Autowired здесь будет @Inject на языке javax.inject; две вышеупомянутые структуры позволяют внедрять в чистую Java (может быть, другие, не знаю, потому что не заинтересованы).

Надеюсь это поможет...

19.03.2014
  • Spring также поддерживает @Inject. 19.03.2014
  • Я слышал это; впрочем, с каких это пор? Spring предшествует javax.inject. 19.03.2014
  • По крайней мере с 3.1. В Spring добавлена ​​поддержка большинства аннотаций Java EE; например, он также поддерживает все аннотации жизненного цикла. Он обрабатывает @Inject так же, как @Autowired, за исключением того, что @Inject не имеет опции required. 19.03.2014

  • 6

    Да, ты можешь! JSR 330 полностью говорит об этом.

    Вы также можете ознакомиться с Документация Spring.

    19.03.2014
  • на самом деле это спецификация, она же стандарт, а не реальная реализация. Так что это не доказательство того, что вы можете использовать DI в ванильной Java :) Spring, Dagger, Guice и т. д. - это реализации, которые можно использовать для DI. 09.06.2017
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..