#java #spring #spring-boot #maven
Вопрос:
В настоящее время учусь создавать весенние приложения. На данный момент я довольно успешно развертываю макетные приложения, но меня раздражает одна вещь, а именно непонимание механизмов, лежащих в основе многочисленных аннотаций, которые мы добавляем в код. Послушайте, я не говорю, что не знаю, какой цели они служат, где они действуют, и не ставлю под сомнение их полезность.
Я хочу сказать, что я чувствую, что пропуск изменений, которые должны быть внесены (или вносятся?) В XML-файлы, на самом деле заставляет меня чувствовать, что в конце концов я не знаю, что я на самом деле пишу. Позвольте мне быть более конкретным, чтобы вы могли ответить мне относительно следующего примера. Это из весеннего руководства.
Давайте предположим, что у нас есть следующая конфигурация, которая определяет firstMovieCatalog как основной каталог MovieCatalog
@Configuration
public class MovieConfiguration {
@Bean
@Primary
public MovieCatalog firstMovieCatalog() { ... }
@Bean
public MovieCatalog secondMovieCatalog() { ... }
// ...
}
При такой конфигурации следующий MovieRecommender будет автоматически подключен к каталогу
firstMovieCatalog.
public class MovieRecommender {
@Autowired
private MovieCatalog movieCatalog;
// ...
}
Соответствующие определения компонентов выглядят следующим образом.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean class="example.SimpleMovieCatalog" primary="true">
<!-- inject any dependencies required by this bean -->
</bean>
<bean class="example.SimpleMovieCatalog">
<!-- inject any dependencies required by this bean -->
</bean>
<bean id="movieRecommender" class="example.MovieRecommender"/>
</beans>
Итак, я думаю, что если вы сможете ответить мне на 2 вопроса относительно этого примера, это прояснит многое из того понимания, которого мне здесь не хватает.
- Первое, что мне непонятно: является ли процесс аннотации ОТДЕЛЬНЫМ процессом от конфигурации XML или он ГЕНЕРИРУЕТ эту эквивалентную конфигурацию XML каким-то скрытым способом?
- Где на самом деле находится этот файл конфигурации XML? Все весенние приложения, которые я создал с помощью Initializr, просто генерируют pom.xml файл, и он не включает конфигурацию. Если бы я не использовал аннотации, пришлось бы мне вручную писать эквивалентную конфигурацию в pom?
Комментарии:
1. Конфигурация XML-это старый стиль. Не обращай на это внимания.
2. Таким образом, аннотации на самом деле не генерируют XML, а только код Java как таковой?
3. Да, это верно.
4. Аннотации также не генерируют код
5. Я считаю, что причина, по которой они показывают конфигурацию XML вместе с конфигурацией Java, заключается в том, чтобы помочь тем, кто понимает или все еще использует конфигурацию XML, перейти на конфигурацию Java. Одним из больших преимуществ Java config является то, что он обеспечивает безопасность типов во время компиляции. Лично я считаю, что один или несколько
@Configuration
файлов гораздо более удобны для обслуживания, чем один или несколько файлов конфигурации XML.
Ответ №1:
является ли процесс аннотации ОТДЕЛЬНЫМ процессом от конфигурации XML или он ГЕНЕРИРУЕТ эту эквивалентную конфигурацию XML каким-то скрытым способом?
Spring ни в коем случае не генерирует никаких XML или аннотаций. Spring использует обработку XML и аннотаций, чтобы получить информацию о том, какие компоненты (классы) доступны для использования и какие компоненты (экземпляры) создавать, внедрять и использовать для обработки. Затем все эти компоненты могут быть извлечены контекстом приложения (не путать с xml с тем же именем).
Где на самом деле находится этот файл конфигурации XML?
Первая версия Spring использовала XML для настройки вашего приложения. Позже (начиная с весны 3) Spring добавила поддержку и обработку аннотаций для облегчения настройки приложения. Аннотации-это просто еще один способ настроить ваши компоненты и компоненты без необходимости поддерживать большие XML-файлы (более 1000 строк или даже больше) или просто избегать работы с XML вообще. Текущие версии Spring поддерживают обе конфигурации, вы также можете использовать сочетание: использование XML и использование аннотаций.
Обратите внимание, что Spring ApplicationContext
имеет несколько реализаций с различными точками входа для настройки:
AnnotationConfigApplicationContext
принимает класс, украшенный@Configuration
.ClassPathXmlApplicationContext
принимает путь к XML — файлу, доступному в пути к классам приложений.
Если бы я не использовал аннотации, пришлось бы мне вручную писать эквивалентную конфигурацию в pom?
Первое, что нужно сделать: файлы POM предназначены для обработки maven, а не для Spring. Поскольку вы используете Maven и хотите попробовать использовать приложение Spring Boot без аннотаций, у вас может быть такая структура проекта:
- src
- main
- java
/* your Java packages and files */
- com.example
App <--- Main entry point
- com.example.service
Car <--- Component 1
Engine <--- Component 2
- resources
my-beans.xml <--- XML configuration. Name can be anything
Класс приложений:
package com.example;
import com.example.service.Car;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ApplicationContext;
@Configuration
@ImportResource("classpath:my-beans.xml")
public class App {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(App.class, args);
Car car = ctx.getBean(Car.class);
car.move();
}
}
Car.class:
package com.example.service;
public class Car {
private Engine engine;
public void move() {
engine.start();
}
}
Engine.class:
package com.example.service;
public class Engine {
public void start() {
System.out.println("engine starts");
}
}
my-beans.xml файл:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean class="com.example.service.Engine" />
<bean class="com.example.service.Car" />
<property name="engine" ref="engine"></property>
</bean>
</beans>
Комментарии:
1. Большое вам спасибо за ваш ответ. Это действительно ценно. Просто то, что вы объяснили, что конфигурация .xml должна быть написана внутри ресурсов, отчасти прояснило для меня мир. Я не могу понять, почему люди не упоминают такие простые вещи при объяснении весны.
2. Большое вам спасибо за ваш ответ. Это многое прояснило для меня. В наши дни эти вещи стали невероятно сложными для изучения, потому что большинство людей, обучающих концепциям MVC, полностью сосредоточены на том, чтобы научить вас «работать». Так что, по крайней мере, мне довольно трудно встретить источники знаний, которые были бы заинтересованы в дидактическом объяснении механизмов.
Ответ №2:
является ли процесс аннотации ОТДЕЛЬНЫМ процессом от конфигурации XML или он ГЕНЕРИРУЕТ эту эквивалентную конфигурацию XML каким-то скрытым способом
Когда вы инициализируете приложение Spring, вы создаете экземпляр ApplicationContext
: оно отвечает за загрузку всего определения контекста (компоненты, службы…).
ApplicationContext
на самом деле это интерфейс, который имеет несколько реализаций в зависимости от того, как определен ваш контекст:
ClassPathXmlApplicationContext
который считывает XML-файлAnnotationConfigApplicationContext
для подхода, основанного на аннотациях- …
Таким образом, вы можете рассматривать это как уникальный процесс, только источник данных отличается: либо XML, либо аннотации. Но они описывают одно и то же: контекст.