在Spring Boot中禁用所有与数据库相关的自动配置

yuv*_*uva 95 spring hibernate spring-data spring-data-jpa spring-boot

我使用Spring Boot开发两个应用程序,一个用作服务器,另一个用作客户端应用程序.但是,它们都是相同的应用程序,根据活动配置文件的功能不同.我正在使用Spring Boot的自动配置功能来配置我的应用程序.

我想在客户端应用程序上禁用所有与数据库相关的自动配置,因为它不需要数据库连接.应用程序不应尝试与数据库建立连接,也不应尝试使用任何Spring Data或Hibernate功能.启用或禁用数据库自​​动配置应该是有条件的,并且基于应用程序的活动配置文件.

我可以通过为各个配置文件创建两个不同的application.properties文件来实现此目的吗?

我尝试将其添加到我的属性文件中,

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration\
  org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration\
  org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
Run Code Online (Sandbox Code Playgroud)

但是,应用程序仍然尝试在启动时连接到数据库.这些排除是否足以满足我的要求?

pat*_*s91 77

我会做类似的事情是:

@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@Profile ("client_app_profile_name")
public class ClientAppConfiguration {
    //it can be left blank
}
Run Code Online (Sandbox Code Playgroud)

为服务器应用编写类似的一个(不包括在内).

最后一步是从主弹簧引导类禁用自动配置:

@SpringBootApplication
public class SomeApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(SomeApplication.class);
    }

    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SomeApplication.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

变化:@SpringBootApplication成:

@Configuration 
@ComponentScan
Run Code Online (Sandbox Code Playgroud)

这应该做的工作.现在,我在示例中排除的依赖项可能不完整.它们对我来说足够了,但我不确定它是否完全禁用数据库相关库.检查下面的列表以确定:

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#auto-configuration-classes

希望有所帮助

  • `@SpringBootApplication`有一个`exclude`属性,不需要`ClientAppConfiguration`. (4认同)

Jor*_*pez 77

要禁用所有与数据库相关的自动配置并退出:

无法确定数据库类型为NONE的嵌入式数据库驱动程序类

1.使用注释:

@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(PayPalApplication.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

2.使用Application.properties:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
Run Code Online (Sandbox Code Playgroud)

  • 在 Spring Boot 2+ 中使用 Application.properties 比使用注释更可取。 (2认同)

Jul*_*May 25

好像你只是忘了用逗号分隔类.因此,根据您的配置,以下内容将起作用:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
    org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
Run Code Online (Sandbox Code Playgroud)

或者您也可以将其定义如下:

spring.autoconfigure.exclude[0]=org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
spring.autoconfigure.exclude[1]=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
spring.autoconfigure.exclude[2]=org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
spring.autoconfigure.exclude[3]=org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
Run Code Online (Sandbox Code Playgroud)


Boj*_*vic 12

如果使用application.yml

spring:
  autoconfigure:
    exclude:
      - org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
      - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
      - org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
      - org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration
Run Code Online (Sandbox Code Playgroud)


naX*_*aXa 10

有一种方法可以使用@SpringBootApplication注释排除特定的自动配置类.

@Import(MyPersistenceConfiguration.class)
@SpringBootApplication(exclude = {
        DataSourceAutoConfiguration.class, 
        DataSourceTransactionManagerAutoConfiguration.class,
        HibernateJpaAutoConfiguration.class})
public class MySpringBootApplication {         
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

@SpringBootApplication#exclude属性是属性的别名@EnableAutoConfiguration#exclude,我发现它非常方便和有用.
@Import(MyPersistenceConfiguration.class)在示例中添加了演示如何应用自定义数据库配置的示例.

  • 谢谢!这是最现代的答案。链接到这里:https://konstructcomputers.blogspot.com/2018/10/slimming-down-spring-boot-app-for.html (2认同)

ryz*_*man 9

对我来说,出路就是补充一下

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
Run Code Online (Sandbox Code Playgroud)

运行Spring引导的类的注释(标有`@SpringBootApplication).

最后,它看起来像:

@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application{

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
 }
Run Code Online (Sandbox Code Playgroud)


Dir*_*irk 8

另一种通过配置文件控制它的方法是:

// note: no @SpringApplication annotation here
@Import(DatabaseConfig.class)
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@Configuration
@Import({DatabaseConfig.WithDB.class, DatabaseConfig.WithoutDB.class})
public class DatabaseConfig {

    @Profile("!db")
    @EnableAutoConfiguration(
            exclude = {DataSourceAutoConfiguration.class,   DataSourceTransactionManagerAutoConfiguration.class,
                HibernateJpaAutoConfiguration.class})
    static class WithoutDB {

    }

    @Profile("db")
    @EnableAutoConfiguration
    static class WithDB {

    }
}
Run Code Online (Sandbox Code Playgroud)