在 Spring 启动时禁用所有与数据库相关的自动配置
Disable all Database related auto configuration in 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
但是,应用程序在启动时仍会尝试连接到数据库。这些排除是否足以满足我的要求?
我做类似事情的方式是:
@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@Profile ("client_app_profile_name")
public class ClientAppConfiguration {
//it can be left blank
}
为服务器应用程序编写一个类似的应用程序(不排除)。
最后一步是从主 spring 引导禁用自动配置 class:
@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
这应该可以完成工作。现在,我在示例中排除的依赖项可能不完整。它们对我来说已经足够了,但我不确定是否完全禁用与数据库相关的库。检查下面的列表以确保:
希望对您有所帮助
好像您只是忘记了分隔 类 的逗号。因此,根据您的配置,以下将起作用:
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})
对 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);
}
}
禁用所有与数据库相关的自动配置并退出:
Cannot determine embedded database driver class for database type 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 class 具有以下导入
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
这清楚地表明应用程序需要数据源。
我所做的是从 pom 中删除了 JPA 依赖项,并用以下内容替换了 pojo 的导入
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
我终于成功构建了。看看你可能 运行 遇到了同样的问题
有一种方法可以使用 @SpringBootApplication
注释排除特定的 auto-configuration 类。
@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)
以演示如何应用自定义数据库配置。
另一种通过配置文件控制它的方法是:
// 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(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
并更改了
@SpringBootApplication => @Configuration
所以,我的主程序中有这个 class (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"。
在我的例子中,我只是想删除 Dev 配置文件中的 Redis,所以我在主要 application.yml
旁边添加了一个 application-dev.yml
,它完成了工作。
我在这个文件中输入:
spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration
this should work with properties files as well.
我喜欢这样一个事实,即无需更改应用程序代码即可做到这一点。
此外,如果您使用 Spring Actuator 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
依赖项是从其他依赖项加载的。我这样做是为了禁用数据源:
- 用
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] +- ....
- 有一个sub-dependency。添加排除项
<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>
- 在应用程序文件中排除 DataSourceAutoConfiguration.class
import org.springframework.boot.autoconfigure.jdbc. DataSourceAutoConfiguration;
// add exclude
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class ...
- 确保pom.xml
中没有spring-boot-starter-jpa
** Apart,以防您还需要使其与 spring-boot-starter-batch
一起使用
在 BatchConfig 文件中:
// add extends DefaultBatchConfig
public class BatchConfig extends DefaultBatchConfig {
//add override
@Override
public void setDataSource(DataSource dataSource) {}
我正在使用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
但是,应用程序在启动时仍会尝试连接到数据库。这些排除是否足以满足我的要求?
我做类似事情的方式是:
@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@Profile ("client_app_profile_name")
public class ClientAppConfiguration {
//it can be left blank
}
为服务器应用程序编写一个类似的应用程序(不排除)。
最后一步是从主 spring 引导禁用自动配置 class:
@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
这应该可以完成工作。现在,我在示例中排除的依赖项可能不完整。它们对我来说已经足够了,但我不确定是否完全禁用与数据库相关的库。检查下面的列表以确保:
希望对您有所帮助
好像您只是忘记了分隔 类 的逗号。因此,根据您的配置,以下将起作用:
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})
对 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);
}
}
禁用所有与数据库相关的自动配置并退出:
Cannot determine embedded database driver class for database type 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 class 具有以下导入
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
这清楚地表明应用程序需要数据源。
我所做的是从 pom 中删除了 JPA 依赖项,并用以下内容替换了 pojo 的导入
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
我终于成功构建了。看看你可能 运行 遇到了同样的问题
有一种方法可以使用 @SpringBootApplication
注释排除特定的 auto-configuration 类。
@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)
以演示如何应用自定义数据库配置。
另一种通过配置文件控制它的方法是:
// 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(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
并更改了
@SpringBootApplication => @Configuration
所以,我的主程序中有这个 class (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"。
在我的例子中,我只是想删除 Dev 配置文件中的 Redis,所以我在主要 application.yml
旁边添加了一个 application-dev.yml
,它完成了工作。
我在这个文件中输入:
spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration
this should work with properties files as well.
我喜欢这样一个事实,即无需更改应用程序代码即可做到这一点。
此外,如果您使用 Spring Actuator 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
依赖项是从其他依赖项加载的。我这样做是为了禁用数据源:
- 用
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] +- ....
- 有一个sub-dependency。添加排除项
<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>
- 在应用程序文件中排除 DataSourceAutoConfiguration.class
import org.springframework.boot.autoconfigure.jdbc. DataSourceAutoConfiguration;
// add exclude
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class ...
- 确保pom.xml 中没有
spring-boot-starter-jpa
** Apart,以防您还需要使其与 spring-boot-starter-batch
在 BatchConfig 文件中:
// add extends DefaultBatchConfig
public class BatchConfig extends DefaultBatchConfig {
//add override
@Override
public void setDataSource(DataSource dataSource) {}