среда, 5 октября 2011 г.

@Autowired vs @Inject

Вы когда-нибудь задавались вопросом: чем @Autowired отличается от @Inject и что из них предпочтительнее использовать?

Я до недавнего времени, тоже не задумывался, но потом всё чаще стал замечать, что сами разработчики из SpringSource в своих примерах используют аннотацию @Inject вместо, казалось бы, родной @Autowired.

@Inject является частью JSR-303, которая определяет базовые аннотации для DI-фреймворков. Начиная с третьей версии, если Spring находит в classpath JAR-файл с API этой спецификации, то автоматическая включается его поддержка. В простейшем случае это означает, что вместо @Autowired вы можете использовать @Inject.

В чем плюс использования @Inject? То, что он стандартизирован и, как следствие, вы получаете улучшение переносимости между различными DI-фреймворками (на данный момент это JavaEE 6, Spring 3.0 и Guice 2.0).

Из минусов можно выделить: а) добавление дополнительной зависимости б) отсутствует возможность задания опциональной зависимости (аналог @Autowired(required = false)). (Но насколько часто это надо и кто этим пользовался?..)

Если вы всё-таки решили использовать @Inject, то добавьте следующие строки в pom.xml:

Дальше, думаю, уже сами догадались:

Кроме инъекции непосредственно в члены класса, также поддерживается инъекция через setter-ы и конструкторы.

(Пост основан на вопросах/ответах со StackOverflow.com: What is the difference between @Inject and @Autowired, spring3 @autowired and @inject)

2 комментария:

  1. Не всегда возможно использовать Inject вместо Autowired. Например в EJB контейнере который уже работает с Inject (с помощью weld, например JBoss Wildfly). В этом случае если bean в Spring-контексте заинжектить с помощью Inject в EJB, то weld будет ругаться, что не знает такого бина.

    C autowired это возможно, Если задать @Interceptors(SpringBeanAutowiringInterceptor.class) то нужные бины подключаются по @Autowired из контекста, заданного в beanRefContext.xml

    ОтветитьУдалить
  2. How to Get from Tropicana Casino Hotel to Tropicana Casino
    Tropicana Hotel and Casino Resort. Tropicana 헬로우블랙잭 is a small, smoke-free casino located within a 포커 테이블 2-minute drive 룰렛 만들기 of Tropicana Atlantic City. Rating: 브라 벗기 미션 4.7 · 한게임 포커 클래식 ‎3 reviews

    ОтветитьУдалить