To configure Beans in Spring

 

Початок роботи у Spring Boot, частина 8 Налаштування Beans навесні

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

Компанії

Як використовувати Java Beans навесні, пояснюється в цій частині нашого уроку.Як використовувати Java Beans навесні, пояснюється в цій частині нашого уроку.

У нашому прикладі 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:

...persisterServicepersonControllerpersisterConfigdatabasePersister...

Зіпсований для вибору

Це захоплююче, якщо ви вибрали другий 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 добре підходить для статей у блогах, але на практиці лише другий вибір.

Ready to see us in action:

More To Explore

IWanta.tech
Logo
Enable registration in settings - general
Have any project in mind?

Contact us:

small_c_popup.png