Je développe une application de démarrage de printemps. Pour le moment, certaines de mes configurations sont codées en dur (propriétés Hystrix, par exemple).
Je voudrais donc avoir ces configs sur mon heure de démarrage d’application ou juste après.
Est-il possible de le faire avec une botte à ressort? Je veux dire exécuter un script SQL au démarrage et obtenir des données.
Comment les propriétés/configurations doivent-elles être récupérées et stockées dans mon application?
J'utilise MyBatis et Oracle DB.
Par défaut, Spring-Boot charge data.sql
et/ou data-${platform}.sql
.
Cependant, gardez à l'esprit que le script serait chargé à chaque démarrage. Je pense donc qu'il est plus logique (du moins pour la production) de ne conserver que les valeurs déjà présentes dans la base de données et de ne pas les réinsérer à chaque démarrage. Personnellement, je n'ai utilisé l'initialisation de la base de données qu'à des fins de test/dev avec une base de données en mémoire. Pourtant, c'est la fonctionnalité fournie par Spring-Boot.
source: initialisation-comment-initialiser-base-de-données-de-printemps :
Spring JDBC possède une fonction d'initialisation de source de données. Spring Boot active par défaut et charge SQL à partir des emplacements standard schema.sql et data.sql (dans la racine du classpath). De plus, Spring Boot sera chargez le schéma - $ {plate-forme} .sql et data - $ {plate-forme} .sql (si présent).
src/main/resources/data-Oracle.sql:
insert into...
insert into...
spring.datasource.platform=Oracle
.spring.datasource.data=myscript.sql
.data.sql
, Spring-boot charge également schema.sql
(avant data.sql
).Si vous souhaitez insérer des données basées sur une logique métier, je vous recommande d’utiliser Event Listener. Donc, fondamentalement, au démarrage de l'application, "OnApplicationEvent", comme il est annoté avec la méthode @EventListener, sera appelé automatiquement.
De plus, comme dans votre cas, vous devez obtenir les données, vous utilisez simplement votre objet de référentiel pour obtenir également les données.
Voici un exemple:
@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);
}
}
Si vous obtenez du fichier application.properties, vous pouvez utiliser la classe d'environnement .
Autowired
private Environment environment;
...
environment.getProperty("propertyName")
ou vous pouvez définir votre propre fichier de propriétés.Vous pouvez ensuite en obtenir avec l'annotation @PropertySource(name = "myProperties", value = "example.properties")
Vous devez utiliser l'annotation @Value pour obtenir une valeur spécifique à partir du fichier de propriétés que vous avez défini.
@Value("${propertyNameInYourPropertFile}")
private String url;
Et vous voulez commencer quelque chose quand l’application vient de démarrer, vous pouvez utiliser
@EventListener(ApplicationReadyEvent.class) with a method.
Mais vous devez utiliser @Service ou @Component Annotation, dont Class a la méthode.
Totalement,
Vous pouvez utiliser ceci.
example.properties:
url=yourValue
userName=yourDBUserName
password=yourDBPassword
exemple de classe:
@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;
}
}