Spring配置文件中id的第二个字母不能大写问题 (转)

探讨Spring配置文件中ID命名规范,特别是第二个字母大小写的问题及其影响。分析背后原理,并给出不同场景下的表现。

Spring配置文件中id的第二个字母不能大写问题

http://xiaotian-ls.iteye.com/blog/273232

 

 

今天遇到一个问题,在spring配置文件中的id第二个字母不能大写,否则会产生异常:Bean property 'kManager' is not writable or has an invalid setter method. Did you mean 'KManager'?.为了解决问题研究了一下问题的原因:spring在autoWire的同时用到了jdk提供的java.beans.*目录下的类(等有时间好好研究一下这些类,功能很强大),通过它们能够得到bean的详细信息。其中有个类PropertyDestriptor类能够通过bean中的set/get方法找到property,不过有个小前提:property的命名要遵循第二个字母不能大写。因为java是国外开发的,它对命名遵循了英语的一个规范:大部分的单词第二个字母都是小写的,除了URL之类的单词。
        下面的java.beans.Introspector类中通过set/get方法找到property的代码(希望大家可以自己去看看java.beans.*的代码)。Open Source! I love it.

/**
     * Utility method to take a string and convert it to normal Java variable
     * name capitalization.  This normally means converting the first
     * character from upper case to lower case, but in the (unusual) special
     * case when there is more than one character and both the first and
     * second characters are upper case, we leave it alone.
     * <p>
     * Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays
     * as "URL".
     *
     * @param  name The string to be decapitalized.
     * @return  The decapitalized version of the string.
     */
    public static String decapitalize(String name) {
 if (name == null || name.length() == 0) {
     return name;
 }
 if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
   Character.isUpperCase(name.charAt(0))){
     return name;
 }
 char chars[] = name.toCharArray();
 chars[0] = Character.toLowerCase(chars[0]);
 return new String(chars);
    }

 

 

