【Spring Boot】同项目不同模块间的配置类导入

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.xmlbuild.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. 解决方式

本次解决方案涉及三个子模块:

  1. user-service
  2. appointment-service
  3. 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;
    }
}

项目结构

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值