Что делает платформа Spring? Должен ли я использовать его? Почему или почему нет?

Итак, я начинаю совершенно новый проект на Java и рассматриваю использование Spring. Почему я рассматриваю весну? Потому что многие люди говорят мне, что я должен использовать Весну! Серьезно, в любое время, когда я пытался заставить людей объяснить, что такое Весна или что она делает, они никогда не могут дать мне прямой ответ. Я проверил интро на сайте SpringSource, и они либо очень сложны, либо действительно ориентированы на учебники, и никто из них не дает мне хорошего представления о том, почему я должен использовать его или как это облегчит мою жизнь. Иногда люди бросают вокруг слова «инъекция зависимостей», что меня просто сбивает с толку, потому что я думаю, что у меня другое понимание того, что означает этот термин.

В любом случае, вот немного о моем фоне и моем приложении:

Некоторое время развивалось в Java, делая внутреннюю веб-разработку. Да, я делаю тонну модульного тестирования. Чтобы облегчить это, я обычно делаю (по крайней мере) две версии метода: один, который использует переменные экземпляра, и тот, который использует только переменные, которые передаются методу. Тот, который использует переменные экземпляра, вызывает другую, предоставляя переменные экземпляра. Когда приходит время на модульный тест, я использую Mockito для моделирования объектов, а затем совершает вызовы метода, который не использует переменные экземпляра. Это то, что я всегда понимал как «инъекция зависимостей».

Мое приложение довольно просто, с точки зрения CS. Небольшой проект, с 1-2 разработчиками. В основном операции типа CRUD с кучей поисковых запросов. В основном это набор веб-сервисов RESTful, а также веб-интерфейс и, наконец, некоторые мобильные клиенты. Я собираюсь сделать интерфейс в прямом HTML /CSS /JS /JQuery, поэтому никаких реальных планов использования JSP нет. Использование Hibernate в качестве ORM и Джерси для реализации веб-сервисов.

Я уже начал кодирование, и мне очень хочется получить демо-версию, чтобы я мог ходить по магазинам и посмотреть, хочет ли кто-нибудь инвестировать. Таким образом, очевидно, что время имеет существенное значение. Я понимаю, что Spring имеет довольно кривую обучения, и похоже, что это требует целого набора XML-конфигурации, которую я обычно стараюсь избегать, как чума. Но если это может сделать мою жизнь проще и (особенно), если она сделает ускорение разработки и тестирования, я готов укусить пулю и узнать Весну.

Так что, пожалуйста. Просветите меня. Должен ли я использовать Spring? Почему или почему нет?

220 голосов | спросил sangfroid 12 J000000Tuesday11 2011, 22:54:08

7 ответов


100
  

Что делает платформа Spring? Должен ли я использовать его? Почему или почему нет?

Spring - это основа, которая помогает вам «подключать» разные компоненты вместе. Это наиболее полезно в случаях, когда у вас много компонентов, и вы можете решить объединить их по-разному или хотите упростить замену одного компонента на другой в зависимости от разных настроек или сред.

  

Это то, что я всегда понимал как «инъекция зависимостей».

Я бы предложил другое определение:

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

Сравните это с: «Каждый объект отвечает за выход и поиск всего и каждого, что ему нужно, когда он запускается».

  

похоже, что это требует целой кучи конфигурации XML

Ну, большая часть материала, основанного на XML (или на основе аннотаций), сообщает Spring такие вещи, как:

  • Когда кто-то просит «HammerStore», я хочу, чтобы вы создали экземпляр example.HammerStore и вернули его. Кэшируйте экземпляр в следующий раз, так как там должно быть только одно хранилище.
  • Когда кто-то просит «SomeHammer», я хочу, чтобы вы спросили себя о «HammerStore» и вернете результат метода makeHammer () магазина. Сделайте not кеш этого результата.
  • Когда кто-то спрашивает «SomeWrench», я хочу, чтобы вы создали экземпляр example.WrenchImpl, используйте параметр конфигурации gaugeAmount и поместите его в код setWrenchSize (). Не кэшируйте результат.
  • Когда кто-то запрашивает «LocalPlumber», я хочу создать экземпляр example.PlumberImpl. Поместите строку «Pedro» в свой метод setName (), поместите «SomeHammer» в свой метод setHammer () и поместите «SomeWrench» в свой setWrench (). Верните результат и кешируйте результат позже, так как нам нужен только один сантехник.

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

  