1 楼 harman001 2009-07-03   引用
,为什么我的id大写同样没事啊!- -!
在struts中调用无论运用手工注入还是自动注入,都是可以找到此类的.
在单元测试中,手工注入方式是可以找到此类的.
在单元测试中, 自动注入方式是找不到此类的
<think>好的,我现在需要帮助用户解决如何在Maven项目中通过pom.xml添加Spring依赖,并配置applicationContext.xml文件的问题。用户之前已经提供过相关的示例,现在需要结合站内的引用内容来详细回答。 首先,我需要回顾用户之前的提问和我的回答。用户之前展示了一个使用Spring IOC实现HelloWorldWebService的完整例子,其中包括了项目结构、pom.xml的依赖配置、服务类、applicationContext.xml的配置以及启动类。现在用户想更详细地了解如何添加Spring依赖和配置Spring容器,所以需要详细解释这两个部分。 接下来,我需要参考用户提供的引用内容。引用[1]提到spring-config.xml(即applicationContext.xml)的作用,用于定义和管理bean,以及依赖注入等。引用[3]提到了在IDEA项目中配置pom.xml,引入所需的jar包,并提到了需要编写applicationContext.xml和springMVC.xml,并在web.xml中加载。引用[4]则介绍了如何通过XML配置注解支持,比如context:component-scan和context:annotation-config。 用户的问题分为两部分:添加Spring依赖到pom.xml和配置applicationContext.xml。我需要结合这些引用来组织回答,确保信息准确,并且覆盖用户可能需要的细节。 首先,关于pom.xml中的依赖添加。用户之前的例子中使用了spring-context的5.3.20版本,但根据引用[3],用户可能在使用较旧的版本或者需要更多的模块。需要建议使用Spring 5.x版本,并可能引入核心容器、AOP等模块。同时,要注意Maven的依赖范围,默认是compile,但有时候可能需要其他作用域。 然后,关于applicationContext.xml的配置。根据引用[1]和用户之前的示例,需要定义bean,使用<bean>标签,并配置属性注入。同时,引用[4]提到注解配置,如context:component-scan,所以可能需要说明两种方式:XML配置和注解配置。用户可能需要知道如何启用注解支持,以及如何扫描组件。 另外,用户可能对配置文件的位置和命名有疑问,比如是否必须命名为applicationContext.xml,或者是否可以拆分多个配置文件。根据引用[1],文件名可以自定义,但通常使用标准名称。同时,引用[3]提到加载多个配置文件到web.xml,但当前问题可能不涉及Web应用,所以可以省略这部分,专注于基本的容器配置。 还需要注意,用户可能对XML配置的语法不太熟悉,比如命名空间和schema的位置。在用户之前的示例中,applicationContext.xml包含了beans的命名空间和xsi的声明,引用[4]也展示了如何添加context命名空间。需要详细说明这些配置的作用,以及如何正确编写XML文件的结构。 此外,用户可能想知道为什么需要设置setter方法进行属性注入,如引用[3]提到的。需要解释Spring的依赖注入机制,特别是基于setter的注入,并强调必须提供setter方法才能让Spring通过property标签注入值。 最后,可能还需要给出验证配置是否成功的方法,比如编写一个简单的测试类,加载上下文并获取bean,调用方法查看输出是否正确,如用户之前的示例中的AppMain类。 总结步骤: 1. 在pom.xml中添加Spring依赖,包括spring-context,可能还有spring-core等,注意版本号。 2. 创建applicationContext.xml文件,配置命名空间和bean定义。 3. 可选:配置注解支持,使用context:component-scan自动扫描组件。 4. 编写测试类,加载上下文,获取bean并测试功能。 需要注意可能的常见错误,比如依赖版本不兼容,XML配置错误导致Bean无法创建,或者setter方法缺失导致属性注入失败。同时,要确保项目结构符合Maven标准,配置文件放在src/main/resources下。 现在需要将这些步骤详细地分点说明,结合引用中的信息,并给出示例代码,确保用户能够按步骤操作成功。</think>以下是在Maven项目中添加Spring依赖并配置Spring容器的完整指南,结合Spring IOC核心原理和最佳实践: ### 一、添加Spring依赖到pom.xml(含版本控制) ```xml <!-- 基础Spring容器依赖(包含IOC核心) --> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.20</version> </dependency> <!-- 可选:增强型依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.20</version> </dependency> </dependencies> ``` **关键配置说明:** 1. `spring-context` 是核心依赖,包含BeanFactory、ApplicationContext等IOC容器实现[^1] 2. 推荐使用5.x版本(最低Java 8),支持XML和注解混合配置 3. 通过`mvn clean install`自动下载依赖(需配置镜像仓库) ### 二、配置applicationContext.xml(两种模式) #### 模式1:纯XML配置(经典方式) ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 基本Bean定义(ID需唯一) --> <bean id="userService" class="com.example.service.UserServiceImpl"> <!-- setter注入 --> <property name="username" value="张三"/> <property name="dataSource" ref="dataSource"/> </bean> <!-- 依赖的Bean --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="url" value="jdbc:mysql://localhost:3306/test"/> </bean> </beans> ``` #### 模式2:注解+XML混合配置(推荐) ```xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- 启用注解扫描(base-package指定扫描路径) --> <context:component-scan base-package="com.example"/> <!-- 显式定义需要特殊配置的Bean --> <bean id="legacyService" class="com.example.old.LegacyServiceImpl"/> </beans> ``` ### 三、配置验证步骤 1. **文件位置验证** - XML文件必须位于`src/main/resources`目录下 - 支持自定义文件名(如`spring-config.xml`),但需与加载代码一致 2. **基础功能测试类** ```java public class SpringTest { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService service = ctx.getBean("userService", UserService.class); System.out.println(service.getUsername()); // 应输出"张三" } } ``` ### 四、配置进阶技巧 1. **多配置文件管理** ```xml <!-- 主配置文件引入子配置 --> <import resource="classpath:spring-datasource.xml"/> <import resource="file:/config/spring-security.xml"/> ``` 2. **P命名空间简化配置** ```xml <!-- 添加命名空间声明 --> xmlns:p="http://www.springframework.org/schema/p" <!-- 简化属性注入 --> <bean id="user" class="com.example.User" p:name="李四" p:age="25"/> ``` 3. **自动装配配置** ```xml <bean id="orderService" class="com.example.OrderService" autowire="byType"/> <!-- 根据类型自动注入 --> ``` ### 五、常见问题排查 1. **Bean创建失败** 检查:类路径是否正确、是否有默认构造方法、依赖项是否已定义 2. **属性注入失败** 验证:setter方法命名规范(set+属性名首字母大写)、类型是否兼容 3. **配置文件未加载** 确认:文件路径是否正确、是否在resources根目录 ### 六、运行结果验证 ```text // 成功加载时控制台应显示: INFO: Loading XML bean definitions from class path resource [applicationContext.xml] 张三 ``` ### 七、最佳实践建议 1. 生产环境推荐使用**JavaConfig注解配置**(@Configuration) 2. 对第三方库的集成优先使用XML配置 3. 保持XML配置的简洁性,业务逻辑尽量使用注解 4. 使用Spring Boot时可简化配置,但需保留对传统XML配置的支持能力[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值