问题
今天在学习的过程中想写一个连接和线程绑定的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. [转帖]phoronix-test-suite测试云服务器

    phoronix-test-suite测试云服务器 https://www.cnblogs.com/tanyongli/p/7767804.html centos系统 phoronix-test-su ...

  2. sysbench的简单安装

    1. 下载 可以到网站上面找 我用到的这个是201908最新的 wget https://src.fedoraproject.org/repo/pkgs/sysbench/sysbench-1.0.1 ...

  3. [转帖]centos7上设置中文字符集

    centos7上设置中文字符集 https://www.cnblogs.com/kaishirenshi/p/10528034.html author: headsen  chen date: 201 ...

  4. HDU 4578 线段树玄学算法?

    Transformation 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4578 Problem Description Yuanfang is p ...

  5. Python【条件判断】

    单向判断ifif xxx: #冒号 #条件 print(xxx) #缩进是四个空格或一个Tab键#被缩进的内容(print()函数)和if条件语句组成了一个代码块(一个整体)————————————— ...

  6. 进程程序替换(自主实现shell)

    进程替换 替换进程所运行的程序 流程:将另一段代码加载到内存中,通过页表将原来进程的映射关系重新建立到新的程序在内存中的地址,相当于替换了进程所运行程序以及所要处理的数据 (替换了代码段,重新初始化数 ...

  7. hdu 5446 lucas+crt+按位乘

    http://acm.hdu.edu.cn/showproblem.php?pid=5446 题意:题目意思很简单,要你求C(n,m)mod p的值 p=p1*p2*...pn; 题解:对于C(n,m ...

  8. pat L2_004

    一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结点的键值: 其左右子树都是二叉搜索树. 所谓二叉搜索 ...

  9. STM32 USB Virtual COM

    STM32 USB Virtual COM USB转串口的功能实现   这次讲的是如何实现USB转串口功能的实现.首先看看工程的布局吧: 我们主要要介绍的文件的在USB_User这个组文件.从上面的截 ...

  10. Python 数字(函数)

    Python支持4种不同数值类型: 整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点. 长整型(long integers) - 无限大小的整数,整数最后是一个大写或小写的L. 浮 ...