Ответ
Нет, аннотация @Autowired не является обязательной при использовании чистой XML-конфигурации. Spring может внедрять зависимости, описанные в XML-файле, без каких-либо аннотаций в коде.
Сравнение подходов:
-
Чистая XML-конфигурация (без
@Autowired):<bean id="userRepository" class="com.example.UserRepositoryImpl"/> <bean id="userService" class="com.example.UserService"> <!-- Явное указание зависимости через property или constructor-arg --> <property name="repository" ref="userRepository"/> </bean>public class UserService { private UserRepository repository; // Setter для внедрения из XML public void setRepository(UserRepository repository) { this.repository = repository; } } -
Гибридный подход (XML +
@Autowired):<!-- Включаем поддержку аннотаций --> <context:annotation-config/> <bean id="userRepository" class="com.example.UserRepositoryImpl"/> <bean id="userService" class="com.example.UserService"/> <!-- Зависимость не описана в XML -->public class UserService { @Autowired // Spring сам найдет бин подходящего типа private UserRepository repository; }
Ключевые моменты:
- Без
@Autowiredзависимости должны быть явно объявлены в XML через<property>или<constructor-arg>. - С
@Autowiredконфигурация в XML становится минимальной (только объявление бинов), а связи между ними Spring устанавливает автоматически по типу. - Для работы
@Autowiredв XML необходимо добавить<context:annotation-config/>.
Выбор подхода: Зависит от стиля проекта. Чистый XML дает полную явность конфигурации в одном месте, а @Autowired сокращает объем XML и позволяет использовать автодополнение в IDE.
Ответ 18+ 🔞
Да ты посмотри, какая история-то разворачивается! Прямо как в том анекдоте про Герасима, только тут не Муму топить, а разбираться, как эти ваши бины друг в друга залезают. Так вот, слушай сюда, распиздяй.
Про аннотацию @Autowired — это ж классика! Все думают, что без неё нихуя не работает, как без воды и ни туды и не сюды. Ан нет, блядь! Если ты консерватор старовер и пишешь конфигурацию в чистом XML, как деды завещали, то можешь её нахуй вообще выкинуть. Вообще! Spring и так всё схарчит.
Смотри, как раньше, по-старинке делали:
Пишешь в XML вот такую простыню, понятную даже мартышке:
<bean id="userRepository" class="com.example.UserRepositoryImpl"/>
<bean id="userService" class="com.example.UserService">
<!-- Вот тут, блядь, прямо пальцем показываешь: "Слушай, Spring, ты этому сервису вот ЭТУ репу воткни!" -->
<property name="repository" ref="userRepository"/>
</bean>
А в коде пишешь обычный сеттер, без всяких выебонов:
public class UserService {
private UserRepository repository;
// Просто метод, который принимает репу. Никакой магии!
public void setRepository(UserRepository repository) {
this.repository = repository;
}
}
Всё! Работает. Spring видит тег <property>, вызывает сеттер и впендюривает зависимость. Никаких аннотаций, всё наглядно, как на ладони. Прям Тургенев, блядь, «Муму» — трагедия, но простая и ясная.
А теперь смотри, как щас модно, с прибамбасами:
Включаешь в XML волшебную палочку:
<!-- Говоришь Spring: "Эй, дружок, теперь читай ещё и аннотации, не будь бараном!" -->
<context:annotation-config/>
<bean id="userRepository" class="com.example.UserRepositoryImpl"/>
<bean id="userService" class="com.example.UserService"/>
<!-- А где же связь-то? А её и нету! Spring сам догадается. -->
А в коде уже делаешь по-хитрому:
public class UserService {
@Autowired // И тут говоришь: "Слушай, Spring, мне сюда что-нибудь подходящее сунь, а я посмотрю!"
private UserRepository repository;
}
И Spring, такой: «О, ёпта! Вижу поле, вижу @Autowired. Так, смотрю в свой мешок с бинами... Ага, есть один бин типа UserRepository! На, получай, мудила!». И всё, внедрил. XML стал короче, но зато надо помнить про эту ебучую аннотацию.
Так в чём же, блядь, соль?
- Без
@Autowired— ты сам, как Герасим, берёшь собаку за ошейник и ведёшь её на цепочке (в XML). Всё под контролем, всё явно. Но писать дохуя. - С
@Autowired— ты как бы намекаешь Spring: «Слушай, там где-то бегает собака по имениUserRepository, поймай её и приведи ко мне, а я буду делать вид, что не я это организовал». Конфигурация компактнее, но если бинов несколько одного типа — пиши пропало, будет конфликт, пиздец.
Что выбирать? Да хуй его знает! Если любишь, чтобы всё было как на параде, документировано в одном XML-файле — работай по-старинке. Если тебе похуй на явность, но охота, чтобы код был «чистым» и поменьше писанины в XML — вешай @Autowired и не парься. Главное — не начинай мешать оба подхода в одной тарелке без надобности, а то получится каша, в рот меня чих-пых, разобраться будет невозможно.