Почему инфраструктура Spring называется "неинтрузивной"?

Рамка

Spring НЕ ИНТРУЗИВНАЯ.

Не могли бы вы рассказать об этом?

Спасибо:)

Ответ 1

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

Ответ 2

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

Ответ 3

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

Однако, чтобы быть действительно неинтрузивным с spring, вам нужно сохранить всю свою конфигурацию за пределами вашего кода, а это значит, что XML используется для всего. Это прекрасно работает в spring, но его боль в шее для разработчиков и, с появлением широкого использования аннотаций в Java 5, на самом деле не является способом java. Таким образом, Spring предоставляет множество аннотаций для соединения вещей непосредственно в вашем коде. Это может, очевидно, создавать зависимости от Spring внутри кода, хотя все теги Spring разрешаются во время компиляции, поэтому вы все равно можете выполнять свои классы вне контекста Spring без каких-либо зависимостей от флагов Spring и например. Кроме того, везде, где это возможно, пользовательские аннотации Spring были заменены на общие аннотации JEE. С помощью Spring 3 очень просто использовать только аннотации JEE плюс ограниченное количество XML для инициализации контекста приложения.

Красота способа Spring заключается в том, что базовая функциональность, которая реализует функцию, часто может быть выбрана во время выполнения. Если вы используете ORM-систему в не управляемом контейнере для разработки, используя собственный менеджер сеансов, вы можете легко переключиться на сеансы, управляемые контейнерами, без изменения какого-либо кода, если вы настроили приложение, чтобы позволить транзакции дескриптора Spring управление. Методы, отмеченные как @Transactional, автоматически собирают сеанс и транзакцию, независимо от источника, без каких-либо изменений кода. Фактически, вы можете тривиально переключиться на совершенно другую структуру ORM, если вы так склонны, хотя это довольно редкий случай использования, по правде говоря, поэтому большинство приложений, как правило, имеют специфический для ORM код и/или запросы в доступе к данным код.

Разница между Spring и старомодной "интрузивной" структурой заключается в том, что накладные фреймворки часто требуют, чтобы вы реализовали определенные интерфейсы или, что еще хуже, заставляли вас наследовать от определенных базовых классов, чтобы получить доступ к функциональности инфраструктуры. В последнем случае вы не только зависите от используемой вами структуры, но и строго ограничиваете свою иерархическую структуру классов - на языке, который допускает только одно наследование. Последние версии EJB узнали из элегантности менее навязчивой модели Spring (и других), а сам EJB стал намного менее навязчивым (все о POJO).

Я не вижу никакой поддержки для неоспоримого аргумента, что Spring теперь представляет собой миллиард долларов, который блокирует пользователей. Spring, если вообще, менее навязчивый, чем когда-либо, предлагая все больше функциональности. Разумеется, можно заблокировать себя в spring, и многие разработчики вполне готовы сделать это именно потому, что накладные расходы во время использования Spring настолько тривиально малы, что большинство из нас не может представить много сценариев в которые мы могли бы удалить Spring из проекта. Если я хочу полностью управляемую среду JEE, я могу настроить для нее (и запустить в контейнере любого доступного поставщика). Если я хочу работать в tomcat или причал со 100% конфигурации и управления временем выполнения из spring, я тоже могу это сделать. Поэтому я, как правило, очень рад использовать spring -специфическую функциональность, подверженную риску блокировки, если только требования проекта не запрещают это. Spring добавляет очень мало накладных расходов во время выполнения, поэтому это выбор с низким уровнем риска.

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

Ответ 4

лет назад был этот зверь EJB, который был очень "навязчивым". Spring рекламировался как гораздо более простой набор вспомогательных классов, и он больше напоминал библиотеки, чем фреймворки.

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

С EJB, по крайней мере, у вас есть несколько поставщиков на выбор.