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

我使用 SpringBoot 开发两个应用程序,一个用作服务器,另一个是客户端应用程序。然而,它们都是同一个应用程序,基于活动配置文件的功能不同。我使用 SpringBoot 的自动配置特性来配置我的应用程序。

我想在客户端应用程序上禁用所有与数据库相关的自动配置,因为它不需要数据库连接。应用程序不应该尝试与数据库建立连接,也不应该尝试使用任何 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

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

223903 次浏览

我做类似事情的方法是:

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

为服务器应用程序编写类似的应用程序(不排除)。

最后一步是从主弹簧启动类中禁用 Auto Configuration:

@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);
}
}

更改: @SpringBootApplication为:

@Configuration
@ComponentScan

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

Http://docs.spring.io/spring-boot/docs/current-snapshot/reference/htmlsingle/#auto-configuration-classes

希望能帮上忙

看起来你只是忘记了用逗号来分隔类。所以根据你的配置,下面的方法可以奏效:

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

或者,您也可以将其定义为:

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

我的出路就是加上

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

注释到运行 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);
}
}

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

无法确定 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);
}
}

2. 使用 Application.properties:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

即使我做了上面提到的所有解决方案,我还是得到了这个错误。

 by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfig ...

在某个时候,当我查找 POM 时,它有这种依赖关系

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Pojo 类具有以下导入

实体; 导入 javax.restence.GeneratedValue; 进口 javax.persistence.id ;

这清楚地表明应用程序期望一个数据源。

我所做的是从 pom 中删除了 JPA 依赖项,并用以下代码替换了 pojo 的导入

进口 org.springframework.data.annotation.id ; 导入 org.springframework.data.monGodb.core.Mapping. Document;

最后,我得到了成功的构建。检查一下,你可能会遇到同样的问题

有一种使用 @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);
}
}

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

通过 Profiles 控制它的另一种方法是:

// 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 {


}
}

我在@SpringBootApplication 之后添加 myApp.java

@ EnableAutoConfiguration (排除 = { DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class,HibernateJpaAutoConfiguration.class })

变了

@ SpringBootApplication = > < strong >@Configuration

所以,我在我的主类(myApp.java)中有这个

package br.com.company.project.app;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.annotation.Configuration;


@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class SomeApplication {


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

}

为我工作! =)

我在这里遇到了同样的问题,解决方法是这样的:

只需添加另一个 application-{yourprofile}.yml,其中“ yourprofile”可以是“ client”。

在我的情况下,我只是想删除 Redis 在一个 Dev 配置文件,所以我添加了一个 application-dev.yml旁边的主 application.yml和它做的工作。

在这个文件中,我写道:

spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration

这也应该适用于属性文件。

我喜欢这样一个事实,即不需要更改应用程序代码就可以做到这一点。

另外,如果您使用的是 Spring 执行器 org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthContributorAutoConfiguration也可能正在初始化 DataSource。

如果使用 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

在我的例子中,spring-boot-starter-jpa依赖项是从其他依赖项加载的,我这样做是为了禁用 DataSource:

  1. mvn dependency:tree检查依赖树
[INFO] com.backend.app:crud-manager:jar:0.1-SNAPSHOT
[INFO] +- ...
[INFO] \- com.backend.app:crud-libraries:jar:0.1-SNAPSHOT:compile
[INFO]    +- org.springframework.boot:spring-boot-starter.data-jpa:jar:2.1.6.RELEASE:compile
[INFO]    +- ....
  1. 有一个子依赖项。添加一个排除项
<dependency>
<groupId>com.backend.app</groupId>
<artifactId>crud-libraries</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusion>
</exclusions>
</dependency>
  1. 在 Application 文件中排除 DataSourceAutoConfiguration.class
import org.springframework.boot.autoconfigure.jdbc. DataSourceAutoConfiguration;


// add exclude
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class ...
  1. 确保 pom.xml 中没有 spring-boot-starter-jpa

* * 分开,如果你也需要使它与 spring-boot-starter-batch工作

在 BatchConfig 文件中:

// add extends DefaultBatchConfig
public class BatchConfig extends DefaultBatchConfig {


//add override
@Override
public void setDataSource(DataSource dataSource) {}

在 Spring 中,默认情况下,所有已定义的 bean 及其依赖项都是在创建应用程序上下文时创建的。

相反,当我们使用惰性初始模式配置 bean 时,只有在需要的时候才会创建 bean 并注入它的依赖项。

spring:
main:
lazy-initialization: true
jpa:
properties:
hibernate: # lazy-initialization works with this dialect property to avoid run issues if DB is Down
dialect: org.hibernate.dialect.Oracle10gDialect