私はこの奇妙な状況をSpringのAutowiringで得ました。まず、このBeanを宣言します。@AutowiredセッションスコープBeanが同じインスタンスを指していません
<beans:bean id="customerInfo" class="my.web.app.com.CustomerInfoSession" scope="session" >
<aop:scoped-proxy />
</beans:bean>
そして、私ははcustomerinfoに値を設定した2つのケースがあります。
まず私はこのように設定します。
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を別のクラスではオートワイヤリングポインタをチェックしてください。 Testクラスで
:
@Controller
public class Test {
@Autowired
private CustomerInfoSession customerInfo;
public void checkObject(){
System.out.println("Call back : "+customerInfo);//for second pointing check
}
}
結果:
インスタンス:[email protected]
バックコール: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
を結果は次のとおりです。
インスタンス:[email protected]
バック
私が見る通り、@Autowiredは同じインスタンスを指していません...
なぜ、別のjdbcテンプレートを使用するのが@AutowiredセッションスコープBeanに影響しますか?
なぜbeanは同じインスタンスを指していないのですか?
私は分かりません。最初のケースでは、Springコンテキストはオブジェクトを提供します。後者の場合、 'JdbcTemplate'はおそらくデータベースからデータを取り出し、別のオブジェクトを作成して返します。あなたの混乱はどこですか? – Savior
@Pillar、最初のケースでは、データベースからフェッチすることによって得られたSqlRowSet結果からセッターを使用して1つずつ 'customerInfo'プロパティを設定しました.2番目のケースでは、' customerInfo'を返すBeanPropertyRowMapperを使用して 'customerInfo'を直接設定しました。 'インスタンスがBeanPropertyRowMapperを使って既に設定されている場合、私はオブジェクトを直接設定するときにBeanが同じインスタンスを使用しないことになりますが、プロパティを手動で設定すると完全に機能します。申し訳ありませんが長いコメント... – FreezY
2つ目はセッションスコープのプロキシをオーバーライドし、基本的にセッションスコープのオブジェクトを破棄しています。これは今や突然シングルトンオブジェクトです。だから基本的には、第二の部分でやっていることは間違って危険であり、避けなければなりません。 –