問題
今天在學習的過程中想寫一個連接和線程綁定的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