0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: servicedependency, myservice, @autowired, servicedependencyimpl, private-поля, конструктор, сеттеры, @qualifier, типизированные коллекции, @order, паттерн стратегия</p>
1
<p>Теги: servicedependency, myservice, @autowired, servicedependencyimpl, private-поля, конструктор, сеттеры, @qualifier, типизированные коллекции, @order, паттерн стратегия</p>
2
<p>Решил рассказать немного про аннотацию<strong>@Autowired</strong>. Принцип её работы очень прост.</p>
2
<p>Решил рассказать немного про аннотацию<strong>@Autowired</strong>. Принцип её работы очень прост.</p>
3
<p>Допустим у нас есть bean-зависимости:</p>
3
<p>Допустим у нас есть bean-зависимости:</p>
4
@Configuration public class Config { // тип бина - ServiceDependency, имя - dependency public ServiceDependency dependency() { return new ServiceDependencyImpl() } }<p>И есть класс сервиса:</p>
4
@Configuration public class Config { // тип бина - ServiceDependency, имя - dependency public ServiceDependency dependency() { return new ServiceDependencyImpl() } }<p>И есть класс сервиса:</p>
5
@Service public class MyService { private ServiceDependency dependency; @Autowired public MyService(ServiceDependency dependency) { this.dependency = dependency; } }<p>И при создании контекста Spring автоматически определит, что для создания<strong>MyService</strong>требуется bean типа<strong>ServiceDependency</strong>(или наследник), найдёт его у себя, в рамках подставит зависимость<strong>ServiceDependencyImpl</strong>в bean<strong>MyService</strong>.</p>
5
@Service public class MyService { private ServiceDependency dependency; @Autowired public MyService(ServiceDependency dependency) { this.dependency = dependency; } }<p>И при создании контекста Spring автоматически определит, что для создания<strong>MyService</strong>требуется bean типа<strong>ServiceDependency</strong>(или наследник), найдёт его у себя, в рамках подставит зависимость<strong>ServiceDependencyImpl</strong>в bean<strong>MyService</strong>.</p>
6
<p><em>На самом деле, начиная со Spring 4.0 аннотацию<strong>@Autowired</strong>можно не ставить на конструктор, если он единственный в классе.</em></p>
6
<p><em>На самом деле, начиная со Spring 4.0 аннотацию<strong>@Autowired</strong>можно не ставить на конструктор, если он единственный в классе.</em></p>
7
<h2>Другие варианты использования аннотации</h2>
7
<h2>Другие варианты использования аннотации</h2>
8
<p><strong>@Autowired</strong>можно ставить непосредственно на поле. Да-да, это будет работать и с private-полями:</p>
8
<p><strong>@Autowired</strong>можно ставить непосредственно на поле. Да-да, это будет работать и с private-полями:</p>
9
@Service public class MyService { @Autowired private ServiceDependency dependency; // бизнес-методы }<p>Также аннотацию можно ставить на сеттеры:</p>
9
@Service public class MyService { @Autowired private ServiceDependency dependency; // бизнес-методы }<p>Также аннотацию можно ставить на сеттеры:</p>
10
@Service public class MyService { private ServiceDependency dependency; @Autowired public void setDependency(ServiceDependency dependency) { this.dependency = dependency; } }<p>Но можно так же ставить и на отдельные методы, например:</p>
10
@Service public class MyService { private ServiceDependency dependency; @Autowired public void setDependency(ServiceDependency dependency) { this.dependency = dependency; } }<p>Но можно так же ставить и на отдельные методы, например:</p>
11
@Service public class MyService { private ServiceDependency dependency; @Autowired public void init(ServiceDependency dependency) { this.dependency = dependency; } }<h2>Что ещё?</h2>
11
@Service public class MyService { private ServiceDependency dependency; @Autowired public void init(ServiceDependency dependency) { this.dependency = dependency; } }<h2>Что ещё?</h2>
12
<p>Предположим, что бинов типа<strong>ServiceDependency</strong>несколько (допустим dependency1 и dependency2). Тогда, чтобы задать конкретный bean, необходимо использовать аннотацию<strong>@Qualifier</strong>:</p>
12
<p>Предположим, что бинов типа<strong>ServiceDependency</strong>несколько (допустим dependency1 и dependency2). Тогда, чтобы задать конкретный bean, необходимо использовать аннотацию<strong>@Qualifier</strong>:</p>
13
@Service public class MyService { private ServiceDependency dependency; @Autowired public void setDependency( @Qualifier("dependency1") ServiceDependency dependency ) { this.dependency = dependency; } }<h2>А если мы захотим использовать все бины?</h2>
13
@Service public class MyService { private ServiceDependency dependency; @Autowired public void setDependency( @Qualifier("dependency1") ServiceDependency dependency ) { this.dependency = dependency; } }<h2>А если мы захотим использовать все бины?</h2>
14
<p>Сделать это можно простым способом:</p>
14
<p>Сделать это можно простым способом:</p>
15
@Service public class MyService { private ServiceDependency[] dependencies; @Autowired public void setDependency(ServiceDependency[] dependencies) { this.dependency = dependency; } }<p>И Spring вставит (удивительно) все бины, реализующие интерфейс<strong>ServiceDependency</strong>. То же самое верно и для типизированных коллекций. Как ни странно, но порядком следования в этой коллекции можно управлять с помощью аннотации<strong>@Order</strong>.</p>
15
@Service public class MyService { private ServiceDependency[] dependencies; @Autowired public void setDependency(ServiceDependency[] dependencies) { this.dependency = dependency; } }<p>И Spring вставит (удивительно) все бины, реализующие интерфейс<strong>ServiceDependency</strong>. То же самое верно и для типизированных коллекций. Как ни странно, но порядком следования в этой коллекции можно управлять с помощью аннотации<strong>@Order</strong>.</p>
16
<h2>Но самое замечательное, вот это:</h2>
16
<h2>Но самое замечательное, вот это:</h2>
17
@Autowired private Map<String, StringCallable> map;<p>Spring автоматически подставит не только сами бины, но и имена бинов в качестве ключей. Это может быть эффективно использовано, например, в паттерне "стратегия".</p>
17
@Autowired private Map<String, StringCallable> map;<p>Spring автоматически подставит не только сами бины, но и имена бинов в качестве ключей. Это может быть эффективно использовано, например, в паттерне "стратегия".</p>
18
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
18
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
19
19