0.叠甲
博主是一个编程菜鸟,所以如有什么写的不正确或有误的部分请诸君友善交流,如果对诸位有帮助的话也请点个赞鼓励一下吧,非常感谢
1.GPT给的回答
1.1. 概述
在Spring Boot中,当你在一个类上添加了@Configuration
注解,这个类就会被视为一个配置类,Spring Boot会在启动时自动扫描并加载这些配置。如果你想要让一个模块的SpringBootApplication
能够使用另一个模块中的配置类,你需要确保几件事情:
1.2. 配置类的扫描路径
确保配置类位于SpringBootApplication
的扫描路径下。这通常是在@SpringBootApplication
注解的scanBasePackages
属性中指定的包路径,或者如果使用了@ComponentScan
注解,那么就是在这个注解的basePackageClasses
属性中指定的。
@SpringBootApplication(scanBasePackages = "com.example.module1", componentScan = @ComponentScan(basePackageClasses = {ConfigClass.class}))
public class Module1Application {
public static void main(String[] args) {
SpringApplication.run(Module1Application.class, args);
}
}
在这个例子中,com.example.module1
是配置类的包路径,而ConfigClass
是配置类的类本身。
1.3. 模块间的依赖
确保你的主模块(包含SpringBootApplication
的模块)在pom.xml
或build.gradle
中添加了对包含配置类的模块的依赖。
<!-- Maven example -->
<dependency>
<groupId>com.example</groupId>
<artifactId>module1</artifactId>
<version>1.0.0</version>
</dependency>
// Gradle example
dependencies {
implementation 'com.example:module1:1.0.0'
}
1.4.启用配置
如果你的配置类中定义了@Bean
方法,Spring Boot会自动注册这些bean。如果你需要在配置类中使用@Import
来导入其他配置类,确保这些被导入的配置类也在Spring Boot的扫描路径下。
@Configuration
@Import({OtherConfigClass.class})
public class ConfigClass {
// ...
}
1.5.启动类的位置
确保你的SpringBootApplication
所在的类位于一个合适的位置,这样Spring Boot的组件扫描才能找到你的配置类。通常,你的启动类应该位于主应用程序包的根目录下或者其子包中。
1.6.Spring Boot的自动配置
Spring Boot的自动配置可能会覆盖你的某些配置,如果你发现配置没有按预期工作,可以查看Spring Boot的自动配置类和属性,确保它们没有冲突。
1.7. 额外说明
如果你已经按照上述步骤操作,你的SpringBootApplication
应该能够加载并使用你的配置类中定义的所有@Bean
和其他配置。如果配置没有生效,你可能需要检查你的配置类是否真的被Spring Boot扫描到了,或者是否有其他配置覆盖了你的配置。在这种情况下,你可以使用@Profile
注解来激活特定的配置类,或者使用@Conditional
注解来控制配置类的加载条件。
1.8. 备注
2.本次的实践——Import注解
2.1. 问题概述
由于该项目是微服务项目,多个服务共用数据源,并且同时使用了redis和MySQL8数据库,为了减少冗余代码,所以专门写一个配置类用来配置数据源的信息
2.2. 解决方式
本次解决方案涉及三个子模块:
- user-service
- appointment-service
- hpes-api
采用的解决方案:使用@Import
注解将配置类导入,样例代码如下:
user-service
@Import(DatabaseConfig.class)
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
appointment-service
@Import(DatabaseConfig.class)
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
hpes-api的配置类
package com.hospital_physical_examination_system.api.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
/**
* @Author :
* @Date : 2024/4/11 15:25
* @Description :
*/
@Configuration
public class DatabaseConfig {
/**
* MySQL 的账号配置
* @Author :
* @Date 2024/4/8 14:01
*/
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/Hospital_physical_examination_system?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai");
dataSource.setUsername("root");
dataSource.setPassword("xxxxxxxx");
return dataSource;
}
/**
* Redis 的账号配置
* @Author :
* @Date 2024/4/8 14:01
*/
@Bean
public RedisConnectionFactory redisConnectionFactory() {
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory();
connectionFactory.setHostName("localhost");
connectionFactory.setPort(6379);
connectionFactory.setPassword("xxxxxxxx");
return connectionFactory;
}
}
项目结构