有什么方法可以在 Spring Boot 中声明 happen-before 关系?
Any way to declare happen-before relatioship in Spring Boot?
我有一些验证代码应该在服务器启动时 运行 并确保满足各种条件,这样部署服务器的人就不会弄乱数据库或以错误的安全配置启动服务器等。我创建了一个 bean
@Component
public class ApplicationStartupConditionsValidationBean {
static class ServerInitializationError extends Error{
public ServerInitializationError(String msg){
super(msg);
}
}
private Environment springEnv;
private String datasourceURL;
private String ddlAuto;
private static final Logger logger = LogManager.getLogger();
@Autowired
public ApplicationStartupConditionsValidationBean(Environment springEnv) throws Exception {
this.springEnv = springEnv;
this.datasourceURL = springEnv.getProperty("spring.datasource.url");
this.ddlAuto = springEnv.getProperty("spring.jpa.hibernate.ddl-auto");
validateStartupConditions();
}
public boolean isDBLocal(){
return datasourceURL.startsWith("jdbc:postgresql://localhost:");
}
private String disallowedParamMsg(String optionName, String optionValue){
return "option " + optionName + "=" + optionValue + " not allowed in production";
}
private void reject(String msg) throws ServerInitializationError{
String rejectionMsg = "startup conditions validation failed with msg: " + msg;
logger.error(rejectionMsg);
throw new ServerInitializationError(rejectionMsg);
}
private void reject(String paramName, String paramValue) throws ServerInitializationError{
reject(disallowedParamMsg(paramName, paramValue));
}
private void validateDatasourceParams(){
if(!isDBLocal() &&
!ddlAuto.equals("validate")){
reject("ddl-auto", ddlAuto);
}
}
public void validateStartupConditions() throws Exception{
logger.info("validating startup conditions");
validateDatasourceParams();
// more validation logic...
logger.info("startup conditions validation succeeded, proceeding with boot");
}
}
我想使用这个 class 的方式是定义它必须在什么 bean 之前。在此处的示例中,我希望确保在创建 DataSource bean 之前创建此 bean,以便“ddl-auto=create”不会在生产中出现问题。我知道 @DependsOn 注释,但我想做相反的事情,并声明这个 bean @HappensBefore 是其他 bean 的列表。有什么办法吗?
谢谢!
要在创建“普通”bean 之前的 运行 代码,您可以使用 BeanFactoryPostProcessor
。
要在 bean 之间声明性地添加额外的依赖关系,您还可以使用 BeanPostProcessor
,但这对于您的用例来说听起来不必要地麻烦。
我有一些验证代码应该在服务器启动时 运行 并确保满足各种条件,这样部署服务器的人就不会弄乱数据库或以错误的安全配置启动服务器等。我创建了一个 bean
@Component
public class ApplicationStartupConditionsValidationBean {
static class ServerInitializationError extends Error{
public ServerInitializationError(String msg){
super(msg);
}
}
private Environment springEnv;
private String datasourceURL;
private String ddlAuto;
private static final Logger logger = LogManager.getLogger();
@Autowired
public ApplicationStartupConditionsValidationBean(Environment springEnv) throws Exception {
this.springEnv = springEnv;
this.datasourceURL = springEnv.getProperty("spring.datasource.url");
this.ddlAuto = springEnv.getProperty("spring.jpa.hibernate.ddl-auto");
validateStartupConditions();
}
public boolean isDBLocal(){
return datasourceURL.startsWith("jdbc:postgresql://localhost:");
}
private String disallowedParamMsg(String optionName, String optionValue){
return "option " + optionName + "=" + optionValue + " not allowed in production";
}
private void reject(String msg) throws ServerInitializationError{
String rejectionMsg = "startup conditions validation failed with msg: " + msg;
logger.error(rejectionMsg);
throw new ServerInitializationError(rejectionMsg);
}
private void reject(String paramName, String paramValue) throws ServerInitializationError{
reject(disallowedParamMsg(paramName, paramValue));
}
private void validateDatasourceParams(){
if(!isDBLocal() &&
!ddlAuto.equals("validate")){
reject("ddl-auto", ddlAuto);
}
}
public void validateStartupConditions() throws Exception{
logger.info("validating startup conditions");
validateDatasourceParams();
// more validation logic...
logger.info("startup conditions validation succeeded, proceeding with boot");
}
}
我想使用这个 class 的方式是定义它必须在什么 bean 之前。在此处的示例中,我希望确保在创建 DataSource bean 之前创建此 bean,以便“ddl-auto=create”不会在生产中出现问题。我知道 @DependsOn 注释,但我想做相反的事情,并声明这个 bean @HappensBefore 是其他 bean 的列表。有什么办法吗? 谢谢!
要在创建“普通”bean 之前的 运行 代码,您可以使用 BeanFactoryPostProcessor
。
要在 bean 之间声明性地添加额外的依赖关系,您还可以使用 BeanPostProcessor
,但这对于您的用例来说听起来不必要地麻烦。