Способы инъекции в Spring 3.

Рейтинг: 1Ответов: 1Опубликовано: 17.06.2011

Здравствуйте. По-тихоньку изучаю Spring 3 MVC, и наткнулся на такую штуку, как @Inject. Я прекрасно понял, что она делает инъекцию в создаваемый класс (например, класс контроллера). Далее, начал разбираться, откуда берется инициализированный класс. И нашел только, что он объявляется в контексте приложения (app-context.xml). И там-же, в этом xml-файле, указываем параметры, которые надо закинуть в сеттер-методы этого класса. Вот так:

<bean id="someId" class="rct.gomel.beans.MyClass">
    <property name="pole_class" value="мае валюэ"/>
</bean>

Все это даже очень понятно. Но неужели можно инъектить только таким способом??? Если да, то напрашивается такой вопрос:

Не легче ли просто в этом классе, куда надо инъектить сделать так:

@Controller//Означает, что это контроллер.
public class NewController {
    private MyClass class = new MyClass("параметр1", параметр_2, 52);
    ... ... ...

Все равно же и так и так результат будет одинаков.
Я просто не совсем улавливаю смысла, зачем реализовали такую возможность, тратили на это время?

Ответы

▲ 3Принят

Касательно new и инъекции: ваш вопрос происходит из-за недостаточного понимания главной концепции на которой построен весь Spring -- инъекция зависимостей (Dependency Injection). Ваш пример сам по себе не очень удачен, потому что вся сила внедрения зависимостей раскрывается при использовании интерфейсов. В таком случае вы в своём классе объявляете переменную с типом нужного интерфейса, а Spring подставляет необходимую имплементацию этого интерфейса. Т.о. ваш код не зависит от конкретной реализации (меньше связность) и вы в любой момент можете поменять реализацию этого класса, не изменяя класс(ы), в которых он используется.

Кроме того, Spring также следит и за областью жизни объекта (т.е. Scope). Например, все бины по умолчанию имеют Singleton scope, что означает, что они всегда представлены в единственном экземпляре.

Естественно, что это не все плюсы и удобства, которые даёт эта технология.

Кстати, @Inject в Spring-е поддерживается, но скорее ради совместимости с JSR-330, в большинстве же случаев используется "родной" @Autowired.

Рекомендую прочитать официальную документацию (на английском) про бины, устройство контейнера, контекст и как это всё работает.

Я уже начинаю сомневаться в правильности моего выбора изучать Spring. Потому что, как видно, мало Spring-специалистов (только один ответ). И следовательно, Spring мало нужен.

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