解決Spring對靜態變量無法注入問題(轉)


問題
今天在學習的過程中想寫一個連接和線程綁定的JDBCUtils工具類,但測試時發現一直報空指針異常,上網查了之后Spring並不支持對靜態成員變量注入,所以光試用@Autowired肯定是不行的。可是我們編寫工具類時肯定是要使用靜態變量和方法的,我總結一下我用過可以實現對靜態成員變量注入的方法。

@Component
public class JDBCUtils {
    @Autowired
    private static ComboPooledDataSource dataSource;

    private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
    public static Connection getThreadConnection(){
        Connection conn = tl.get();
        if (conn == null){
            conn = getConnection();
            tl.set(conn);
        }
        return conn;

    }
    public static DataSource getDataSource(){
        return dataSource;
    }
    public static Connection getConnection(){
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;

    }
    public static void removeThreadConnection(){
        tl.remove();
    }
}

set方法注入

注解方式

在類前加@Component注解,在set方法上加 @Autowired注解,這里注意兩點
1.配置文件里已經配置了變量的相關參數
2.靜態變量自動生成set方法時會有static修飾,要去掉,否則還是無法注入

@Component
public class JDBCUtils {

    private static ComboPooledDataSource dataSource;
    @Autowired
    public void setDataSource(ComboPooledDataSource dataSource) {
        JDBCUtils.dataSource = dataSource;
    }

xml方式

同樣注意將set方法上的static去掉

public class JDBCUtils {
    private static   ComboPooledDataSource dataSource;

    public void setDataSource(ComboPooledDataSource dataSource) {
        this.dataSource = dataSource;
    }


    private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
    public static Connection getThreadConnection(){
        Connection conn = tl.get();
        if (conn == null){
            conn = getConnection();
            tl.set(conn);
        }
        return conn;

    }
    public static DataSource getDataSource(){
        return dataSource;
    }
    public static Connection getConnection(){
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;

    }
    public static void removeThreadConnection(){
        tl.remove();
    }
}
   <bean id="JDBCUtils" class="com.cc.utils.JDBCUtils">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

@PostConstruct注解方式注入
用@PostConstruct加在init方法上,在類初始化后執行該方法,對成員變量賦值。在這之前,我們要改造一下工具類,去掉我們想注入變量的static的修飾符,這樣我們就可以用@Autowired實現對其注入。然后加一個靜態的類自身的引用對象,當我們想要變量時通過這個引用對象來獲取。

@Component
public class JDBCUtils {
    @Autowired
    private  ComboPooledDataSource dataSource;
    private static JDBCUtils jdbcUtils;
    @PostConstruct
    public void init(){
        jdbcUtils = this;
        this.dataSource = dataSource;
    }

    private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
    public static Connection getThreadConnection(){
        Connection conn = tl.get();
        if (conn == null){
            conn = getConnection();
            tl.set(conn);
        }
        return conn;

    }
    public static DataSource getDataSource(){
        return jdbcUtils.dataSource;
    }
    public static Connection getConnection(){
        Connection connection = null;
        try {
            connection = jdbcUtils.dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;

    }
    public static void removeThreadConnection(){
        tl.remove();
    }
}

當然這種用初始化方法也可以用xml配置,原理一樣。

public class JDBCUtils {
    private  ComboPooledDataSource dataSource;

    public void setDataSource(ComboPooledDataSource dataSource) {
        this.dataSource = dataSource;
    }

    private static JDBCUtils jdbcUtils;
    public void init(){
        jdbcUtils = this;
        this.dataSource = dataSource;
    }

    private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
    public static Connection getThreadConnection(){
        Connection conn = tl.get();
        if (conn == null){
            conn = getConnection();
            tl.set(conn);
        }
        return conn;

    }
    public static DataSource getDataSource(){
        return jdbcUtils.dataSource;
    }
    public static Connection getConnection(){
        Connection connection = null;
        try {
            connection = jdbcUtils.dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;

    }
    public static void removeThreadConnection(){
        tl.remove();
    }
}
<bean id="JDBCUtils" class="com.cc.utils.JDBCUtils" init-method="init">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

參考鏈接: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM