Spring学习-02 Spring 注解配置和XML混用

本文介绍如何在Spring框架中混合使用注解和XML进行配置,通过@ImportResource注解实现,同时展示了如何使用SpringJUnit4ClassRunner进行单元测试。

Spring学习-02 Spring 注解配置和XML混用

利用@ImportResource

1.创建一个配置类用来加载xml或者直接在MainConfig.java上加载xml

方式一 直接在主配置类加

@Configuration
@ComponentScan("com.min.spring")
@ImportResource("classpath:beans.xml")
public class MainConfig {
}

方式二 创建例外一个配置类

@Configuration
@ImportResource("classpath:applicationContext.xml")
class TestConfig {

}

使用时利用@ContextConfiguration来加载

@ContextConfiguration(classes = {MainConfig.class, TestConfig.class})
2.使用JUnit来测试

这里使用SpringJUnit4ClassRunner来测试

**需要导入依赖spring-test**

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.1.8.RELEASE</version>
</dependency>

测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {MainConfig.class, TestConfig.class})
public class testConfig1 {     
    @Autowired
    ApplicationContext context;

    @Test
    public void testConfig1() {
        String[] names = context.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    } 
}
<think> 嗯,用户这次的问题聚焦在Spring Boot项目中同时使用spring-boot-starter-data-redisredisson-spring-boot-starter时的兼容性问题报错,特别是打包后出现的异常。用户明确引用了三个资料片段,其中第三个引用展示了通过exclusion指定版本缓解冲突的尝试,但用户需要更系统的解决方案。 从用户的技术描述看,ta应该是个有Spring Boot开发经验的开发者,可能正在整合Redis高级功能时遇到依赖冲突的典型问题。用户情绪可能有些焦虑,因为运行时不报错但打包失败很棘手——这类问题往往需要深入分析依赖树。值得注意的是用户特意强调了“不是需求参考”,说明ta需要针对性解答而非概念对比。 核心难点在于这两个starter都包含Redis连接配置,特别是: 1. Lettuce客户端冲突:spring-boot-starter-data-redis默认绑定Lettuce,而redisson-spring-boot-starter会覆盖连接工厂 2. Spring Data版本适配:如引用[3]所示,redisson-spring-data-xx模块需要严格匹配Spring Data版本 3. 自动配置冲突:两个starter都会自动配置RedisTemplate连接工厂 接下来需要分三层解决: 第一层是依赖隔离——必须排除重复组件,重点处理redisson-spring-data-xx的版本匹配问题。用户引用的exclusion方案正确但不够完整,需要补充Spring Boot版本对应关系表。 第二层是配置优先级控制,尤其是连接参数配置的合并策略。用户可能没意识到redisson的配置会完全覆盖spring-data-redis,这里需要明确配置覆盖顺序。 第三层是运行验证策略,用户提到的“打包后报错”暗示需要区分测试场景,需补充mvn dependency:tree的排查方法spring-boot-maven-plugin的配置要点。 考虑到用户实际开发场景,还要提醒兼容性问题的连锁反应:比如Redisson的分布式锁Spring Cache注解混用时的事务管理器冲突——虽然用户没提,但这几乎是必然出现的次级问题。 </think> 以下是针对 **spring-boot-starter-data-redis** 与 **redisson-spring-boot-starter** 同时使用时兼容性报错的系统性解决方案,结合依赖冲突分析配置调整: --- ### 一、问题根源分析 1. **依赖冲突** - `spring-boot-starter-data-redis` 默认使用 Lettuce 或 Jedis 操作 Redis,提供 `RedisTemplate` 等基础功能。 - `redisson-spring-boot-starter` 依赖 Redisson 客户端,且包含适配 Spring Data 的模块(如 `redisson-spring-data-XX`),**二者可能重复注册 `RedisConnectionFactory`**。 2. **版本不匹配** Redisson 的 `redisson-spring-data-XX` 模块需严格匹配 Spring Data Redis 版本(如 `spring-data-redis:2.6.x` 对应 `redisson-spring-data-26`),否则报 `ClassNotFoundException` 或方法签名错误 [^3]。 3. **自动配置冲突** 两个 Starter 均尝试自动配置 `RedisConnectionFactory`,导致 `BeanDefinitionOverrideException`。 --- ### 二、解决方案 #### 步骤 1:排除冲突依赖 在 `redisson-spring-boot-starter` 中排除 Spring Data 适配模块,手动指定匹配版本: ```xml <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.17.7</version> <exclusions> <!-- 排除默认的适配器 --> <exclusion> <groupId>org.redisson</groupId> <artifactId>redisson-spring-data-*</artifactId> </exclusion> </exclusions> </dependency> <!-- 根据 Spring Boot 版本选择适配器 --> <!-- Spring Boot 2.6.x → redisson-spring-data-26 --> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-data-26</artifactId> <version>3.17.7</version> </dependency> ``` > **关键点**: > - Spring Boot 2.1.x → `redisson-spring-data-21` > - Spring Boot 2.6.x → `redisson-spring-data-26` > - Spring Boot 3.0.x → `redisson-spring-data-30` > 版本映射见 [Redisson官方文档](https://github.com/redisson/redisson/tree/master/redisson-spring-data-modules) [^3]. --- #### 步骤 2:统一连接配置 在 `application.yml` 中 **仅保留一处 Redis 连接配置**(推荐使用 Redisson 配置): ```yaml spring: redis: host: 127.0.0.1 port: 6379 # 其他配置... # 禁用 spring-boot-starter-data-redis 的自动连接工厂 redisson: config: | singleServerConfig: address: "redis://${spring.redis.host}:${spring.redis.port}" database: 0 ``` --- #### 步骤 3:显式声明 Bean 优先级 通过 `@Primary` 注解确保 Redisson 的 `RedisConnectionFactory` 优先生效: ```java @Configuration public class RedisConfig { @Bean @Primary public RedisConnectionFactory redissonConnectionFactory(RedissonClient redisson) { return new RedissonConnectionFactory(redisson); } } ``` --- ### 三、验证与排查 1. **依赖树检查** 执行命令确认冲突已解决: ```bash mvn dependency:tree -Dincludes=org.redisson,org.springframework.data:spring-data-redis ``` 2. **打包后测试** 使用 `spring-boot-maven-plugin` 打包后运行: ```bash java -jar target/your-app.jar ``` 3. **常见错误处理** - **`NoSuchMethodError`**:检查 `redisson-spring-data-XX` 版本是否匹配 Spring Data Redis 版本。 - **`BeanCreationException`**:确认是否重复配置了 `RedisTemplate`。 --- ### 四、替代方案 若仍需使用 `RedisTemplate` Redisson 分布式锁: ```java @Bean public RedisTemplate<String, Object> redisTemplate( @Qualifier("redissonConnectionFactory") RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); return template; } @Bean public RedissonClient redissonClient() { Config config = new Config(); config.useSingleServer().setAddress("redis://localhost:6379"); return Redisson.create(config); } ``` --- **总结**:核心解决思路是 **排除冲突模块 + 精确版本匹配 + 显式控制 Bean 优先级**。通过依赖隔离配置统一,可同时使用两种组件的高级特性(如 Redisson 分布式锁 + Spring Cache 注解)[^1][^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值