Чтобы облегчить [тестирование], я обычно делаю (по крайней мере) две версии метода: один, который использует переменные экземпляра, и тот, который использует только переменные, которые передаются методу.

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

ответил Darien 13 J000000Wednesday11 2011, 23:40:40
62

Во-первых, что такое инъекция зависимостей?

Simple. У вас есть класс, у него есть частное поле (значение null), и вы объявляете публичный сеттер, который предоставляет значение для этого поля. Другими словами, зависимость класса (поля) вводится внешним классом (через сеттер). Вот и все. Ничего волшебного.

Во-вторых, Spring можно использовать без XML (или очень мало)

Если вы погружаетесь с Spring 3.0.5.GA или выше, вы можете использовать поддержку впрыска зависимостей от JDK6 +. Это означает, что вы можете подключать зависимости, используя @Component и @Resource аннотации.

Зачем использовать Spring вообще?

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

В стороне, Spring также предоставляет множество шаблонов, которые выступают в качестве базовых классов, чтобы использовать с использованием стандартных технологий JEE легкий ветерок для работы. Например, JdbcTemplate хорошо работает с JDBC, JpaTemplate отлично справляется с JPA, JmsTemplate делает JMS довольно простой. RestTemplate просто потрясающий в своей простоте. Например:

RestTemplate restTemplate = new RestTemplate ();
MyJaxbObject o = restTemplate.getForObject ("https://secure.example.org/results/{param1}?param2={param2}", MyJaxbObject.class, "1", "2");

и все готово. Параметры вводятся, и вам просто нужно предоставить аннотации JAXB для MyJaxbObject. Это не требует никакого времени, если вы сгенерировали их с помощью XSD с помощью плагина Maven JAXB. Обратите внимание, что там не было никакого кастинга, и не было необходимости объявлять маршаллера. Это все сделано для вас.

Я мог бы навсегда наброситься на чудеса весны, но, может быть, самое лучшее, что можно сделать, это попробовать простую кодовую шину, где вы пытаетесь подключить веб-службу RESTful, чтобы откачивать данные от внедренного DAO, который поддерживает транзакции.

ответил Gary Rowe 13 J000000Wednesday11 2011, 00:40:08
26

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

Инъекция зависимостей, как ее обычно понимают (и реализуемая Spring), означает, что зависимости, которые класс класса имеет (например, источник данных JDBC), не извлекаются самим классом, а «инъецируются» контейнером при создании экземпляра. Таким образом, у вас нет двух версий каждого метода, который использует Datasource; вместо этого у вас есть одна конфигурация впрыска зависимостей, где вводится «реальный» источник данных, и один, куда вводится макет. Или, если инъекция происходит через конструктор или геттер, тестовый код может сделать инъекцию явно.

Во-вторых, Spring - это не просто инъекция зависимостей, хотя это ее основная функциональность. Он также предоставляет декларативные транзакции, планирование заданий, аутентификацию и множество других функций (включая полноценную веб-фреймворк MVC), которые могут вам понадобиться. Существуют и другие среды, которые обеспечивают ту же функциональность, но помимо Spring, только Java EE объединяет их все.

ответил Michael Borgwardt 13 J000000Wednesday11 2011, 01:34:16
18

Для чего вы хотите использовать Spring, вы можете прочитать его на http://www.wrox.com/WileyCDA/Section/Why-Use-the-Spring-Framework-.id-130098.html

