2016-04-08 20 views
1

私はこの奇妙な状況を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]

バック

コール:[email protected]

私が見る通り、@Autowiredは同じインスタンスを指していません...

なぜ、別のjdbcテンプレートを使用するのが@AutowiredセッションスコープBeanに影響しますか?

なぜbeanは同じインスタンスを指していないのですか?

+0

私は分かりません。最初のケースでは、Springコンテキストはオブジェクトを提供します。後者の場合、 'JdbcTemplate'はおそらくデータベースからデータを取り出し、別のオブジェクトを作成して返します。あなたの混乱はどこですか? – Savior

+0

@Pillar、最初のケースでは、データベースからフェッチすることによって得られたSqlRowSet結果からセッターを使用して1つずつ 'customerInfo'プロパティを設定しました.2番目のケースでは、' customerInfo'を返すBeanPropertyRowMapperを使用して 'customerInfo'を直接設定しました。 'インスタンスがBeanPropertyRowMapperを使って既に設定されている場合、私はオブジェクトを直接設定するときにBeanが同じインスタンスを使用しないことになりますが、プロパティを手動で設定すると完全に機能します。申し訳ありませんが長いコメント... – FreezY

+1

2つ目はセッションスコープのプロキシをオーバーライドし、基本的にセッションスコープのオブジェクトを破棄しています。これは今や突然シングルトンオブジェクトです。だから基本的には、第二の部分でやっていることは間違って危険であり、避けなければなりません。 –

答えて

1

最初のシナリオでは、Springによって注入されたオブジェクトのプロパティを設定しています。

しかし、次の場合には、jdbcTemplateは、あなたがこの新しく作成されたオブジェクトを指すようにcustomerInfoオブジェクトREFを指摘しているCustomerInfoSessionオブジェクトの新しいインスタンスを作成しています。

以下の文

はcustomerinfo =(CustomerInfoSession)jdbcTemplate.queryForObject(クエリ、qparam、新しいBeanPropertyRowMapper <>(CustomerInfoSession。クラス));

CustomerInfoSessionのTEMP =(CustomerInfoSession) jdbcTemplate.queryForObject(クエリ、qparam、 新しいBeanPropertyRowMapper <>(CustomerInfoSession.class))に効果的に等価です。

customerInfo = temp;

は、ケース1では、

を視覚化(より良い、それを表示するために、次の画像にクリックします):ケース2では

enter image description here

enter image description here

+0

ありがとう!そのため、新しいインスタンスを作成しています。私はBeanPropertyRowMapperが私のコードを単純化できると思った。私の最初のメソッド以外のjdbctemplateデータベースのフェッチを簡略化するために共有できる方法はありますか? – FreezY

関連する問題