0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: spring, java, spring context, данные, объединить компоненты в одно приложение, servicedependency, myservice, автоматическое разрешение зависимостей, mainclass, @сonfiguration, @componentscan, spring-аннотации, @service, beans, @autowired, компоненты</p>
1
<p>Теги: spring, java, spring context, данные, объединить компоненты в одно приложение, servicedependency, myservice, автоматическое разрешение зависимостей, mainclass, @сonfiguration, @componentscan, spring-аннотации, @service, beans, @autowired, компоненты</p>
2
<p>Под словом "Spring" обычно подразумевают просто IoC-контейнер, помогающий структурировать Java-приложения. В действительности под словом "Spring" скрывается целый мир.</p>
2
<p>Под словом "Spring" обычно подразумевают просто IoC-контейнер, помогающий структурировать Java-приложения. В действительности под словом "Spring" скрывается целый мир.</p>
3
<p>IoC-контейнер, это замечательный способ собрать приложение "по кусочкам" из разных компонентов. Spring же предоставляет удобные способы как написания данных "кусочков", так и объединения их в единое приложение. Например, у нас есть два класса.</p>
3
<p>IoC-контейнер, это замечательный способ собрать приложение "по кусочкам" из разных компонентов. Spring же предоставляет удобные способы как написания данных "кусочков", так и объединения их в единое приложение. Например, у нас есть два класса.</p>
4
<p>Сервис:</p>
4
<p>Сервис:</p>
5
class MyService { private ServiceDependency dependency; public MyService(ServiceDependency dependency) { this.dependency = dependency; } public void usefulWork() { this.dependency.dependentWork(); } }<p>И его зависимость:</p>
5
class MyService { private ServiceDependency dependency; public MyService(ServiceDependency dependency) { this.dependency = dependency; } public void usefulWork() { this.dependency.dependentWork(); } }<p>И его зависимость:</p>
6
class ServiceDependency { // fields public ServiceDependency() { } public void dependentWork() { // any actions } }<p>Данные, компоненты уже достаточно неплохо. Наличие же интерфейсов мы для простоты опустим. Самый простой способ объединить эти компоненты в единое приложение - это написать что-то вроде:</p>
6
class ServiceDependency { // fields public ServiceDependency() { } public void dependentWork() { // any actions } }<p>Данные, компоненты уже достаточно неплохо. Наличие же интерфейсов мы для простоты опустим. Самый простой способ объединить эти компоненты в единое приложение - это написать что-то вроде:</p>
7
public class MainClass { public static void main(String[] args) { ServiceDependency dep = new ServiceDependency(); MyService service = new MyService(dep); service.usefulWork(); } }<p>Несмотря на простоту, данный код обладает серьёзными недостатками, которые являются критическими для больших проектов. Действительно, в данном примере вполне очевидно, что экземпляр класса<strong>ServiceDependency</strong>необходимо создавать раньше, чем экземпляр объекта<strong>MyService</strong>. А в больших проектах таких сервисов и зависимостей может быть столько, что перебор программистом порядка создания объектов занимал бы совсем неприличное время.</p>
7
public class MainClass { public static void main(String[] args) { ServiceDependency dep = new ServiceDependency(); MyService service = new MyService(dep); service.usefulWork(); } }<p>Несмотря на простоту, данный код обладает серьёзными недостатками, которые являются критическими для больших проектов. Действительно, в данном примере вполне очевидно, что экземпляр класса<strong>ServiceDependency</strong>необходимо создавать раньше, чем экземпляр объекта<strong>MyService</strong>. А в больших проектах таких сервисов и зависимостей может быть столько, что перебор программистом порядка создания объектов занимал бы совсем неприличное время.</p>
8
<p>Хочется автоматического разрешения зависимостей, и чтобы даже не задумываться о создании объектов. Здесь и приходит на помощь Spring, а если быть точнее, то Spring Context. Модифицируем немного наши классы, добавив так называемые аннотации стереотипов.</p>
8
<p>Хочется автоматического разрешения зависимостей, и чтобы даже не задумываться о создании объектов. Здесь и приходит на помощь Spring, а если быть точнее, то Spring Context. Модифицируем немного наши классы, добавив так называемые аннотации стереотипов.</p>
9
import org.springframework.stereotype.Service; @Service class MyService { @Service class ServiceDependency { Ну и, конечно, MainClass: @Configuration @ComponentScan public class MainClass { public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(MainClass.class); MyService service = ctx.getBean(MyService.class) service.usefulWork(); } }<p>И всё! Обратите внимание, что здесь не написано ни одно<strong>new</strong>наших сервисов.</p>
9
import org.springframework.stereotype.Service; @Service class MyService { @Service class ServiceDependency { Ну и, конечно, MainClass: @Configuration @ComponentScan public class MainClass { public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(MainClass.class); MyService service = ctx.getBean(MyService.class) service.usefulWork(); } }<p>И всё! Обратите внимание, что здесь не написано ни одно<strong>new</strong>наших сервисов.</p>
10
<h2>Разберём подробнее</h2>
10
<h2>Разберём подробнее</h2>
11
<p><strong>MainClass</strong>помечен аннотацией<strong>@Сonfiguration</strong>, говорящей о том, что в данном классе содержится конфигурация так называемого контекста Spring.</p>
11
<p><strong>MainClass</strong>помечен аннотацией<strong>@Сonfiguration</strong>, говорящей о том, что в данном классе содержится конфигурация так называемого контекста Spring.</p>
12
<p>Как ни странно, из конфигурации в данном классе только аннотация<strong>@ComponentScan</strong>, которая говорит Spring искать все классы, помеченные Spring-аннотациями (в частности аннотациями стереотипов<strong>@Service</strong>).</p>
12
<p>Как ни странно, из конфигурации в данном классе только аннотация<strong>@ComponentScan</strong>, которая говорит Spring искать все классы, помеченные Spring-аннотациями (в частности аннотациями стереотипов<strong>@Service</strong>).</p>
13
<p>Каждый класс помечен аннотацией<strong>@Service</strong>. Данные аннотация говорит Spring создать экземпляр объекта данного класса и положить его в некоторое множество таких объектов. Такие объекты, собственно, и называются<strong>beans</strong>, а множество таких объектов, соответственно, называется контекстом.</p>
13
<p>Каждый класс помечен аннотацией<strong>@Service</strong>. Данные аннотация говорит Spring создать экземпляр объекта данного класса и положить его в некоторое множество таких объектов. Такие объекты, собственно, и называются<strong>beans</strong>, а множество таких объектов, соответственно, называется контекстом.</p>
14
<p>Ну и в методе<strong>main</strong>создаётся тот самый контекст: Spring автоматически определит зависимости<strong>beans</strong>друг с другом (начиная со Spring 4.0 наличие аннотации<strong>@Autowired</strong>не обязательно, если есть ровно один конструктор) и создаст экземпляры объектов в нужном порядке. Остаётся только получить экземпляр этого объекта и вызвать метод.</p>
14
<p>Ну и в методе<strong>main</strong>создаётся тот самый контекст: Spring автоматически определит зависимости<strong>beans</strong>друг с другом (начиная со Spring 4.0 наличие аннотации<strong>@Autowired</strong>не обязательно, если есть ровно один конструктор) и создаст экземпляры объектов в нужном порядке. Остаётся только получить экземпляр этого объекта и вызвать метод.</p>
15
<p>Данный пример, разумеется, рассматривает только один из вариантов создания beans в Spring Context. В действительности, возможностей<strong>Spring Context</strong>гораздо больше.</p>
15
<p>Данный пример, разумеется, рассматривает только один из вариантов создания beans в Spring Context. В действительности, возможностей<strong>Spring Context</strong>гораздо больше.</p>
16
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
16
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
17
17