[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-kak-rabotaet-autowired-kakie-sushchestvuyut-sposoby-vnedreniya-zavisimostey":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},613,"kak-rabotaet-autowired-kakie-sushchestvuyut-sposoby-vnedreniya-zavisimostey",14,"spring","Spring","🌱","Как работает @Autowired? Какие существуют способы внедрения зависимостей?","`@Autowired` -- аннотация Spring, которая автоматически внедряет зависимости по типу (by type). Если найден ровно один бин подходящего типа, он будет внедрён.\n\n### Три способа внедрения зависимостей\n\n| Способ | Рекомендация | Причина |\n|--------|-------------|---------|\n| Через конструктор | Рекомендуется | Неизменяемость (final), обязательность, тестируемость без рефлексии |\n| Через сеттер | Допустимо | Для необязательных зависимостей |\n| Через поле | Не рекомендуется | Скрывает зависимости, требует рефлексии для тестов |\n\n```java\n\u002F\u002F 1. Через конструктор (рекомендуемый)\n@Service\npublic class UserService {\n    private final UserRepository userRepository;\n\n    \u002F\u002F С Spring 4.3 @Autowired можно не указывать при одном конструкторе\n    public UserService(UserRepository userRepository) {\n        this.userRepository = userRepository;\n    }\n}\n\n\u002F\u002F 2. Через сеттер\n@Service\npublic class UserService {\n    private UserRepository userRepository;\n\n    @Autowired\n    public void setUserRepository(UserRepository userRepository) {\n        this.userRepository = userRepository;\n    }\n}\n\n\u002F\u002F 3. Через поле (не рекомендуется)\n@Service\npublic class UserService {\n    @Autowired\n    private UserRepository userRepository;\n}\n```\n\n### Порядок разрешения зависимостей\n\n1. Ищет бин по типу\n2. Если найдено несколько -- ищет по имени поля\u002Fпараметра\n3. Если не найден -- `NoSuchBeanDefinitionException`\n4. Если найдено несколько и имя не совпадает -- `NoUniqueBeanDefinitionException`\n\n> **На собеседовании:** интервьюер ждёт обоснование, почему конструкторное внедрение лучше: immutability, обязательность, тестируемость, видимость нарушений SRP. Частая ошибка -- не знать про циклические зависимости и способы их решения (`@Lazy`, рефакторинг).","","junior",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":19,"featuredSnippetReady":22},"Как работает @Autowired? Какие существуют способы внедрения  — Gymterview","`@Autowired` -- аннотация Spring, которая автоматически внедряет зависимости по типу (by type). Если найден ровно один бин подходящего типа, он будет внедрён.","`@Autowired` -- аннотация Spring, которая автоматически внедряет зависимости по типу (by type). Если найден ровно один б",[7,13],true]