You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅在ddl-auto设为create时执行Spring的CommandLineRunner Bean

解决方案

有两种常用方法可以让你的初始化代码仅在ddl-auto设置为create(或create-drop)时运行,无需手动注释代码:

方法一:使用@ConditionalOnProperty注解(推荐)

直接通过Spring的条件注解控制Bean的创建,当spring.jpa.hibernate.ddl-auto的值为create时才初始化这个CommandLineRunner:

@Bean
@ConditionalOnProperty(
    prefix = "spring.jpa.hibernate",
    name = "ddl-auto",
    havingValue = "create",
    // 可选:若需兼容create-drop模式,可改为havingValue = {"create", "create-drop"}
    matchIfMissing = false
)
CommandLineRunner run(UserService userService) {
    return args -> {
        userService.saveRole(new Role(null, "ROLE_ADMIN"));
        userService.saveRole(new Role(null, "ROLE_STUDENT"));

        userService.saveUser(new User("administrator", "admin@gmail.com", "t", new ArrayList<>(), Instant.now(), true));
        userService.saveUser(new User("elias", "elias@gmail.com", "t", new ArrayList<>(), Instant.now(), true));

        userService.addRoleToUser("administrator", "ROLE_ADMIN");
        userService.addRoleToUser("elias", "ROLE_STUDENT");
    };
}

如果需要同时支持create-drop模式,只需修改havingValue为数组形式即可。

方法二:在代码中手动读取配置判断

如果需要更灵活的逻辑控制,可以注入Environment读取ddl-auto的值,再决定是否执行初始化代码:

@Bean
CommandLineRunner run(UserService userService, Environment env) {
    return args -> {
        String ddlAutoConfig = env.getProperty("spring.jpa.hibernate.ddl-auto");
        // 判断当前是否为create或create-drop模式
        if ("create".equals(ddlAutoConfig) || "create-drop".equals(ddlAutoConfig)) {
            userService.saveRole(new Role(null, "ROLE_ADMIN"));
            userService.saveRole(new Role(null, "ROLE_STUDENT"));

            userService.saveUser(new User("administrator", "admin@gmail.com", "t", new ArrayList<>(), Instant.now(), true));
            userService.saveUser(new User("elias", "elias@gmail.com", "t", new ArrayList<>(), Instant.now(), true));

            userService.addRoleToUser("administrator", "ROLE_ADMIN");
            userService.addRoleToUser("elias", "ROLE_STUDENT");
        }
    };
}

注意事项

  • 确保配置文件中spring.jpa.hibernate.ddl-auto的属性拼写正确,否则条件判断会失效。
  • 使用@ConditionalOnProperty时,matchIfMissing设为false可避免未配置该属性时误触发(Spring Boot在不同环境下的默认ddl-auto值不同,比如开发环境默认是create-drop,生产环境默认是none)。

内容的提问来源于stack exchange,提问作者Elias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:20:31