Каков точный смысл инвазивного? и что делает Spring неинвазивным?
Я новичок в структуре spring. В большинстве обучающих программ spring, которые я видел, spring описывается как "неинвазивный".
Что подразумевается под инвазивным? Каковы достоинства использования spring в Java и что делает его неинвазивным?
Ответы
Ответ 1
Если контейнер IoC является инвазивным, это означает, что ваш код должен быть явно осведомлен об инъекции зависимостей. Например, в Guice вы используете аннотацию @Inject
(и другие). Эти аннотации более стандартизированы, чем они были, что хорошо - это означает, что с помощью одного набора аннотаций, которые вы можете (по крайней мере теоретически), сделать ваш код доступным для использования с различными различными инвазивными контейнерами IoC.
С неинвазивным контейнером вы можете писать свой код без ссылки на IoC вообще... все просто определяется отражением элементов и аннотаций, которые будут присутствовать, даже если вы не используете IoC.
Есть плюсы и минусы как инвазивных, так и неинвазивных контейнеров - более конкретный код может дать вам больше контроля над некоторыми деталями привязки, например, - но стоит осознавать разницу.
Ответ 2
проверить http://forum.springsource.org/showthread.php?27846-Spring-is-non-invasive
Что это значит?
"Вы не обязаны импортировать или расширять любые API-интерфейсы Spring, например Struts заставляет вас продлить действие".
Конечно, в некоторых областях, таких как веб-фреймворк, невозможно избежать использования кода приложения в зависимости от структуры. Но Spring последовательно пытается достичь неинвазивного идеала, в котором рассматривается управление конфигурацией
Ответ 3
Spring может быть инвазивным и неинвазивным, это зависит только от вас.
Неинвазивный spring не использует аннотации (например, @Autowired), ни его собственные классы (например, JdbcTemplate), он использует конфигурацию только для соединения вашего beans (простого POJO) (вам все равно придется инициализируйте spring каким-то образом в вашем коде, что в любом случае немного инвазивно). Но вы можете отказаться от spring без существенных изменений кода. С другой стороны, Invasive spring предоставляет вам классы шаблонов (для настойчивости, веб-сервисов,...), аннотации и другие материалы, которые вы не можете просто оставить без рефакторинга (если вы их используете).
EDIT: Некоторые говорят, что spring не является инвазивным, поскольку он не заставляет вас реализовывать интерфейсы и не расширять классы. Для меня структура не является инвазивной, если ее можно легко заменить.
Ответ 4
Большинство java-фреймворков заставляют вас расширять один из своих классов или реализовать один из своих интерфейсов. Пример такого инвазивного модель программирования была EJB двухсекундной сессией без состояния beans, ранее версии Struts, WebWork, Tapestry.
Spring позволяет избежать засорения вашего кода с помощью API. Spring никогда не заставляет вы реализуете специальный интерфейс Spring или расширяете Spring -специфический класс. Вместо этого у классов часто нет что theyre используется Spring.
public class HelloWorld {
public String hello() {
return "Hello World";
}
}
Это простой Java-класс (POJO). Ничто не указывает, что его Spring. Spring неинвазивный означает, что этот класс может хорошо функционируют в приложении Spring, как это могло бы быть в приложение Spring. Хотя POJO просты, они могут быть мощный.
Одним из способов, по которым POJO может стать мощным в Spring, является использование Dependeny Injection.
Ответ 5
Структура Spring считается неинвазивным средством, которое не заставляет программиста расширять или реализовывать свой класс из любого предопределенного класса или интерфейса, заданного API Spring, в struts, которые мы использовали для расширения права Action Class почему стойки считаются инвазивными.
В случае рамок struts это заставит программиста, что класс программиста должен простираться от базового класса, предоставляемого API struts.
Ответ 6
Используйте @Resource и @Inject вместо @Component и @Autowired. Он действительно полезен и стандартизирован в средах DI, таких как Spring и Guice.
Ответ 7
Инвазивный смысл - очень быстро распространяется. Весенний автор говорит, что такие каркасы, как EJB, Struts и т.д., Полны специфического кода фреймворка, который трудно переносить на другие структуры, которые противоречат философии Java, которые пишутся один раз и запускаются где угодно. Spring говорит, что он неинвазивный, потому что он использует POJO для написания серверной части, поэтому его можно перенести на любую платформу. Но, как было предложено, по крайней мере, 2 вкладчиками в этом посте, spring - это рак, противоречащий тому, что он утверждает
spring - это рак для проекта, который, когда он заразил ваш проект, вы ничего не можете сделать без взлома в конфигурационных файлах весны... неинвазивный, довольно обманчивый на этом фронте! - user177800 11 мар в 7:18
Ответ 8
Инвазивная структура означает, что вы можете расширить один из своих классов или реализовать один из своих интерфейсов. Вы можете видеть это в таких фреймах, как Struts или EJB2. Spring не является инвазивной, потому что это избегает. В худшем случае класс может быть аннотирован одной из аннотаций Spring, но в противном случае это POJO. Так что вам нужно только POJO:
package com.habuma.spring;
public class HelloWorldBean {
public String sayHello() {
return "Hello World";
}
}