@Autowired会话范围bean未指向同一实例

时间:2016-04-08 02:22:41

标签: java spring autowired spring-jdbc jdbctemplate

我在春天自动装配豆子时遇到了这种奇怪的情况。首先我声明这个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没有指向同一个实例,应该是什么?

1 个答案:

答案 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:

enter image description here

案例2:

enter image description here