关于Spring properties --> Map 注入到bean中

本文介绍如何使用Spring将properties文件以Map形式注入到Bean中,并演示了通过自定义PropertiesFactoryBean来实现properties文件到Map的复杂转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring properties to map

一个key-value形式的properties文件 以Map的形式注入到Spring的bean中

properties文件形式

RF09001=fooService#method1#name,phone

spring 配置

    <bean id="noMethodMap" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="location" value="classpath:foo.properties"/>
    </bean>

注入到Bean中

    @Resource(name="noMethodMap")
    private Map<String, String> noMethodMap;

其他

如何定位注入源码

修改为一个不存在的资源名称

@Resource(name="nonexist")

此时启动会报错

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'nonexist' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:687)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1207)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:522)

可知是在哪里注入的了

在哪里将PropertiesFactoryBean转成Map

同样的处理方式 将注入变量修改成一个错误的类型 查看错误信息即可

private String noMethodMap; // map --> String

启动会报错

Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'noMethodMap' is expected to be of type 'java.lang.String' but was actually of type 'java.util.Properties'
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:378)

就知道是在哪里进行类型转换的了

如果想对properties-->Map做一下自定义的处理呢

如RF09001-RF09010对应的都是同一个value

RF09001-RF09003=fooService#method1#name,phone

但是想Map中的实际形式为

RF09001=fooService#method1#name,phone
RF09002=fooService#method1#name,phone
RF09003=fooService#method1#name,phone

继承PropertiesFactoryBean 覆盖createProperties即可

