Spring загрузка. Запуск SQL-скриптов и получение данных о запуске приложения

Я разрабатываю приложение загрузки spring. На данный момент некоторые из моих конфигураций жестко закодированы (например, свойства Hystrix).

Итак, я хотел бы получить эти конфиги в момент запуска приложения или сразу после этого.

Можно ли это сделать с помощью spring загрузки? Я хочу запустить SQL script при запуске и получить данные.

Как следует извлекать и сохранять свойства/конфиги в моем приложении?

Я использую MyBatis и Oracle DB.

Ответ 1

По умолчанию Spring-Boot загружает data.sql и/или data-${platform}.sql.

Однако имейте в виду, что скрипт будет загружаться при каждом запуске, поэтому я думаю, что имеет больше смысла (по крайней мере для производства), чтобы просто иметь значения, уже присутствующие в базе данных, а не вставляться повторно при каждом запуске. Я лично использовал инициализацию базы данных только для целей тестирования/разработки при использовании базы данных памяти. Тем не менее, эта функция предоставляется Spring-Boot.

источник: spring-boot-howto-database-initialization:

Spring JDBC имеет функцию инициализации источника данных. Spring Boot позволяет он по умолчанию и загружает SQL из стандартных расположений schema.sql и data.sql (в корне пути к классам). Кроме того, Spring Boot будет загрузите файлы schema- $ {platform}.sql и data- $ {platform}.sql (если присутствует).

SRC/основные/ресурсы/data- oracle.sql:

insert into...
insert into...
  • Вы можете определить платформу с помощью: spring.datasource.platform=oracle.
  • Вы можете изменить имя сценария sql для загрузки с помощью: spring.datasource.data=myscript.sql.
  • Наряду с data.sql Spring-boot также загружает schema.sql (до data.sql).
  • Вы также можете иметь логику "обновить или вставить" в вашем data.sql: oracle sql: update, если существует, иначе вставьте

Ответ 2

Если вы хотите вставить данные, основанные на некоторой бизнес-логике, я бы порекомендовал вам использовать прослушиватель событий. Таким образом, в основном при запуске приложения "OnApplicationEvent", так как он аннотирован @EventListener, будет вызываться автоматически.

Кроме того, так как в вашем случае вам нужно получить данные, вы просто используете свой объект репозитория, чтобы получить данные.

Вот один пример:

@Component
public class OnApplicationStartUp {

   @Autowired
   private ServiceRepository repository;


   @EventListener
   public void onApplicationEvent(ContextRefreshedEvent event) {

       //Write your business logic here.
       if (repository.findAll().size() <= 0) {
           preloadData();
       }else{
           fetchData();
       }
   }

    private void preloadData() {

       List<Service> services = new ArrayList<>();
       Service someService= new Service("name", "type");
       services.add(someService);
       ...
       ...
       repository.saveAll(services);
   }
}

Ответ 3

Если вы получаете из файла application.properties, вы можете использовать класс Environment. Вот так

Autowired
private Environment environment;
...
environment.getProperty("propertyName")

или вы можете определить свой собственный файл свойств. тогда вы можете получить от него @PropertySource(name = "myProperties", value = "example.properties") аннотация

Вам нужно использовать аннотацию @Value, чтобы получить определенное значение из файла свойств, который вы определили.

@Value("${propertyNameInYourPropertFile}")
private String url;

И вы хотите что-то запустить, когда приложение только запущено, вы можете использовать это перед методом

@EventListener(ApplicationReadyEvent.class)

Но нужно использовать @Service или @Component Annotation, у какого класса есть метод.

В общем, вы можете использовать это.

example.properties:

url=yourValue
userName=yourDBUserName
password=yourDBPassword

пример класса:

@Service
@PropertySource(name = "myProperties", value = "example.properties")
public class Start{

    @Value("${url}")
    private String url;

    @Value("${userName}")
    private String userName;

    @Value("${password}")
    private String password;


    //Run this method when application started
    @EventListener(ApplicationReadyEvent.class)
    public ResultSet getConnection()
    {

        //Connect to Database
        Connection connection = null;
        String QUERY="your sql query";
        try {
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
            connection = DriverManager.getConnection(url, userName, password );
        } catch (SQLException e) {
        }


        //Run your query
        Statement stmt = null;
        try {
            stmt = connection.createStatement();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        ResultSet rs = null;
        try {
            rs = stmt.executeQuery(QUERY);
        } catch (SQLException e1) {
            e1.printStackTrace();
        }

        return rs;
    }

}