Нужна ли аннотация @Autowired при использовании XML-конфигурации Spring?

Ответ

Нет, аннотация @Autowired не является обязательной при использовании чистой XML-конфигурации. Spring может внедрять зависимости, описанные в XML-файле, без каких-либо аннотаций в коде.

Сравнение подходов:

  1. Чистая 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;
        }
    }
  2. Гибридный подход (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 и не парься. Главное — не начинай мешать оба подхода в одной тарелке без надобности, а то получится каша, в рот меня чих-пых, разобраться будет невозможно.