我正在开发一个spring boot应用程序。目前我的一些配置是硬编码的(例如Hystrix属性)。
所以我想在我的应用程序启动时或之后获得这些配置。
使用弹簧靴可以做到吗?我的意思是在启动时运行SQL脚本并获取数据。
如何检索属性/配置并将其存储在我的应用程序中?
我正在使用MyBatis和Oracle DB。
答案 0 :(得分:25)
默认情况下,Spring-Boot加载data.sql
和/或data-${platform}.sql
。
但是,请记住,脚本将在每次启动时加载,因此我认为它更有意义(至少对于生产而言),只是让数据库中已存在的值,而不是每次都重新插入开始。 在使用内存数据库时,我个人仅将数据库初始化用于测试/开发目的。但是,这是Spring-Boot提供的功能。
来源:spring-boot-howto-database-initialization:
Spring JDBC具有DataSource初始化程序功能。 Spring Boot启用 它默认情况下从标准位置schema.sql和加载SQL data.sql(在类路径的根目录中)。另外Spring Boot会 加载模式 - $ {platform} .sql和data - $ {platform} .sql文件(如果 本)。
的src /主/资源/ 数据-oracle.sql:强>
insert into...
insert into...
spring.datasource.platform=oracle
。spring.datasource.data=myscript.sql
。data.sql
一起,Spring-boot也会加载schema.sql
(data.sql
之前)。答案 1 :(得分:2)
如果要在启动后从sql脚本加载数据,请按如下方式使用ResourceDatabasePopulator类对象。
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
import javax.sql.DataSource;
@Component
public class InitializeData {
@AutoWired
private DataSource dataSource;
@EventListener(ApplicationReadyEvent.class)
public void loadData() {
ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator(false, false, "UTF-8", new ClassPathResource("data.sql"));
resourceDatabasePopulator.execute(dataSource);
}
}
它将轻松地从sql文件中加载数据,并且不必担心sql文件中的sql语句错误,因为它将被忽略。
答案 2 :(得分:0)
如果要基于某些业务逻辑插入数据,我建议您使用事件监听器。因此,基本上在应用程序启动时,会自动调用使用@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);
}
}
答案 3 :(得分:0)
如果从application.properties文件获取,则可以使用Environment类。 像这样
(?<=\S),(?=\S)
或者您可以定义自己的属性文件。那么你可以从中得到
Autowired
private Environment environment;
...
environment.getProperty("propertyName")
批注
您需要使用@Value批注从定义的属性文件中获取特定值。
@PropertySource(name = "myProperties", value = "example.properties")
并且您想在刚启动Application时启动一些东西,可以在方法之前使用它
@Value("${propertyNameInYourPropertFile}")
private String url;
但是需要使用@Service或@Component Annotation,该类具有该方法。
完全可以使用。
example.properties:
@EventListener(ApplicationReadyEvent.class)
示例类:
url=yourValue
userName=yourDBUserName
password=yourDBPassword
答案 4 :(得分:0)
对我有用的是使用DataSourceInitializer
:
@Bean
public DataSourceInitializer dataSourceInitializer(@Qualifier("dataSource") final DataSource dataSource) {
ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator();
resourceDatabasePopulator.addScript(new ClassPathResource("/data.sql"));
DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
dataSourceInitializer.setDataSource(dataSource);
dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator);
return dataSourceInitializer;
}
用于在初始化期间设置数据库并清理 数据库在销毁期间。
答案 5 :(得分:0)
定义一个Spring Bean(例如GlobalConfigurationBean)
范围:@Scope(scopeName = WebApplicationContext.SCOPE_APPLICATION)
这个Bean负责在Bean初始化期间从数据库表中获取数据(保持配置属性)。
使用@PostConstruct注释方法。
该方法具有从数据库表中获取配置参数的逻辑。
此bean的范围将确保仅从数据库表中获取所需的配置一次(例如,使用Hibernate查询或纯本机SQL),并且
可用于同一应用程序中来自不同上下文的所有bean
现在,只需在希望使用那些配置属性或参数的位置注入此bean。
要么
使用:: Apache Commons DatabaseConfiguration <-
注意::它不支持缓存。但是我猜您不需要缓存,因为在应用程序启动时,数据库配置属性仅应加载一次。
要么
传统的旧方法:通过扩展“ PropertyPlaceHolderConfigurer”定义自定义实现,并将其定义为Spring Bean。
该实现应具有从配置表中获取数据库表中数据的逻辑。
答案 6 :(得分:0)
Initialize a Database using basic SQL scripts
仅使用基本的SQL脚本时,Spring Boot会自动创建嵌入式DataSource的架构。可以使用spring.datasource.initialization-mode属性来自定义此行为。例如,如果要始终初始化数据源,而不管其类型是什么:
spring.datasource.initialization-mode=always