Рубрики

Как сгенерировать конфигурационные файлы Spring XMP программно?

Постановка задачи

Как мы все знаем, в весеннем приложении мы предоставляем информацию о конфигурации через ApplicationContext. Spring Framework предоставляет несколько классов, которые реализуют этот интерфейс и помогают нам использовать информацию о конфигурации в приложениях, и ClassPathXmlApplicationContext является одним из них. Обычно в этом случае все определения bean-компонентов настраиваются в одном отдельном XML-файле, обычно называемом «application-context.xml».
В больших проектных структурах рекомендуется хранить несколько конфигурационных файлов пружин для простоты обслуживания и модульности. В этом случае лучше всего организовать все файлы конфигурации bean-компонента Spring в один XML-файл и импортировать в него все файлы. Далее, в контексте приложения мы загружаем этот единственный XML-файл.

А что, если количество создаваемых файлов конфигурации будет увеличено? Скажем, например, близко к 100 или больше?
Теперь это смешная и похожая на улитку работа! Пришло время найти путь для автоматизации этого процесса.
Давайте подумаем о сценарии, в котором у нас есть все необходимые данные во внешнем источнике, например, в листе Excel. Теперь нам нужно прочитать данные с листа и спонтанно создать около 100 файлов конфигурации пружины.

Как автоматизировать этот процесс: JAXB на помощь.

JAXB имеет компилятор привязки. Компилятор привязки схемы JAXB XJC преобразует или связывает исходную XML-схему с набором классов содержимого JAXB на языке программирования Java.

  1. Найдите схему xml, на которую нужно ссылаться в генерируемом xml -http: //www.springframework.org/schema/beans/spring-beans-3.0.xsd.
  2. Нажмите эту ссылку в браузере, чтобы получить xsd. Теперь сохраните его в каком-то месте (например, в spring.xsd).
  3. Загрузите пакет jaxbri и установите переменную path среды. В случае проектов maven включите зависимости для jaxb-ri и jaxb-core.
  4. Выполните команду xjc.exe spring.xsd из папки, в которой существует spring.xsd.
    Это сгенерирует классы, связанные с xsd.

Что нужно сделать, если во время выполнения команды произошла ошибка «Свойство уже определено»?

Скорее всего, возникнет исключение, которое говорит: «Свойство уже определено», как показано на снимке экрана ниже. Если это так, проблему можно решить, создав файл привязки, чтобы переопределить свойства, для которых было сгенерировано исключение.

Связующий файл
spring25

Используйте команду ниже для анализа схемы и генерации классов:

xjc -b spring25.xjb -verbose -xmlschema
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

Сгенерированные классы
организация

Теперь создайте экземпляр Bean и выполните маршаллинг. Это сгенерирует XML-файл с требуемым выводом.

Образец кода
Примечание: — Тестовый класс создается в org / springframework / schema / beans.

package org.springframework.schema.beans;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.net.URISyntaxException;

import java.util.ArrayList;

  

import javax.xml.bind.JAXBContext;

import javax.xml.bind.JAXBException;

import javax.xml.bind.Marshaller;

import javax.xml.namespace.QName;

  

import org.springframework.util.CollectionUtils;

  

import com.hrb.leap.bean.SpringConfigGenerator;

  

public class Test 

{

    public static void main(String[] args) throws JAXBException 