Вкратце:

  • Приложения J2EE, как правило, содержат чрезмерное количество «сантехники», код. Многие обзоры кода неоднократно показывают высокую долю код, который ничего не делает: код поиска JNDI, объекты переноса, try /catch блоки для приобретения и выпуска ресурсов JDBC. , , , Письмо и поддержание такого сантехнического кода доказывает значительную утечку ресурсов которые должны быть сфокусированы на бизнес-области приложения.

  • Многие приложения J2EE используют распределенную объектную модель, где это неуместна. Это одна из основных причин чрезмерного кода и дублирование кода. Во многих случаях это также концептуально неправильно; внутренне распределенные приложения более сложны, чем совместные приложений и часто гораздо менее результативны. Конечно, если бизнес-требования диктуют распределенную архитектуру, вам нужно реализовать распределенную архитектуру и принять компромисс, который incurs (и Spring предлагает функции, которые помогут в таких сценариях). Но вы не должны делать это без веской причины.

  • Модель компонента EJB неоправданно сложна. EJB был задуман как способ снижения сложности при внедрении бизнес-логики в J2EE Приложения; он не преуспел в этой цели на практике.

  • EJB чрезмерно используется. EJB был по существу разработан для внутренних распределенных транзакционных приложений. Хотя почти все нетривиальные приложения являются транзакционными, распространение не должно модель базового компонента.

  • Многие «шаблоны проектирования J2EE» не являются, по сути, шаблонами проектирования, но обходные пути для ограничений технологии. Чрезмерное использование распределения и использование сложных API-интерфейсов, таких как EJB, вызвало много сомнительных шаблоны проектирования; важно изучить эти критически и посмотреть для более простых, более продуктивных подходов.

  • Приложения J2EE трудно тестировать. API J2EE и особенно модель компонента EJB, были определены до проворного движение взлетел. Таким образом, их конструкция не учитывает легкость модульного тестирования. Через API и неявные контракты на удивление трудно тестировать приложения на основе EJB и многих другие J2EE API за пределами сервера приложений. Однако модульное тестирование вне сервера приложений важно для достижения высокого теста охвата и воспроизвести многие сценарии отказа, такие как потеря подключение к базе данных. Также важно обеспечить, чтобы тесты могут быть быстро запущены в процессе разработки или обслуживания, минимизируя непроизводительное время ожидания перераспределения.

  • Некоторые технологии J2EE просто провалились. Главный преступник здесь это сущностные бобы, которые оказались мало чем катастрофическими для производительности и в их ограничениях на объектную ориентацию.

ответил Rudy 15 J000000Friday11 2011, 15:02:16
12

Раньше мы писали простые, эффективные, быстрые приложения и веб-сервисы, используя только основные Java, сервлеты и JSP, html и xml, JDBC API. Это было достаточно хорошо; JUnit был хорошим инструментом для тестирования. Мы легко отдохнули, что наш код работал.

Hibernate приступил к упрощению SQL и включил истинное сопоставление таблиц базы данных с объектами Java, позволяя отображать иерархические отношения в сопоставлении отношений объектов или ORM, как мы его называем. Я люблю это. Особенно, что нам не пришлось сопоставлять ResultSet обратно в объект Java или тип данных.

Пришла Struts, чтобы добавить шаблон Model View Controller в наши веб-приложения, это было хорошо.

EJBs были огромными накладными расходами, а боль и аннотации сделали код похожим на куриную царапину, и теперь весна получила от нас невинных людей. Мне просто кажется, что я переусердствовал.

Например, мы теперь упакуем наш простой jdbc url, user, сначала переходим в jdbc.properties, а затем в свойства hibernate second, а затем в Spring beans в третий раз!

В сравнении со всем этим, подумайте о том, чтобы получить соединение там, где вам нужно, это так просто, как показано ниже в чистом java, что мы действительно делаем после прохождения всего этого горячего эфира с помощью Spring:

Connection connection = DriverManager.getConnection (url, user, pass);

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

Другим примером является пакетное обновление. С Spring он запутан с участием довольно многих классов, интерфейсов, прежде чем вы сможете использовать JdbcTemplate для пакетного обновления. С простым jdbc его просто:

Statement statement = connection.createStatement ();
statement.addBatch (SQLQuery);
statement.executeBatch ();

Не может быть проще или быстрее.

Я не поддерживаю эту структуру. Сожалею. Кто на земле хочет делать инъекции каждый раз, когда им что-то нужно?

ответил Uma 15 J0000006Europe/Moscow 2012, 13:04:30
12
  

Что делает платформа Spring?

Весна как сегодня не только, так называемая простая структура, это полная экосистема.

Темы, охватываемые весенней экосистемой:

  • Spring Framework (например, Injection Dependency, AOP ...)

  • Весеннее облако

  • Данные о Spring

  • Безопасность Spring

  • Весенняя партия

  • Весна Социальная

