HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: spring framework, программирование на java, аннотации в spring, классы логики в spring, класс-сервис helloservice</p>
1 <p>Теги: spring framework, программирование на java, аннотации в spring, классы логики в spring, класс-сервис helloservice</p>
2 <p>Итак, мы в прошлой<a>статье</a>создали контекст<strong>Spring</strong>- каркас для нашего приложения. Теперь давайте наполним контекст классами нашей логики.</p>
2 <p>Итак, мы в прошлой<a>статье</a>создали контекст<strong>Spring</strong>- каркас для нашего приложения. Теперь давайте наполним контекст классами нашей логики.</p>
3 <h2>Создадим контекст</h2>
3 <h2>Создадим контекст</h2>
4 @Configuration @ComponentScan public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Main.class); } }<p>Предположим, что логика нашего приложения представлена сервисом<strong>HelloService</strong>(должен быть расположен или в пакете вместе с Main или ниже:</p>
4 @Configuration @ComponentScan public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Main.class); } }<p>Предположим, что логика нашего приложения представлена сервисом<strong>HelloService</strong>(должен быть расположен или в пакете вместе с Main или ниже:</p>
5 public class HelloService { public HelloService() { // Этот конструктор добавлен чисто с педагогической целью System.out.println("Creating instance of HelloService"); } public String sayHello(String name) { return "Hello, " + name + "!"; } }<p>И добавим одну аннотацию:</p>
5 public class HelloService { public HelloService() { // Этот конструктор добавлен чисто с педагогической целью System.out.println("Creating instance of HelloService"); } public String sayHello(String name) { return "Hello, " + name + "!"; } }<p>И добавим одну аннотацию:</p>
6 @Service public class HelloService { //... }<p>Запустив наше приложение, мы увидим в консоли:</p>
6 @Service public class HelloService { //... }<p>Запустив наше приложение, мы увидим в консоли:</p>
7 &amp;gt; Creating instance of HelloService<p>И обратите внимание, что мы не писали самостоятельно new HelloService(), но экземпляр нашего сервиса был создан! Вот такой экземпляр, лежащий.</p>
7 &amp;gt; Creating instance of HelloService<p>И обратите внимание, что мы не писали самостоятельно new HelloService(), но экземпляр нашего сервиса был создан! Вот такой экземпляр, лежащий.</p>
8 <h2>Как это возможно?</h2>
8 <h2>Как это возможно?</h2>
9 <p>Давайте разберёмся в том, что произошло: 1. Мы написали класс-сервис<strong>HelloService</strong>, реализующий бизнес-логику. 2. У него есть<strong>конструктор по умолчанию</strong>. В принципе, экземпляр этого класса может создать и сторонний фреймворк, вроде<strong>Spring</strong>, используя рефлекшн. 3. Собственно, экземпляр HelloService и создаёт сам Spring, что мы увидели на консоли. 4. Создаёт этот экземпляр как раз тот самый AnnotationConfigApplicationContext контекст , который создали мы в методе main. 5. А как контекст нашёл этот HelloService ? Посмотрим на класс конфигурации Main (это он указан в конструкторе контекста и помечен @Configuration, поэтому он и наш класс). 6. На классе Main стоит ещё аннотация @ComponentScan. Если на каком-то классе-конфигурации присутствует такая аннотация, то<strong>Spring</strong>будет искать классы, помеченные другими аннотациями<strong>Spring</strong>. 7. Ну и как раз нашёлся класс, помеченный @Service, который и создаёт<strong>Spring</strong>, используя конструктор по умолчанию.</p>
9 <p>Давайте разберёмся в том, что произошло: 1. Мы написали класс-сервис<strong>HelloService</strong>, реализующий бизнес-логику. 2. У него есть<strong>конструктор по умолчанию</strong>. В принципе, экземпляр этого класса может создать и сторонний фреймворк, вроде<strong>Spring</strong>, используя рефлекшн. 3. Собственно, экземпляр HelloService и создаёт сам Spring, что мы увидели на консоли. 4. Создаёт этот экземпляр как раз тот самый AnnotationConfigApplicationContext контекст , который создали мы в методе main. 5. А как контекст нашёл этот HelloService ? Посмотрим на класс конфигурации Main (это он указан в конструкторе контекста и помечен @Configuration, поэтому он и наш класс). 6. На классе Main стоит ещё аннотация @ComponentScan. Если на каком-то классе-конфигурации присутствует такая аннотация, то<strong>Spring</strong>будет искать классы, помеченные другими аннотациями<strong>Spring</strong>. 7. Ну и как раз нашёлся класс, помеченный @Service, который и создаёт<strong>Spring</strong>, используя конструктор по умолчанию.</p>
10 <p>Конечно, нам хочется получить наш сервис, чтобы что-то сделать. Сделаем это:</p>
10 <p>Конечно, нам хочется получить наш сервис, чтобы что-то сделать. Сделаем это:</p>
11 @Configuration @ComponentScan public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Main.class); HelloService service = context.getBean(HelloService.class); System.out.println(service.sayHello("World")); } }<p>И наконец-то увидим:</p>
11 @Configuration @ComponentScan public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Main.class); HelloService service = context.getBean(HelloService.class); System.out.println(service.sayHello("World")); } }<p>И наконец-то увидим:</p>
12 &gt; Creating instance of HelloService &gt; Hello<p><em>Вот и всё, друзья! Узнать больше можно на<a>курсе</a>или, задав свой вопрос в комментарии.</em></p>
12 &gt; Creating instance of HelloService &gt; Hello<p><em>Вот и всё, друзья! Узнать больше можно на<a>курсе</a>или, задав свой вопрос в комментарии.</em></p>
13  
13