Ich entwickle eine Springboot-Anwendung. Im Moment sind einige meiner Konfigurationen hartcodiert (z. B. Hystrix-Eigenschaften).
Daher möchte ich diese Konfigurationen auf die Startzeit meiner Anwendung oder kurz danach beziehen.
Kann man das mit Springboot machen? Ich meine, SQL-Skript beim Start auszuführen und Daten abzurufen.
Wie sollen Eigenschaften/Konfigurationen abgerufen und in meiner Anwendung gespeichert werden?
Ich benutze MyBatis und Oracle DB.
Spring-Boot lädt standardmäßig data.sql
und/oder data-${platform}.sql
.
Beachten Sie jedoch, dass das Skript bei jedem Start geladen wird. Daher ist es (zumindest für die Produktion) sinnvoller, die Werte bereits in der Datenbank zu speichern und nicht bei jedem Start erneut einzufügen. Ich habe die Datenbankinitialisierung bei der Verwendung einer Speicherdatenbank nur zu Test-/dev-Zwecken verwendet. Dies ist jedoch die Funktion von Spring-Boot.
source: spring-boot-howto-datenbankinitialisierung :
Spring JDBC verfügt über eine DataSource-Initialisierungsfunktion. Spring Boot aktiviert es standardmäßig und lädt SQL von den Standardspeicherorten schema.sql und data.sql (im Stammverzeichnis des Klassenpfads). Zusätzlich wird Spring Boot Laden Sie das Schema - $ {Plattform} .sql und die Daten - $ {Plattform} .sql-Dateien (falls vorhanden ).
src/main/resources/data-Oracle.sql:
insert into...
insert into...
spring.datasource.platform=Oracle
.spring.datasource.data=myscript.sql
.data.sql
lädt Spring-boot auch schema.sql
(vor data.sql
).Wenn Sie Daten basierend auf einer Geschäftslogik einfügen möchten, würde ich Ihnen empfehlen, Event Listener zu verwenden. Beim Start der Anwendung wird also "OnApplicationEvent", wie es mit der @EventListener-Methode kommentiert wird, automatisch aufgerufen.
Da Sie in diesem Fall auch die Daten abrufen müssen, verwenden Sie einfach Ihr Repository-Objekt, um auch die Daten abzurufen.
Hier ist ein Beispiel:
@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);
}
}
Wenn Sie die Datei application.properties verwenden, können Sie die Umgebungsklasse . Verwenden
Autowired
private Environment environment;
...
environment.getProperty("propertyName")
oder Sie können Ihre eigene Eigenschaftsdatei definieren. Dann können Sie sie mit der Annotation @PropertySource(name = "myProperties", value = "example.properties")
abrufen
Sie müssen die @Value-Annotation verwenden, um einen bestimmten Wert aus der von Ihnen definierten Eigenschaftendatei abzurufen.
@Value("${propertyNameInYourPropertFile}")
private String url;
Und Sie möchten etwas starten, wenn Application gerade gestartet wird
@EventListener(ApplicationReadyEvent.class) with a method.
Sie müssen jedoch @Service oder @Component Annotation verwenden, welche Klasse die Methode hat.
Total,
Sie können dies verwenden.
example.properties:
url=yourValue
userName=yourDBUserName
password=yourDBPassword
beispielklasse:
@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;
}
}