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

解决Spring对静态变量无法注入问题(转)的更多相关文章

  1. spring boot 静态变量注入配置文件

    spring 静态变量注入 spring 中不支持直接进行静态变量值的注入,我们看一下代码: @Component(value = "KafkaConfig") @Configur ...

  2. spring 给静态变量注入值

    一般在spring中,给static变量加上@Autowired注解的时候会报空指针异常错误. 解决: 1.通过xml配置文件配置 这个就不多说了. 2.通过注解 @Component public ...

  3. 静态变量setter注入

    1.java中静态方法调用非静态成员变量.非静态方法 public class Circle { private double radius = 1.0; double getAre() { retu ...

  4. SpringBoot项目给静态变量static注入@Value

    @value不能直接注入值给静态属性,spring 不允许/不支持把值注入到静态变量中:spring支持set方法注入,我们可以利用非静态setter 方法注入静态变量 @Component publ ...

  5. 参考 - spring boot 静态变量注入值

    参考http://blog.csdn.net/zhayuyao/article/details/78553417 @Component public class A { private static ...

  6. Spring如何给静态变量注入值

    Common.java是一个工具类. Spring无法直接给静态变量注入值,因为静态变量不属于对象,只属于类,也就是说在类被加载字节码的时候变量已经初始化了,也就是给该变量分配内存了,导致spring ...

  7. 配置springmvc在其他类中(spring容器外)获取注入bean

    学习https://github.com/thinkgem/jeesite 今天在写JedisUtils的时候要注入JedisPool,而这个属性被设置为static,@Resource和@Autow ...

  8. Spring不支持依赖注入static静态变量

    在springframework里,我们不能@Autowired一个静态变量,使之成为一个spring bean,例如下面这样: 可以试一下,yourClass在这种状态下不能够被依赖注入,会抛出运行 ...

  9. Spring它不支持依赖注入static静态变量

    在springframework在,我们不能@Autowired静态变量,制作spring bean,例如,没有那么: @Autowired private static YourClass your ...

随机推荐

  1. H3C路由器登录策略专题讲解

    password-control login-attempt login-times [ exceed { lock | lock-time time | unlock } ] undo passwo ...

  2. Oracle对象-视图和索引

    Oracle 对象-视图 视图概念 ​ 视图就是提供一个查询的窗口,所有的数据来自于原表 创建视图[必须有dba权限] --查询语句创建表 create table emp as select * f ...

  3. (十)springMvc 校验

    目录 文章目录 目录 @[toc] springMvc 校验 准备 踩坑 配置校验器 将校验器注入到适配器中 在 pojo 中配置校验规则 在 controller 层进行检验 获取错误信息 将错误信 ...

  4. 二维状压DP经典题

    炮兵阵地 题目链接 题目大意:在n*m的地图上放置炮兵,每个炮兵的攻击范围是上下左右两格内,有两种不同的地形,山地(用"H" 表示),平原(用"P"表示),只有 ...

  5. ubuntu 拨号上网

    如果没有安装的用户,可以使用 sudo apt-get install pppoe pppoeconf 然后配置上网 sudo pppoeconf 最后,使用 sudo pon dsl-provide ...

  6. Codeforces 718A Efim and Strange Grade 程序分析

    Codeforces 718A Efim and Strange Grade 程序分析 jerry的程序 using namespace std; typedef long long ll; stri ...

  7. Python3 + selenium + Chrome浏览器(webdriver.Chrome()报错)

    Python3 + selenium + Chrome浏览器 Error: selenium.common.exceptions.WebDriverException: Message: 'chrom ...

  8. linux下shell 脚本 中windows换行符换成linux换行符

    sed -i 's/\r//' filename window下默认是 \r\n linux下是\n unix下是\r

  9. 学习扩展kmp

    参考博客:https://blog.csdn.net/s_999999/article/details/89104957

  10. intellij IDE 破解 简单 License server 法

    http://idea.iteblog.com/key.php