读取的Spring配置文件出错

1年前 (2017-08-14) wang JAVA, 技术杂谈 0评论 已收录 203℃ 浏览数:72

这几天在写项目中的支付问题。首先写的是支付宝。官方的文档和demo给的很详细,写起来也得心应手。但是这两天遇到这么一个问题。

就是支付宝支付的一些网关和密钥,全部写在了配置文件里。然后通过spring-mybatis直接注入到JavaBean中。但是调用的时候,发现几个参数为null。部分代码如下


spring-mybatis.xml

	<!-- 引入配置文件 -->
	<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">  
           <list>  
              <!-- 这里支持多种寻址方式:classpath和file -->  
              <value>classpath:jdbc.properties</value>  
              <value>classpath:redis.properties</value>  
              <value>classpath:application.properties</value>  
              <value>classpath:ftp.properties</value>  
              <value>classpath:rtiRedis.properties</value>  
              <value>classpath:remoteService.properties</value>
              <value>classpath:aliPayConfig.properties</value>
            </list>  
        </property>  
	</bean>
     <!-- 支付宝参数 开始-->
    <bean id="payService" class="com.cqut.service.pay.impl.PayService">
    	<property name="appId"  value="${alipay.appid}"></property>
    	<property name="rsa2Private" value="${alipay.privateRsa2}"></property>
    	<property name="aliPayPublic" value="${alipay.alipayPublicRsa2}"></property>
    	<property name="gateway" value="${alipay.gateway}"></property>
    </bean>
     <!-- 支付宝参数 结束 -->

然后这是Service的部分代码

	private String appId;
	private String gateway;
	private String rsa2Private;
	private String aliPayPublic;
	
	public void setGateway(String gateway){
		this.gateway = gateway;
	}
	
	public void setAppId(String appId) {
		this.appId = appId;
	}

	public void setRsa2Private(String rsa2Private) {
		this.rsa2Private = rsa2Private;
	}

	public void setAliPayPublic(String aliPayPublic) {
		this.aliPayPublic = aliPayPublic;
	}

然后调试的时候,在项目启动的时候,上述set方法都执行了,PayService类中参数也有对应的值。但是在调用方法的时候,却发现参数全部为null。然后我就有所不解,没有想明白为什么会这样。

因为Spring初始化的时候,值已经写入了。但是为什么调用的时候为null呢?又查看了代码,没有重新赋值为null的方法。那么说明一定有一个地方将PayService参数初始化了。那么就很有意思了。

那应该就是Spring又初始化了一次这个类?

有了基本的思路,然后就可以找问题了。

我将@Service注解去掉。再次尝试,发现可以了

//@Service
public class PayService implements IPayService{

然后再想了一下。大概明白了为什么会发生这种问题了。
我在spring-mybatis.xml中给该类配置的JavaBean,Spring在初始化的时候,加载了一次,将值传了进去。然后类上有@Service注解,我们在spring-mybatis.xml配置了自动扫描。

<!-- 自动扫描 -->
	<context:component-scan base-package="com.cqut" />

然后我们在通过PayController调用PayService方法的时候,Spring又加载了一次该类,这次将Spring初始化加载时的JavaBean覆盖掉了。而这次没有将配置文件中的值写入到类的参数中。

去掉@Service注解后。Spring只在初始化的时候加载了一次,下次直接调用,没有覆盖,自然不为null啦~

博主

Just do it. Now or never.

相关推荐

嗨、骚年、快来消灭0回复。