Початок роботи у Spring Boot, частина 8 Налаштування Beans навесні
З залежності ін’єкційний контейнер утворює серце Весни. Це може керувати різними компонентами, включаючи Java Beans. Конфігурація цих компонентів часу та безпечна для використання за допомогою класу Java.
Компанії

У нашому прикладі Bean до бази даних зберігається , тому клас, який зберігає дані в базі даних. Оскільки це є в нашому гіпотетичному додатку, різні типи сховищ, такі як файлова система persistent або хмарний persister – можуть дати класу реалізацію Interface Persister із методом persist:
public interface Persister {
public void persist();
}public class DatabasePersister implements Persister {
@Override
public void persist() {
System.out.println("In DatabasePersister persist");
}
}
Налаштування в класі Java
Персистор бази даних повинен бути введений до іншого класу, тому контейнер буде повідомлено. Це робиться в класі Java, характеризується анотація @Configuration і, загалом , для Config закінчується. Внутрішньо цей клас характеризується @Component , і, отже, компонент-сканування знайшов та оцінив:
@Configuration
public class PersisterConfig {}
У класі різні Beans будуть виготовлятись методами визначення Bean із позначками Annotation @Bean :
@Configuration
public class PersisterConfig { @Bean
public Persister databasePersister() {
return new DatabasePersister();
}
}
Також можливу конфігурацію компонентів за допомогою XML зараз частіше можна знайти, але все ще часто в існуючих проектах.
Введіть квасоля
Один із таких розмірів, налаштований Bean, тепер можна використовувати з автоматичним введенням, наприклад, у службу . Служба в ідеалі не знає конкретного Персистора, він працює з Інтерфейсом і викликає визначений метод персисту:
@Service
public class PersisterService { @Autowired
private Persister persister; public void persistData() {
persister.persist();
}
}
Контейнер зараз шукає, коли запускати існуючі компоненти до Bean із правильним типом, тобто Persistor та конфігурованою базою даних зберігаються . Завдяки реалізації Інтерфейсу він є Персистером і використовується як кандидат для ін’єкцій.
У разі виникнення проблем квасолі в контейнері корисно витратити. Метод запуску додатка класу Spring в основному класі, назад ApplicationContext , доступ до налаштованих Beans або ім’я методу getBeanDefinitionNames () дозволяє:
@SpringBootApplication
public class DemoApplication { private static ApplicationContext applicationContext;
public static void main(String[] args) {
applicationContext = SpringApplication.run(DemoApplication.class, args);>
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String beanName : beanDefinitionNames) {
System.out.println(beanName);
}
}
}
Тоді у висновку консолі ми знаходимо, поряд з багатьма іншими Beans, налаштований Persister:
...
persisterService
personController
persisterConfig
databasePersister
...
Зіпсований для вибору
Це захоплююче, якщо ви вибрали другий Bean того самого типу інтерфейсу в конфігурації, наприклад, файлова система зберігається . Він також реалізує Persister:
public class FilesystemPersister implements Persister {
@Override
public void persist() {
System.out.println("In FilesystemPersister persist");
}
}
Конфігурація в Persistent config аналогічна:
@Configuration
public class PersisterConfig { @Bean
public Persister databasePersister() {
return new DatabasePersister();
} @Bean
public Persister filesystemPersister() {
return new FilesystemPersister();
}
}
При введенні квасолі в службу контейнера зараз стикається з проблемою: яку з двох стійких цілей він повинен ввести? Весна не може самостійно вирішити дилему. Програма не запускається і реєструє повідомлення про помилку:
Field persister in com.example.demo.PersisterService required a single bean, but 2 were found:
- databasePersister: defined by method 'databasePersister' in class path resource [com/example/demo/PersisterConfig.class]
- filesystemPersister: defined by method 'filesystemPersister' in class path resource [com/example/demo/PersisterConfig.class]
Рішення проблеми, яка буде приємною, включено в повідомлення:
Action:
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
За допомогою анотацій @Primary або @Qualifier конфлікт можна вирішити. Анотація @Primary (!) З двох методів визначення Bean призводить до того, що відповідний Bean є кращим. Для цього, звичайно, у конфігурації повинен бути клас конфігурації. У випадку використання сторонніх бібліотек це не завжди так.
Альтернативою є Анотація @Qualifier, яку можна приєднати до точки введення, класу користувача. Вказавши ім’я методу знаходиться в Persistent служби Файлова система стійка бактерія перевага віддається:
@Service
public class PersisterService { @Qualifier("filesystemPersister")
@Autowired
private Persister persister; public void persistData() {
persister.persist();
}
}
Однак в іншому класі, мабуть, переважно зберігається база даних. Цей шаблон можна знайти часто під час налаштування кількох джерел даних.
У наступній частині серії Spring Boot ми розглянемо різні способи введення бобових (team work). Спойлер: Використовуваний Field Injection добре підходить для статей у блогах, але на практиці лише другий вибір.