Рубрики
Без рубрики

Что такое весенняя фасоль?

Быстрое и практическое объяснение того, что такое Spring Bean.

Автор оригинала: Nguyen Nam Thai.

Что такое весенняя фасоль?

1. Обзор

Бин является ключевой концепцией Весенней рамочной программы. Таким образом, понимание этого понятия имеет решающее значение для того, чтобы повесить рамки и использовать его эффективным способом.

К сожалению, Есть не четкие ответы на простой вопрос – что весенний боб на самом деле. Некоторые объяснения идут на такой низкий уровень, что большая картина упущена, в то время как некоторые из них слишком расплывчаты.

Этот учебник будет пытаться пролить свет на эту тему, начиная с описания в официальной документации.

Дальнейшее чтение:

Почему выберите Spring в качестве фреймворка Java?

Понимание getBean() весной

2. Определение фасоли

Вот определение бобов в весенняя рамочная документация :

Весной объекты, которые составляют основу приложения и управляются контейнером Spring IoC, называются бобами. Фасоль – это объект, который мгновенно собирается, собирается и иным образом управляется контейнером Spring IoC.

Это определение является кратким и попадает в точку, но упускает важную вещь – контейнер Spring IoC. Давайте вниз кроличью нору, чтобы увидеть, что это такое и выгоды, которые она приносит дюйма

3. Инверсия контроля

Проще говоря, Я nversion контрольных , или IoC для краткости, процесс, в котором объект определяет свои зависимости, не создавая их. Этот объект делегирует работу по построению таких зависимостей контейнеру IoC.

Начнем с объявления нескольких классов доменов, прежде чем погрузиться в IoC.

3.1. Классы доменов

Предположим, что у нас есть классовая декларация:

public class Company {
    private Address address;

    public Company(Address address) {
        this.address = address;
    }

    // getter, setter and other properties
}

Этот класс нуждается в сотруднике типа Адрес :

public class Address {
    private String street;
    private int number;

    public Address(String street, int number) {
        this.street = street;
        this.number = number;
    }

    // getters and setters
}

3.2. Традиционный подход

Как правило, мы создаем объекты со конструкторами классов:

Address address = new Address("High Street", 1000);
Company company = new Company(address);

В этом подходе нет ничего плохого, но не было бы неплохо лучше управлять зависимостями?

Представьте себе приложение с десятками или даже сотнями классов. Иногда мы хотим поделиться одним экземпляром класса по всему приложению, иногда нам нужен отдельный объект для каждого случая использования и так далее.

Управление таким количеством объектов является не чем иным, как кошмаром. Это где Инверсия управления приходит на помощь.

Вместо того, чтобы самостоятельно строить зависимости, объект может извлечь свои зависимости из контейнера IoC. Все, что нам нужно сделать, это предоставить контейнеру соответствующие метаданные конфигурации.

3.3. Конфигурация фасоли

Во-первых, давайте украсить Компания класс с @Component аннотация:

@Component
public class Company {
    // this body is the same as before
}

Вот класс конфигурации, поставляющий метаданные фасоли в контейнер IoC:

@Configuration
@ComponentScan(basePackageClasses = Company.class)
public class Config {
    @Bean
    public Address getAddress() {
        return new Address("High Street", 1000);
    }
}

Класс конфигурации производит фасоль типа Адрес . Он также несет @ComponentScan аннотация, которая поручает контейнеру искать бобы в упаковке, содержащей Компания класс.

Когда контейнер Spring IoC строит объекты этих типов, все объекты называются весенними бобами, поскольку они управляются контейнером IoC.

3.4. IoC в действии

Так как мы определили бобы в классе конфигурации, Нам понадобится экземпляр АннотацияКонфигПрименениеКонтекст класса для создания контейнера:

ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);

Быстрый тест проверяет существование, а также стоимость имущества наших бобов:

Company company = context.getBean("company", Company.class);
assertEquals("High Street", company.getAddress().getStreet());
assertEquals(1000, company.getAddress().getNumber());

Результат доказывает, что контейнер IoC создал и инициализировал бобы правильно.

4. Заключение

Этот учебник дал краткое описание весенних бобов и их отношений с контейнером IoC.

Полный исходный код для этого учебника можно найти более на GitHub .