读取的Spring配置文件出错

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

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

spring-mybatis.xml 配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- 引入配置文件 --> 
<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的部分代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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注解去掉。再次尝试,发现可以了

1
2
//@Service 
public class PayService implements IPayService{

然后再想了一下。大概明白了为什么会发生这种问题了。

我在spring-mybatis.xml中给该类配置的JavaBean,Spring在初始化的时候,加载了一次,将值传了进去。然后类上有@Service注解,我们在spring-mybatis.xml配置了自动扫描。

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

然后我们在通过PayController调用PayService方法的时候,Spring又加载了一次该类,这次将Spring初始化加载时的JavaBean覆盖掉了。

而这次没有将配置文件中的值写入到类的参数中。

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


评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×