public class MyPropertiesFactoryBean extends PropertiesFactoryBean{
    @Override
    protected Properties createProperties() throws IOException {
        Properties properties = super.createProperties();
        Enumeration<String> propertyNames = (Enumeration<String>) properties.propertyNames();
        while(propertyNames.hasMoreElements()){
            String name = propertyNames.nextElement();
            if(name.matches("\\w+-\\w+")){
                String rawName = name;
                String[] split = rawName.split("-");
                Integer start = Integer.valueOf(split[0].substring(2));
                Integer end = Integer.valueOf(split[1].substring(2));
                for (int i = start; i <= end; i++) {
                    properties.setProperty("RF" + i, properties.getProperty(rawName));
                }
            }
        }
        return properties;
    }

spring配置改成

<bean id="noMethodMap" class="com.foo.app.util.MyPropertiesFactoryBean">
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.4.7</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>takeoutsystem</artifactId> <version>0.0.1-SNAPSHOT</version> <name>takeoutsystem</name> <description>takeoutsystem</description> <properties> <java.version>17</java.version> <!-- 关键修改:升级MyBatis到3.5.15 --> <mybatis.version>3.5.15</mybatis.version> <mybatis-plus.version>3.5.7</mybatis-plus.version> <mybatis-spring.version>3.0.3</mybatis-spring.version> <jjwt.version>0.11.5</jjwt.version> <springdoc-openapi.version>2.8.5</springdoc-openapi.version> <thymeleaf-extras-springsecurity6.version>3.1.2.RELEASE</thymeleaf-extras-springsecurity6.version> </properties> <dependencyManagement> <dependencies> <!-- 强制所有模块使用此MyBatis版本 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis-spring.version}</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- Spring Boot 基础依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- MyBatis-Plus 依赖(排除冲突版本) --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> <exclusions> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </exclusion> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式指定升级后的MyBatis版本 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis-spring.version}</version> </dependency> <!-- 数据库依赖 --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> </dependency> <!-- 安全与认证依赖 --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>${jjwt.version}</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>${jjwt.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>${jjwt.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity6</artifactId> <version>${thymeleaf-extras-springsecurity6.version}</version> </dependency> <!-- API文档 --> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>${springdoc-openapi.version}</version> </dependency> <!-- 测试依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter-test</artifactId> <version>${mybatis-plus.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 修改代码,只保留Mybatis
最新发布
07-15
<think>我们只需要保留MyBatis,移除MyBatis-Plus。因此,我们需要: 1. 移除MyBatis-Plus相关的依赖(包括mybatis-plus-boot-starter和mybatis-plus-boot-starter-test) 2. 添加MyBatis官方的Spring Boot Starter(mybatis-spring-boot-starter) 3. 调整MyBatis版本(如果需要,但官方starter会管理版本,我们也可以不显式指定,除非有特殊版本需求) 4. 移除之前为了排除MyBatis-Plus中MyBatis而显式添加的MyBatis依赖(因为现在使用官方starter,它会自动引入正确版本的MyBatis) 5. 注意:我们之前显式指定了MyBatis的版本,现在如果使用官方starter,我们可以在<properties>中指定mybatis-spring-boot-starter的版本,或者由Spring Boot父项目管理。 但是,请注意:Spring Boot父项目已经为MyBatis starter提供了版本管理。由于我们使用了Spring Boot 3.4.7,它会自动管理mybatis-spring-boot-starter的版本(目前是3.0.3)。这个starter会引入合适版本的MyBatis(3.5.13)和MyBatis-Spring(3.0.3)。如果我们想要使用更高版本的MyBatis(如3.5.15),我们可以显式覆盖。 步骤: 1. 移除`mybatis-plus-boot-starter`和`mybatis-plus-boot-starter-test`依赖。 2. 添加MyBatis官方starter: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> <!-- 这个版本由Spring Boot管理,但我们可以显式指定,或者通过属性控制 --> </dependency> 3. 由于我们之前已经显式指定了MyBatis的版本(3.5.15)和MyBatis-Spring(3.0.3),我们可以继续保留这些版本,但需要确保starter引入的版本与之一致。为了避免冲突,我们可以: - 在依赖中排除starter自带的MyBatis和MyBatis-Spring,然后显式添加我们指定的版本(与之前类似)。 - 或者,直接使用starter管理的版本,移除我们显式指定的MyBatis和MyBatis-Spring依赖,并相信starter会引入正确的版本。 这里我们选择第二种方式,因为starter已经管理了版本。但是,如果我们想使用特定的MyBatis版本(比如3.5.15),我们可以通过覆盖属性来实现。 注意:在Spring Boot的依赖管理中,mybatis-spring-boot-starter的版本为3.0.3(与Spring Boot 3.4.7兼容),它默认引入的MyBatis版本是3.5.13。如果我们想升级到3.5.15,可以在<properties>中覆盖: <mybatis.version>3.5.15</mybatis.version> <mybatis-spring.version>3.0.3</mybatis-spring.version> <!-- 注意:MyBatis-Spring需要与MyBatis版本匹配,且与Spring Boot兼容 --> 4. 移除之前显式声明的MyBatis和MyBatis-Spring依赖(即下面两个依赖): <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis-spring.version}</version> </dependency> 因为starter会引入它们。 5. 移除`<dependencyManagement>`中关于MyBatis的部分?不需要,因为我们已经通过属性控制了版本,而且<dependencyManagement>中的声明会覆盖starter引入的版本。但是,为了清晰,我们可以保留属性设置,并移除<dependencyManagement>中的显式依赖,因为属性覆盖已经足够。 6. 修改后的依赖: - 添加mybatis-spring-boot-starter - 移除mybatis-plus-boot-starter和mybatis-plus-boot-starter-test - 移除显式的mybatis和mybatis-spring依赖(因为starter包含了它们) 7. 调整属性:我们保留mybatis.version和mybatis-spring.version属性,这样我们可以控制版本。 8. 注意:mybatis-spring-boot-starter会自动配置SqlSessionFactory等,所以不需要额外配置(除非有特殊需求)。 修改后的pom.xml文件如下:</think>### 修改后的 `pom.xml`(仅保留 MyBatis) 以下是移除 MyBatis-Plus 并仅保留原生 MyBatis 的完整配置: ```xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.4.7</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>takeoutsystem</artifactId> <version>0.0.1-SNAPSHOT</version> <name>takeoutsystem</name> <description>takeoutsystem</description> <properties> <java.version>17</java.version> <!-- MyBatis 版本 --> <mybatis.version>3.5.15</mybatis.version> <mybatis-spring.version>3.0.3</mybatis-spring.version> <!-- 其他依赖版本 --> <jjwt.version>0.11.5</jjwt.version> <springdoc-openapi.version>2.8.5</springdoc-openapi.version> <thymeleaf-extras-springsecurity6.version>3.1.2.RELEASE</thymeleaf-extras-springsecurity6.version> </properties> <dependencyManagement> <dependencies> <!-- 强制所有模块使用此MyBatis版本 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis-spring.version}</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- Spring Boot 基础依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- 原生 MyBatis Starter --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> <exclusions> <!-- 排除旧版 MyBatis --> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </exclusion> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式指定升级后的MyBatis版本 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis-spring.version}</version> </dependency> <!-- 数据库依赖 --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> </dependency> <!-- 安全与认证依赖 --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>${jjwt.version}</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>${jjwt.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>${jjwt.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity6</artifactId> <version>${thymeleaf-extras-springsecurity6.version}</version> </dependency> <!-- API文档 --> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>${springdoc-openapi.version}</version> </dependency> <!-- 测试依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> ``` ### 关键修改说明 1. **移除 MyBatis-Plus 依赖**: ```diff - <dependency> - <groupId>com.baomidou</groupId> - <artifactId>mybatis-plus-boot-starter</artifactId> - ... - </dependency> ``` 2. **添加原生 MyBatis Starter**: ```xml <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> <exclusions> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </exclusion> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> </exclusion> </exclusions> </dependency> ``` 3. **移除 MyBatis-Plus 测试依赖**: ```diff - <dependency> - <groupId>com.baomidou</groupId> - <artifactId>mybatis-plus-boot-starter-test</artifactId> - ... - </dependency> ``` 4. **添加标准 Spring 测试依赖**: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <scope>test</scope> </dependency> ``` ### 配置验证 #### 1. 基础 MyBatis 配置类 ```java @Configuration @MapperScan("com.example.mapper") public class MyBatisConfig { @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); // 添加自定义配置 org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(); configuration.setMapUnderscoreToCamelCase(true); sessionFactory.setConfiguration(configuration); return sessionFactory.getObject(); } } ``` #### 2. 示例 Mapper 接口 ```java public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") User findById(@Param("id") Long id); @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})") @Options(useGeneratedKeys = true, keyProperty = "id") void insert(User user); } ``` #### 3. 应用配置文件 (`application.yml`) ```yaml mybatis: configuration: map-underscore-to-camel-case: true mapper-locations: classpath:mapper/*.xml spring: datasource: url: jdbc:mysql://localhost:3306/mydb username: root password: password driver-class-name: com.mysql.cj.jdbc.Driver ``` ### MyBatis 与 MyBatis-Plus 功能对比 | 功能 | MyBatis 原生实现 | MyBatis-Plus 实现 | |---------------------|--------------------------------------|----------------------------------------| | **CRUD 操作** | 手动编写 SQL 或注解 | 内置通用 Mapper (`BaseMapper`) | | **分页** | 需手动实现或集成 PageHelper | 内置分页插件 (`PaginationInterceptor`) | | **代码生成** | 需第三方工具 | 内置代码生成器 | | **条件构造器** | 需手动拼接 SQL | `QueryWrapper`/`UpdateWrapper` | | **乐观锁** | 手动实现 | 内置 `@Version` 注解支持 | | **性能分析插件** | 无内置 | 内置 SQL 性能分析插件 | ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值