我在春天自动装配豆子时遇到了这种奇怪的情况。首先我声明这个bean;
<beans:bean id="customerInfo" class="my.web.app.com.CustomerInfoSession" scope="session" >
<aop:scoped-proxy />
</beans:bean>
我在 customerInfo ;
中设置值时有两种情况首先我这样设置:
SqlRowSet srs =jdbcTemplate.queryForRowSet(query, qparams);
if (srs.isBeforeFirst()==true) {
while (srs.next()) {
customerInfo.setLoginId(srs.getString("LOGINID"));
customerInfo.setCompanyId(srs.getString("COMPANYID"));
}
}
System.out.println("Instance : "+customerInfo);//for first pointing check
然后我通过@Autowired bean检查另一个类中的自动装配指针;
在测试类中:
@Controller
public class Test {
@Autowired
private CustomerInfoSession customerInfo;
public void checkObject(){
System.out.println("Call back : "+customerInfo);//for second pointing check
}
}
结果:
实例:my.web.app.com.CustomerInfoSession@1e7c92cc
回电:my.web.app.com.CustomerInfoSession@1e7c92cc
正如我们所看到的,@ Autowiring正在调用与它应该相同的bean实例,但是当我更改为这样设置值时出现了问题:
customerInfo = (CustomerInfoSession) jdbcTemplate.queryForObject(query,qparam,new BeanPropertyRowMapper<>(CustomerInfoSession.class));
System.out.println("Instance : "+customerInfo);//for first pointing check
通过使用相同的Test类,结果为:
实例:my.web.app.com.CustomerInfoSession@2d700bd6
回电:my.web.app.com.CustomerInfoSession@5e33e39c
正如我们所看到的,@ Autowired并未指向同一个实例......
为什么使用不同的jdbc模板会影响@Autowired会话范围bean?
为什么bean没有指向同一个实例,应该是什么?
答案 0 :(得分:1)
在第一个场景中,您将在Spring注入的对象上设置属性。
但在下一种情况下,jdbcTemplate
正在创建CustomerInfoSession
对象的新实例,您已将customerInfo
对象引用指向此新创建的对象。
以下声明
customerInfo =(CustomerInfoSession)jdbcTemplate.queryForObject(query,qparam,new BeanPropertyRowMapper&lt;&gt;(CustomerInfoSession.class));
实际上等同于
CustomerInfoSession temp =(CustomerInfoSession) jdbcTemplate.queryForObject(query,qparam, new BeanPropertyRowMapper&lt;&gt;(CustomerInfoSession.class));
customerInfo = temp;
要想象(点击下面的图片以便更好地查看),
案例1:
案例2: