静的変数の問題を解決するために春が(ターン)に注入することができません

問題の
今日の書き込みJDBCUtilsツールにしたいと学習プロセスにバインドするために接続するスレッドが、報告されたヌルポインタ例外は、インターネットの後の春には、静的メンバ変数をサポートしていない検索することが判明しているが、テストに注入され、裁判ではそうしてくださいライト@Autowiredそれは許容されません。ツールを書くことが、我々は確かに、静的変数やメソッドを使用したい場合は、私は、注射を達成することができ、静的メンバ変数のメソッドを使用することを要約します。

@Component
 パブリック クラスJDBCUtils {
    @Autowired
    プライベート 静的ComboPooledDataSourceのdataSource。

    プライベート 静的な ThreadLocalの<接続> TL = 新しいのThreadLocal <接続> ();
    パブリック 静的接続getThreadConnection(){
        接続CONN = tl.get()。
        もし(CONN == NULL ){
            CONN = のgetConnection();
            tl.set(CONN)。
        }
        返すCONN;

    }
    公共の 静的データソースをgetDataSource(){
         リターンデータソース。
    }
    パブリック 静的接続のgetConnection(){
        接続の接続 = nullをしてみてください{
            接続 = dataSource.getConnection()。
        } キャッチ(のSQLException e)の{
            e.printStackTrace();
        }
        リターン接続。

    }
    パブリック 静的 ボイドremoveThreadConnection(){
        tl.remove();
    }
}

セットインジェクション法

注釈方法

また、クラスの前に@Componentノート、プラス二つのセット方法、上@Autowiredコメント
1.設定ファイルは、変数のパラメータを設定されているが
を取り除くために、静的修正2.静的変数自動的に生成されたsetメソッドを持っています、またはそうでなければできないの注射

@Component
 パブリック クラスJDBCUtils {

    プライベート 静的ComboPooledDataSourceのdataSource。
    @Autowired
    公共 のボイドsetDataSource(ComboPooledDataSourceのdataSource){
        JDBCUtils.dataSource = のdataSource;
    }

XMLの道

また、上の静的なセットを除去する方法ことに注意してください

パブリック クラスJDBCUtils {
     プライベート 静的   ComboPooledDataSourceのdataSource。

    公共 ボイドsetDataSource(ComboPooledDataSourceデータソース){
         この .dataSource = データソース。
    }


    プライベート 静的な ThreadLocalの<接続> TL = 新しいのThreadLocal <接続> ();
    パブリック 静的接続getThreadConnection(){
        接続CONN = tl.get()。
        もし(CONN == NULL ){
            CONN = のgetConnection();
            tl.set(CONN)。
        }
        返すCONN;

    }
    公共の 静的データソースをgetDataSource(){
         リターンデータソース。
    }
    パブリック 静的接続のgetConnection(){
        接続の接続 = nullをしてみてください{
            接続 = dataSource.getConnection()。
        } キャッチ(のSQLException e)の{
            e.printStackTrace();
        }
        リターン接続。

    }
    パブリック 静的 ボイドremoveThreadConnection(){
        tl.remove();
    }
}
   <ビーンID = "JDBCUtils" クラス = "com.cc.utils.JDBCUtils">
        <プロパティ名= "データソース" REF = "データソース"> </ property>の
    </豆>

@PostConstruct噴射モード注釈
使用@PostConstructは、クラス初期化メソッド、メンバー変数を実行した後、initメソッドに加えました。これに先立ち、我々は彼らの@Autowired注入を達成するために使用することができるように、我々は変数を注入したい修飾子静的を削除し、どのようなツールを変換する必要があります。その後、我々は、この変数を介して取得するオブジェクトへの参照は、オブジェクトを参照された静的クラス自体を追加します。

@Component
 パブリック クラスJDBCUtils {
    @Autowired
    プライベート  ComboPooledDataSourceのdataSource。
    プライベート 静的のJDBCUtilsのjdbcUtils。
    @PostConstruct
    公共 のinit(){
        jdbcUtils = この;
        この .dataSource = データソース。
    }

    プライベート 静的な ThreadLocalの<接続> TL = 新しいのThreadLocal <接続> ();
    パブリック 静的接続getThreadConnection(){
        接続CONN = tl.get()。
        もし(CONN == NULL ){
            CONN = のgetConnection();
            tl.set(CONN)。
        }
        返すCONN;

    }
    公共の 静的データソースをgetDataSource(){
         戻りjdbcUtils.dataSourceと、
    }
    パブリック 静的接続のgetConnection(){
        接続の接続 = nullをしてみてください{
            接続 = jdbcUtils.dataSource.getConnection()。
        } キャッチ(のSQLException e)の{
            e.printStackTrace();
        }
        リターン接続。

    }
    パブリック 静的 ボイドremoveThreadConnection(){
        tl.remove();
    }
}

もちろん、これはまた、xml設定の初期化方法、同じ原理で使用することができます。

パブリック クラスJDBCUtils {
     プライベート  ComboPooledDataSourceのdataSource。

    公共 ボイドsetDataSource(ComboPooledDataSourceデータソース){
         この .dataSource = データソース。
    }

    プライベート 静的のJDBCUtilsのjdbcUtils。
    公共 のinit(){
        jdbcUtils = この;
        この .dataSource = データソース。
    }

    プライベート 静的な ThreadLocalの<接続> TL = 新しいのThreadLocal <接続> ();
    パブリック 静的接続getThreadConnection(){
        接続CONN = tl.get()。
        もし(CONN == NULL ){
            CONN = のgetConnection();
            tl.set(CONN)。
        }
        返すCONN;

    }
    公共の 静的データソースをgetDataSource(){
         戻りjdbcUtils.dataSourceと、
    }
    パブリック 静的接続のgetConnection(){
        接続の接続 = nullをしてみてください{
            接続 = jdbcUtils.dataSource.getConnection()。
        } キャッチ(のSQLException e)の{
            e.printStackTrace();
        }
        リターン接続。

    }
    パブリック 静的 ボイドremoveThreadConnection(){
        tl.remove();
    }
}
<ビーンID = "JDBCUtils" クラス = "com.cc.utils.JDBCUtils" INIT-方法= "INIT">
        <プロパティ名= "データソース" REF = "データソース"> </ property>の
    </豆>

参考リンクします。https://blog.csdn.net/chen1403876161/article/details/53644024

----------------
免責事項:この記事はCSDNブロガー「qq_42524262の元記事である、CC 4.0 BY-SAの著作権契約書に従ってください、複製、元のソースのリンクと、この文を添付してください。 。
オリジナルリンクします。https://blog.csdn.net/qq_42524262/article/details/97898796

おすすめ

転載: www.cnblogs.com/muxi0407/p/11897191.html