Что такое бины Spring и как их писать? | OTUS
⚡ Открываем подписку на курсы!
Проходите параллельно 3 онлайн-курса в месяц по цене одного.
Подробнее

Курсы

Программирование
Flutter Mobile Developer Подготовка к сертификации Oracle Java Programmer (OCAJP)
-8%
Алгоритмы и структуры данных
-12%
Web-разработчик на Python
-11%
Архитектура и шаблоны проектирования
-14%
JavaScript Developer. Basic Супер-интенсив «СУБД в высоконагруженных системах»
-18%
iOS-разработчик. Базовый курс
-23%
Разработчик на Spring Framework
-23%
Python Developer. Basic
-16%
C# ASP.NET Core разработчик
-18%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-6%
JavaScript Developer. Professional
-9%
Android Developer. Basic
-10%
C++ Developer. Professional MS SQL Server Developer Cloud Solution Architecture Highload Architect Reverse-Engineering. Professional CI/CD Vue.js разработчик Agile Project Manager Нереляционные базы данных Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Advanced Fullstack JavaScript developer
Инфраструктура
PostgreSQL
-10%
IoT-разработчик
-12%
Administrator Linux. Professional
-11%
Базы данных
-19%
Administrator Linux.Basic
-18%
Супер-интенсив «СУБД в высоконагруженных системах»
-18%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-6%
Сетевой инженер AWS для разработчиков Software Architect Reverse-Engineering. Professional CI/CD VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Что такое бины Spring и как их писать?

Spring_Deep_24.1_site-5020-5bd351.png

Итак, мы в прошлой статье создали контекст Spring — каркас для нашего приложения. Теперь давайте наполним контекст классами нашей логики.

Создадим контекст

    @Configuration
    @ComponentScan
    public class Main {

        public static void main(String[] args) {
            AnnotationConfigApplicationContext context =
                    new AnnotationConfigApplicationContext(Main.class);
        }
    }

Предположим, что логика нашего приложения представлена сервисом HelloService (должен быть расположен или в пакете вместе с Main или ниже:

    public class HelloService {

        public HelloService() {
            // Этот конструктор добавлен чисто с педагогической целью
            System.out.println("Creating instance of HelloService");
        }

        public String sayHello(String name) {
            return "Hello, " + name + "!"; 
        }
    }

И добавим одну аннотацию:

    @Service
    public class HelloService {
        //...
    }

Запустив наше приложение, мы увидим в консоли:

> Creating instance of HelloService

И обратите внимание, что мы не писали самостоятельно new HelloService(), но экземпляр нашего сервиса был создан! Вот такой экземпляр, лежащий.

Как это возможно?

Давайте разберёмся в том, что произошло: 1. Мы написали класс-сервис HelloService, реализующий бизнес-логику. 2. У него есть конструктор по умолчанию. В принципе, экземпляр этого класса может создать и сторонний фреймворк, вроде Spring, используя рефлекшн. 3. Собственно, экземпляр HelloService и создаёт сам Spring, что мы увидели на консоли. 4. Создаёт этот экземпляр как раз тот самый AnnotationConfigApplicationContext контекст , который создали мы в методе main. 5. А как контекст нашёл этот HelloService ? Посмотрим на класс конфигурации Main (это он указан в конструкторе контекста и помечен @Configuration, поэтому он и наш класс). 6. На классе Main стоит ещё аннотация @ComponentScan. Если на каком-то классе-конфигурации присутствует такая аннотация, то Spring будет искать классы, помеченные другими аннотациями Spring. 7. Ну и как раз нашёлся класс, помеченный @Service, который и создаёт Spring, используя конструктор по умолчанию.

Конечно, нам хочется получить наш сервис, чтобы что-то сделать. Сделаем это:

    @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"));
        }
    }

И наконец-то увидим:

    > Creating instance of HelloService
    > Hello 

Вот и всё, друзья! Узнать больше можно на курсе или, задав свой вопрос в комментарии.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться