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

Пружинная загрузка Часть 6: Автоматическая настройка и запуск

Spring Boot позволяет создавать “стартеры”: Удобные дескрипторы зависимостей, которые часто оказываются полезными… Помеченный как java, spring.

Spring Boot позволяет создавать “стартеры”: Удобные дескрипторы зависимостей, которые часто предоставляют некоторые специфические, но сложные функциональные возможности. Примеры из Spring Boot, обсуждаемые в этой серии статей, включают spring-boot-starter-web , spring-boot-starter-thymeleaf и spring-boot-starter-actuator .

В этой статье описывается некоторый повторно используемый код, предназначенный для разработки и тестирования (контроллер REST @ /jig/bean/{имя}.json и /jig/bean/{name}.xml ) и шаги, необходимые для создания стартера Spring Boot. В нем также описывается запуск процесса встроенного сервера MySQL, описанного в “Spring Embedded MySQL Server” .

Предоставляется полный javadoc |/.

Теория работы

Как обсуждалось в части 1 , может быть сконфигурирован пружинный загрузочный пусковой привод . Одна из его служб может быть использована для получения списка (с атрибутами) настроенных компонентов. Пример частичного вывода ниже:

$ curl -is -X GET http://localhost:5001/actuator/beans/
HTTP/1.1 200
Content-Type: application/vnd.spring-boot.actuator.v3+json
Transfer-Encoding: chunked
Date: Sun, 19 Jul 2020 20:22:10 GMT

{
  "contexts" : {
    "application" : {
      "beans" : {
        ...
        "discoveryService" : {
          "scope" : "singleton",
          "type" : "upnp.DiscoveryService",
          "resource" : "file [/Users/ball/upnp-media-server/target/classes/upnp/DiscoveryService.class]",
          "dependencies" : [ "mediaServer" ]
        },
        ...
      },
      "parentId" : null
    }
  }
}

ball-spring-jig-starter предоставит следующие два REST API для извлечения значения определенного компонента и демонстрации сериализации в JSON или XML в зависимости от обстоятельств. Частичный вывод JSON:

$ curl -is -X GET http://localhost:5000/jig/bean/discoveryService.json
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Date: Sun, 19 Jul 2020 20:23:38 GMT

{
  "uuid:00000000-0000-1010-8000-0024BEF18BCC" : {
    "expiration" : 1595191949391,
    "ssdpmessage" : {
      "params" : { },
      "entity" : null,
      "locale" : null,
      "inetAddress" : "10.0.1.9",
      "st" : "uuid:00000000-0000-1010-8000-0024BEF18BCC",
      "location" : "http://10.0.1.9:52323/dmr.xml",
      "usn" : "uuid:00000000-0000-1010-8000-0024BEF18BCC",
      "protocolVersion" : {
        "protocol" : "HTTP",
        "major" : 1,
        "minor" : 1
      },
      ...
    },
    ...
  },
  ...
}

И соответствующий XML-вывод:

$ curl -is -X GET http://localhost:5000/jig/bean/discoveryService.xml
HTTP/1.1 200
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Sun, 19 Jul 2020 20:29:47 GMT


  
    1595192286661
    
      
      
      
      10.0.1.9
      uuid:00000000-0000-1010-8000-0024BEF18BCC
      http://10.0.1.9:52323/dmr.xml
      uuid:00000000-0000-1010-8000-0024BEF18BCC
      
        HTTP
        1
        1
      
      ...
    
  
  ...

Реализация описана в следующем разделе.

Реализация

Шаги по созданию стартера “джиг”:

  1. Реализовать контроллер REST

  2. Создайте проект и POM для начального артефакта

  3. Создайте класс (классы) автоматической настройки

  4. Свяжите класс(ы) автоматической настройки с исходным кодом META-INF/spring.factories resource 1

Реализация Be RestController показана ниже.

@RestController
@RequestMapping(value = { "/jig/bean/" })
@ResponseBody
@NoArgsConstructor @ToString @Log4j2
public class BeanRestController implements ApplicationContextAware {
    private ApplicationContext context = null;

    @Override
    public void setApplicationContext(ApplicationContext context) {
        this.context = context;
    }

    @RequestMapping(method = { GET }, value = { "{name}.json" }, produces = APPLICATION_JSON_VALUE)
    public Object json(@PathVariable String name) throws Exception {
        return context.getBean(name);
    }

    @RequestMapping(method = { GET }, value = { "{name}.xml" }, produces = APPLICATION_XML_VALUE)
    public Object xml(@PathVariable String name) throws Exception {
        return context.getBean(name);
    }

    @ExceptionHandler({ NoSuchBeanDefinitionException.class, NoSuchElementException.class })
    @ResponseStatus(value = NOT_FOUND, reason = "Resource not found")
    public void handleNOT_FOUND() { }
}

Его реализация проста: каждый метод для поиска запрошенного компонента, а затем сериализации в JSON и XML.

В проекте для начала добавьте класс Auto Configuration .

@Configuration
@ConditionalOnClass({ BeanRestController.class })
@Import({ BeanRestController.class })
@NoArgsConstructor @ToString @Log4j2
public class AutoConfiguration {
}

Крайне важно, чтобы @Configuration классы добавляются через @Import |/аннотации и не @ComponentScan Ни начальный автор, ни интегратор не смогут предсказать, какие компоненты будут или не будут включены в сканирование.

Хорошей практикой является включение аннотации “условное включение” (например, @ConditionalOnClass для проверки того, что любое требуемое программное обеспечение для зависимостей настроено и/или находится на пути к классу.

Наконец, META-INF/spring.factories должен быть настроен в JAR starter, чтобы уведомлять Spring Boot о добавлении автоконфигурации .

org.springframework.boot.autoconfigure.EnableAutoConfiguration: ball.spring.jig.autoconfigure.AutoConfiguration

Создание стартера для встроенного процесса MySQL, описанного в “Spring Embedded MySQL Server” , одинаково просто. Его Автоконфигурация класс показан ниже:

@Configuration
@ConditionalOnClass({ MysqldConfiguration.class })
@Import({ EntityManagerFactoryComponent.class, MysqldConfiguration.class })
@NoArgsConstructor @ToString @Log4j2
public class AutoConfiguration {
}

С соответствующим META-INF/spring.factories :

org.springframework.boot.autoconfigure.EnableAutoConfiguration: ball.spring.mysqld.autoconfigure.AutoConfiguration

Резюме

Создание Spring Boot starter является простым: создайте project/POM для размещения зависимостей starter и классов автоматической настройки, добавьте аннотированный класс автоматической настройки и настройте META-INF/spring.factories JAR-файла starter. с помощью класса (классов) автоматической настройки. Эта начальная функциональность затем может быть добавлена в приложение Spring Boot, просто включив одну зависимость в POM приложения.

[1] Многие компоненты Spring Boot предоставляют отдельные артефакты автоматической настройки и запуска для поддержки всех вариантов использования. Автор считает, что эти примеры реализаций не извлекают выгоду из отдельных артефактов автоматической настройки. ↩

Оригинал: “https://dev.to/allenball/spring-boot-part-6-auto-configuration-and-starters-5fe9”