См. здесь для полного охвата экосистемы. Это возможно для проектов вишневого выбора, чтобы вы могли использовать Google Guice для DI и, например, Spring Security для решения связанных с безопасностью вещей. Вам не нужно покупать всю экосистему.

Сама Spring-каркас охватывает главным образом

  • Инъекция зависимостей

  • Аспектно-ориентированное программирование, включающее декларативное управление транзакциями Spring

  • Веб-приложение Spring MVC и веб-служба RESTful

  • Основанная поддержка JDBC, JPA, JMS

Источник spring.io

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

Для чего он (основной-каркас) наиболее известен, это его возможности в области инъекции зависимостей . Сама Spring имеет, что называется инверсия контейнера управления или короткая контейнер IoC или даже более короткий контейнер (для которого иногда используется« весна »).

Что такое инъекция зависимостей?

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

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

public class Car {

    Двигатель e;

    public Car () {
        e = новый движок ();
    }

}

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

Теперь вступает в игру инъекция зависимостей :

public class Car {

    Двигатель e;

    общественный автомобиль (двигатель e) {
        this.e = e;
    }

}

После этого вы можете переключать двигатели. То, что вы видите выше, называется конструктором инъекции . Существуют и другие типы, например, например. setter -инъекция или метод -инъекция. Как весна помогает вам в этом? Spring позволяет отмечать компоненты, которые нужно вставить с помощью аннотации @Autowired, и автоматически подключает объект инъекции - вероятно, что компонент, который вы хотите вставить, имеет собственные зависимости. Инъекции - так сказать - отмечены через @Component

public class Car {

    Двигатель e;

    @Autowired
    общественный автомобиль (двигатель e) {
        this.e = e;
    }

}

Но это лишь одна из многих функций, которые предлагает Spring.

  

Должен ли я использовать Spring? Почему или почему нет?

Так как Spring не очень навязчивый и предлагает множество вспомогательных средств, вы должны использовать весну. Особенно для новых проектов, Весенняя загрузка очень привлекательна. start.spring.io предлагает простой в использовании point'n'click -interface для создания шаблона проекта для начала работы. Для извлечения шаблона можно использовать curl:

curl start.spring.io

  , ____ _ __ _ _
 /\\ /___'_ __ _ _ (_) _ __ __ _ \ \ \ \
(() \ ___ | '_ |' _ | | '_ \ /_` | \ \ \ \
 \\ /___) | | _) | | | | | || (_ | |))))
  '| ____ | .__ | _ | | _ | _ | | _ \ __, | ////
 ========= | _ | ============== | ___ /= /_ /_ /_ /

:: Spring Initializr :: https://start.spring.io

Эта служба создает проекты быстрого запуска, которые можно легко настроить.
Возможные настройки включают зависимости проекта, версию Java и
построить систему или построить структуру. Подробнее см. Ниже.

Сервисы используют формат гипермедиа, основанный на HAL, для предоставления набора ресурсов
для взаимодействия. Если вы обращаетесь к этому корневому ресурсу, запрашивающему приложение /json
как тип носителя, ответ будет содержать следующие ссылки:
+ ----------------- + ------------------------------- ---------- +
| Rel | Описание |
+ ----------------- + ------------------------------- ---------- +
| gradle-build | Создайте файл сборки Gradle |
| град-проект | Создайте архив проекта на основе Gradle |
| maven-build | Создайте Maven pom.xml |
|maven-project * | Создайте архив проекта на основе Maven |
+ ----------------- + ------------------------------- ---------- +

...

С другой стороны, такие рамки, как искра или dropwizard - хорошая отправная точка для быстрого создания веб-приложений.

ответил Thomas Junk 15 J0000006Europe/Moscow 2015, 14:35:10
4

Это фреймворк, написанный на Java с множеством вещей, включенных для обеспечения функциональности вашего веб-приложения (например, поддержки интернационализации). Он также обеспечивает хороший способ структурирования вашего приложения в слои. Используйте его, это сэкономит вам много времени в долгосрочной перспективе.

Хорошая книга, чтобы узнать о Spring: Expert Spring MVC и веб-поток

ответил Bernard 12 J000000Tuesday11 2011, 23:13:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132