HTML Diff
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&lt;String, StringCallable&gt; map;<p>Spring автоматически подставит не только сами бины, но и имена бинов в качестве ключей. Это может быть эффективно использовано, например, в паттерне "стратегия".</p>
17 @Autowired private Map&lt;String, StringCallable&gt; map;<p>Spring автоматически подставит не только сами бины, но и имена бинов в качестве ключей. Это может быть эффективно использовано, например, в паттерне "стратегия".</p>
18 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
18 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
19  
19