问题
今天在学习的过程中想写一个连接和线程绑定的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