私はスプリングブートアプリケーションを開発しています。現時点では、私の設定の一部はハードコーディングされています(例:Hystrixプロパティ)。
したがって、アプリケーションの起動時またはその直後にこれらの構成を取得したいと思います。
スプリングブーツを使用してそれを行うことは可能ですか?起動時にSQLスクリプトを実行してデータを取得します。
アプリケーションでプロパティ/構成を取得して保存する方法
MyBatisとOracle DBを使用しています。
デフォルトでは、Spring-Bootはdata.sql
および/またはdata-${platform}.sql
。
ただし、スクリプトは起動のたびに読み込まれるので、起動時に再挿入するのではなく、データベースに既に存在する値を保持する方が理にかなっています(少なくとも運用環境では)。 個人的には、メモリデータベースを使用するときにtest/devの目的でデータベースの初期化のみを使用しました。それでも、これはSpring-Bootが提供する機能です。
ソース: spring-boot-howto-database-initialization :
Spring JDBCにはDataSource初期化機能があります。 Spring Bootはデフォルトでそれを有効にし、標準の場所schema.sqlおよびdata.sql(クラスパスのルート)からSQLをロードします。さらに、Spring Bootはschema-$ {platform} .sqlおよびdata-$ {platform} .sqlファイル(存在する場合)をロードします。
src/main/resources /data-Oracle.sql:
insert into...
insert into...
spring.datasource.platform=Oracle
。spring.datasource.data=myscript.sql
。data.sql
、Spring-bootはschema.sql
(前 data.sql
)。何らかのビジネスロジックに基づいてデータを挿入する場合は、イベントリスナーを使用することをお勧めします。そのため、@ EventListenerメソッドで注釈が付けられているため、基本的にアプリケーションの起動時に「OnApplicationEvent」が自動的に呼び出されます。
また、データを取得する必要がある場合と同様に、リポジトリオブジェクトを使用してデータも取得するだけです。
次に例を示します。
@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);
}
}
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;
}
}
_