    {

        ObjectFactory factory = new ObjectFactory();

        JAXBContext context = JAXBContext.newInstance("org.springframework.schema.beans");

          

        / *

        * Создание корневого элемента «Бобы»

        * Установите необходимые свойства схемы

        * /

        Beans rootElement = factory.createBeans();

        rootElement.getOtherAttributes().put(new QName

        ("xmlns:xsi"), "http://www.w3.org/2001/XMLSchema-instance");

        rootElement.getOtherAttributes().put(new QName

        ("xsi:schemaLocation"), 

        "http://www.springframework.org/schema/beans spring-beans-3.2.xsd");

          

        / *

        * Как импортировать ресурсы

        * Как определить список ссылочных компонентов

        * /

        java.util.List<String> resources = new ArrayList<>();

        resources.add("ResourceOne");

        resources.add("ResourceTwo");

        resources.add("ResourceThree");

          

        resources.forEach(resourceName -> 

        {

            Import importResource = new Import();

            importResource.setResource(resourceName+".xml");

            rootElement.getImportOrAliasOrBean().add(importResource);

        });

          

        Bean bean = factory.createBean();

        bean.setId("id");

        bean.setClazz("java.util.ArrayList");

        if (!CollectionUtils.isEmpty(resources)) 

        {

            ConstructorArg constructorArgs = factory.createConstructorArg();

            org.springframework.schema.beans.List listOfResources =

                    new org.springframework.schema.beans.List();

              

            resources.forEach(referenceFormName -> 

            {

                Ref refBean = new Ref();

                refBean.setBean(referenceFormName);

                listOfResources.getBeanOrRefOrIdref().add(refBean);

            });

            constructorArgs.setList(listOfResources);

            bean.getMetaOrConstructorArgOrProperty().add(constructorArgs);

        }

        rootElement.getImportOrAliasOrBean().add(bean);

          

        / *

        * Пример определения бина, чтобы показать, как хранить

        список значений как свойство

        * /

            Bean simpleBean = factory.createBean();

            simpleBean.setId("SimpleBean");

            simpleBean.setClazz("com.packagename.ClassName");

              

            PropertyType firstProperty= factory.createPropertyType();

            firstProperty.setName("listOfValuesDemo");

              

            java.util.List<String> listOfValues = new ArrayList<>();

            listOfValues.add("ValueOne");

            listOfValues.add("ValueTwo");

            listOfValues.add("ValueThree");

              

            org.springframework.schema.beans.List listToStoreValues 

                                = new org.springframework.schema.beans.List();

            listOfValues.forEach(name ->

            {

                Value value = factory.createValue();

                value.getContent().add(name);

                listToStoreValues.getBeanOrRefOrIdref().add(value);

            });

              

            firstProperty.setList(listToStoreValues);

              

            // Добавить свойство в бин.

            simpleBean.getMetaOrConstructorArgOrProperty().add

                            (factory.createProperty(firstProperty));

              

            // Добавить bean-компонент под корневой элемент 'beans'

            rootElement.getImportOrAliasOrBean().add(simpleBean);

              

            Marshaller marshaller = context.createMarshaller();

            marshaller.setProperty("jaxb.formatted.output",Boolean.TRUE);

            createXmlConfiguration(marshaller , "output", rootElement);

    }

      

    / *

    * Метод создания XML в разделе 'src / main / resources'

    папка в проекте.

    * /

    public static void createXmlConfiguration (Marshaller marshaller ,

                                String fileName, Beans rootElement) 

                                {

        try

        {

            java.net.URL url = SpringConfigGenerator.class.getResource("/");

            File fullPathToSubfolder = new File(url.toURI()).getAbsoluteFile();

            String projectFolder = 

                        fullPathToSubfolder.getAbsolutePath().split("target")[0];

              

            // TODO - папка назначения, которая будет настроена

            File outputFile = new File(projectFolder 

                            + "src/main/resources/" + "/"+fileName+".xml");

          

            if (!outputFile.exists()) 

            {

                outputFile.createNewFile();

            }

            OutputStream os = new FileOutputStream(outputFile);

            marshaller.marshal(rootElement, os);

        

          

        catch (URISyntaxException uriException) 

        {

              

        

          

        catch (IOException ioException) 

        {

              

        

          

        catch (JAXBException jaxbException) 

        {

              

        }

          

    }

}

Выход
Выход

Выполните следующие шаги, чтобы увидеть пример выходных данных:

  1. Нажмите URL-адрес схемы в браузере, чтобы получить xsd. Теперь сохраните его в каком-либо месте (например: — spring.xsd).
  2. Загрузите пакет jaxbri и установите переменную окружения.
  3. Установить classpath библиотек jaxb и текущий путь (точка), как в примере (сделать эту командную строку или равноценной в IDE)
    set classpath=C:\folder_name\jaxb-ri\lib;.;
  4. После распаковки прикрепленной к папке команды запуска (из извлеченной папки в cmd) скомпилируйте класс «Test».
    javac org\springframework\schema\beans\Test.java
  5. Наконец запустите программу.
    java org.springframework.schema.beans.Test

    Примечание: — Выходные данные будут напечатаны в консоли, если 'createXmlConfiguration (marshaller, «output», rootElement); » заменяется на «marshaller.marshal (rootElement, System.out);»

преимущества

  1. Усилие значительно снижается. Одному человеку может потребоваться не менее 20-25 дней для настройки около 85 файлов (с учетом 9 часов в день), для этого потребуется 225 часов. Вышеупомянутый инструмент займет менее 3 секунд, чтобы сделать это.
  2. Если в будущем будут внесены незначительные изменения в конфигурацию, мы можем взять конкретный файл и внести исправления.

Альтернативный подход
Если число файлов конфигурации очень мало, мы можем попробовать загрузить контекст со всеми определениями bean-компонентов на лету, не генерируя физические xml-файлы. Это может быть достигнуто путем программной загрузки контекста пружины и запуска приложения по мере необходимости.

Недостатки

  1. Потребление памяти высокое
  2. Низкая производительность
  3. Незначительная ошибка в источнике данных будет иметь большое влияние.
  4. Рискованно бегать в производственной среде, на лету.
  5. Не рекомендуемый подход, если источник данных остается почти нетронутым
  6. Будет трудно устранить неполадки.

Эта статья предоставлена Sridevi Sarath (Старший разработчик программного обеспечения в UST Global) . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Как сгенерировать конфигурационные файлы Spring XMP программно?

0.00 (0%) 0 votes