HTML Diff
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