Какво е пролетен боб?

1. Общ преглед

Bean е ключова концепция на Spring Framework. Като такова, разбирането на това понятие е от решаващо значение, за да се разбере рамката и да се използва по ефективен начин.

За съжаление няма ясни отговори на един прост въпрос - какво всъщност представлява пролетният боб. Някои обяснения стигат до толкова ниско ниво, че се пропуска голяма картина, докато някои са твърде неясни.

Този урок ще се опита да хвърли светлина върху темата, започвайки с описание в официалната документация.

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

Ето дефиниция на боб в документацията на Spring Framework:

През пролетта обектите, които образуват гръбнака на вашето приложение и които се управляват от Spring IoC контейнера, се наричат ​​боб. Bean е обект, който е създаден, сглобен и управляван по друг начин от Spring IoC контейнер.

Това определение е кратко и стига до точката, но пропуска важно нещо - Spring IoC контейнер. Нека слезем надолу по заешката дупка, за да видим какво представлява и ползите, които носи.

3. Обръщане на контрола

Най-просто казано, Inversion of Control или накратко IoC е процес, при който обектът определя своите зависимости, без да ги създава. Този обект делегира задачата за конструиране на такива зависимости на IoC контейнер.

Нека започнем с декларирането на няколко домейн класа, преди да се потопим в IoC.

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

Да приемем, че имаме декларация за клас:

public class Company { private Address address; public Company(Address address) { this.address = address; } // getter, setter and other properties }

Този клас се нуждае от сътрудник от тип Address :

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);

Няма нищо лошо в този подход, но не би ли било хубаво да управлявате зависимостите по-добре?

Представете си приложение с десетки или дори стотици класове. Понякога искаме да споделим един екземпляр на клас в цялото приложение, друг път се нуждаем от отделен обект за всеки случай на употреба и т.н.

Управлението на такъв брой обекти не е нищо повече от кошмар. Тук на помощ идва Inversion of Control.

Вместо да конструира зависимости от себе си, обектът може да извлече своите зависимости от 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); } }

Конфигурационният клас създава боб от тип Address . Той също така носи анотацията @ComponentScan , която инструктира контейнера да търси зърна в пакета, съдържащ класа Company .

Когато Spring IoC контейнер конструира обекти от тези типове, всички обекти се наричат ​​Spring, тъй като те се управляват от IoC контейнера.

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

Тъй като дефинирахме боб в клас на конфигурация, ще ни е необходим екземпляр на класа AnnotationConfigApplicationContext, за да изградим контейнер:

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.