Về cơ bản bạn có một JAR đã hoàn thành mà bạn muốn thả vào một môi trường khác và không có bất kỳ sửa đổi nào, nó sẽ nhận các thuộc tính thích hợp khi chạy. Nếu đúng, thì các phương pháp sau hợp lệ:
1) Dựa vào sự hiện diện của tệp thuộc tính trong thư mục chính của người dùng.
Cấu hình PropertyPlaceholderConfigurer để tham khảo nộp đơn thuộc tính bên ngoài để JAR như thế này:
<bean id="applicationProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="false"/>
<property name="order" value="1"/>
<property name="locations">
<list>
<!-- User home holds secured information -->
<value>file:${user.home}/MyApp/application.properties</value>
</list>
</property>
</bean>
Hệ điều hành sẽ đảm bảo các nội dung của tập tin application.properties để chỉ đúng người có thể có quyền truy cập vào nó . Vì tệp này không tồn tại khi bạn chạy ứng dụng lần đầu tiên, hãy tạo một tập lệnh đơn giản sẽ thẩm vấn người dùng về các giá trị quan trọng (ví dụ: tên người dùng, mật khẩu, phương ngữ Hibernate, v.v.) khi khởi động. Cung cấp trợ giúp mở rộng và các giá trị mặc định hợp lý cho giao diện dòng lệnh.
2) Nếu ứng dụng của bạn ở trong môi trường được kiểm soát để có thể xem cơ sở dữ liệu thì vấn đề có thể bị giảm xuống một trong số các thông tin cơ bản bằng cách sử dụng kỹ thuật 1) ở trên để kết nối với cơ sở dữ liệu trong khi khởi động ngữ cảnh và sau đó thực hiện thay thế bằng cách sử dụng các giá trị đọc qua JDBC. Bạn sẽ cần một cách tiếp cận 2 pha để ứng dụng khởi động: giai đoạn 1 gọi một bối cảnh cha mẹ với tệp application.properties điền một JdbcTemplate và DataSource liên quan; giai đoạn 2 gọi bối cảnh chính tham chiếu đến cha mẹ để JdbcTemplate có thể được sử dụng như được cấu hình trong JdbcPropertyPlaceholderConfigurer.
Một ví dụ về loại mã này sẽ là:
public class JdbcPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
private Logger log = Logger.getLogger(JdbcPropertyPlaceholderConfigurer.class);
private JdbcTemplate jdbcTemplate;
private String nameColumn;
private String valueColumn;
private String propertiesTable;
/**
* Provide a different prefix
*/
public JdbcPropertyPlaceholderConfigurer() {
super();
setPlaceholderPrefix("#{");
}
@Override
protected void loadProperties(final Properties props) throws IOException {
if (null == props) {
throw new IOException("No properties passed by Spring framework - cannot proceed");
}
String sql = String.format("select %s, %s from %s", nameColumn, valueColumn, propertiesTable);
log.info("Reading configuration properties from database");
try {
jdbcTemplate.query(sql, new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
String name = rs.getString(nameColumn);
String value = rs.getString(valueColumn);
if (null == name || null == value) {
throw new SQLException("Configuration database contains empty data. Name='" + name + "' Value='" + value + "'");
}
props.setProperty(name, value);
}
});
} catch (Exception e) {
log.fatal("There is an error in either 'application.properties' or the configuration database.");
throw new IOException(e);
}
if (props.size() == 0) {
log.fatal("The configuration database could not be reached or does not contain any properties in '" + propertiesTable + "'");
}
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void setNameColumn(String nameColumn) {
this.nameColumn = nameColumn;
}
public void setValueColumn(String valueColumn) {
this.valueColumn = valueColumn;
}
public void setPropertiesTable(String propertiesTable) {
this.propertiesTable = propertiesTable;
}
}
ở trên sau đó sẽ được cấu hình trong mùa xuân như thế này (lưu ý là tài sản để đưa ra sau khi thông thường $ placeholders tiền tố):
<!-- Enable configuration through the JDBC configuration with fall-through to framework.properties -->
<bean id="jdbcProperties" class="org.example.JdbcPropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="false"/>
<property name="order" value="2"/>
<property name="nameColumn" value="name"/>
<property name="valueColumn" value="value"/>
<property name="propertiesTable" value="my_properties_table"/>
<property name="jdbcTemplate" ref="configurationJdbcTemplate"/> <!-- Supplied in a parent context -->
</bean>
này sẽ cho phép tiếp theo xảy ra trong cấu hình Spring
<!-- Read from application.properties -->
<property name="username">${username}</property>
...
<!-- Read in from JDBC as part of second pass after all $'s have been fulfilled -->
<property name="central-thing">#{name.key.in.db}</property>
3) Tất nhiên, nếu bạn đang ở trong một container ứng dụng web thì bạn chỉ cần sử dụng JNDI. Nhưng bạn không nên bạn không thể.
Hy vọng điều này sẽ hữu ích!
Cảm ơn đề xuất xây dựng, nhưng nó không hoạt động cho trường hợp của tôi. Tôi đã cập nhật câu hỏi của mình để phản ánh điều đó; Tôi có nghĩa là để bao gồm thông tin đó ban đầu và quên. Tôi sẽ kiểm tra gợi ý khác của bạn. – Ickster
Tôi đang sử dụng Maven làm công cụ xây dựng. Làm thế nào bạn sẽ bó các cấu hình bên phải trong khi đóng gói trong maven. – premcs