JAVA解决在@autowired,@Resource注入为null的情况

 更新时间:2020-10-10 04:02:18   作者:佚名   我要评论(0)

使用SpringMVC或者SSH过程中,有时可能会遇到这么一个问题。就是在一个普通的JAVA类(不是controller也不是action类)中无法注入在spring配置文件中配置的bean。

使用SpringMVC或者SSH过程中,有时可能会遇到这么一个问题。就是在一个普通的JAVA类(不是controller也不是action类)中无法注入在spring配置文件中配置的bean。

比如你在一个普通java类想调用某个在spring中配置的service,你会发现不管你用@Resource还是@Autowired注解都无法注入,对象始终是null。

那是因为一般普通的Java类没有被spring代理,自然无法通过spring注入相关的对象。难道这样就不能调用了吗?这里提供下面一个类来解决这个问题:

SpringContextUtil

package com.im.utils;
 
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
 
/**
 * 这个类是为了解决在普通类调用service的问题
 * 
 * @ClassName SpringContextUtil
 * @Description
 * @author kokjuis 189155278@qq.com
 * @date 2016-6-12
 * @content
 *  
 */
public class SpringContextUtil implements ApplicationContextAware {
	private static ApplicationContext applicationContext; // Spring应用上下文
 
	// 下面的这个方法上加了@Override注解,原因是继承ApplicationContextAware接口是必须实现的方法
	@Override
	public void setApplicationContext(ApplicationContext applicationContext)
			throws BeansException {
		SpringContextUtil.applicationContext = applicationContext;
	}
 
	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}
 
	public static Object getBean(String name) throws BeansException {
		return applicationContext.getBean(name);
	}
 
	public static Object getBean(String name, Class requiredType)
			throws BeansException {
 
		return applicationContext.getBean(name, requiredType);
	}
 
	public static boolean containsBean(String name) {
		return applicationContext.containsBean(name);
	}
 
	public static boolean isSingleton(String name)
			throws NoSuchBeanDefinitionException {
		return applicationContext.isSingleton(name);
	}
 
	public static Class getType(String name)
			throws NoSuchBeanDefinitionException {
		return applicationContext.getType(name);
	}
 
	public static String[] getAliases(String name)
			throws NoSuchBeanDefinitionException {
		return applicationContext.getAliases(name);
	}
}

然后在spring配置文件中配置一下这个类:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task"
 xmlns:cache="http://www.springframework.org/schema/cache"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd 
  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd 
  http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd 
  http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
 
 <!--配置spring工具类 -->
 <bean id="SpringContextUtil" class="com.im.utils.SpringContextUtil"
 scope="singleton"></bean>
 
</beans>

然后通过这个类提供的方法就能正常的获取在spring中托管的bean了,使用很简单:

/**
  * 获取spring托管的redis连接池
  */
private JedisPool jedisPool = (JedisPool) SpringContextUtil.getBean("jedisPool");

补充知识:解决Spring中为静态static的@Resource自动注入失败的问题

在写一个单例模块时,在初始化对象时需要注入静态的参数,导致spring 暴出

@Resource annotation is not supported on static fields

可以通过将@Resource写在set方法上,并去除static

以上这篇JAVA解决在@autowired,@Resource注入为null的情况就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
  • Spring注解@Resource和@Autowired区别对比详解
  • 彻底搞明白Spring中的自动装配和Autowired注解的使用
  • java(包括springboot)读取resources下文件方式实现

相关文章

  • JAVA解决在@autowired,@Resource注入为null的情况

    JAVA解决在@autowired,@Resource注入为null的情况

    使用SpringMVC或者SSH过程中,有时可能会遇到这么一个问题。就是在一个普通的JAVA类(不是controller也不是action类)中无法注入在spring配置文件中配置的bean。 比
    2020-10-10
  • 简单了解Python hashlib模块

    简单了解Python hashlib模块

    一.hashlib模块 用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 :SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法。 1.使用hashlib模块进行MD5加密。
    2020-10-10
  • Python尾递归优化实现代码及原理详解

    Python尾递归优化实现代码及原理详解

    在传统的递归中,典型的模式是,你执行第一个递归调用,然后接着调用下一个递归来计算结果。这种方式中途你是得不到计算结果,知道所有的递归调用都返回。 这样虽然
    2020-10-10
  • Java两种方式实现动态代理

    Java两种方式实现动态代理

    一、JDK动态代理 Java 在 java.lang.reflect 包中有自己的代理支持,该类(Proxy.java)用于动态生成代理类,只需传入目标接口、目标接口的类加载器以及 Invocation
    2020-10-10
  • Python判断变量是否是None写法代码实例

    Python判断变量是否是None写法代码实例

    代码中经常会有变量是否为None的判断,有三种主要的写法: 第一种是`if x is None`; 第二种是 `if not x:`; 第三种是`if not x is None`(这句这样理解更
    2020-10-10
  • java 枚举enum的用法(与在switch中的用法)

    java 枚举enum的用法(与在switch中的用法)

    实际开发中,很多人可能很少用枚举类型。更多的可能使用常量的方式代替。但枚举比起常量来说,含义更清晰,更容易理解,结构上也更加紧密。看其他人的博文都很详细,
    2020-10-10
  • Python批量获取并保存手机号归属地和运营商的示例

    Python批量获取并保存手机号归属地和运营商的示例

    从Excel读取一组手机号码,批量查询该手机号码的运营商和归属地,并将其追加到该记录的末尾。 import requests import json import xlrd from xlutils.copy impor
    2020-10-10
  • Python特殊属性property原理及使用方法解析

    Python特殊属性property原理及使用方法解析

    1 什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 import math class Circle: def __init__(self,radius): #圆的半径
    2020-10-10
  • Python类绑定方法及非绑定方法实例解析

    Python类绑定方法及非绑定方法实例解析

    一、绑定方法   1.对象的绑定方法   首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的。下面,我们通过实例,来慢慢解析绑
    2020-10-10
  • 在.NET中使用DiagnosticSource的方法

    在.NET中使用DiagnosticSource的方法

    前言 DiagnosticSource是一个非常有意思的且非常有用的API,对于这些API它们允许不同的库发送命名事件,并且它们也允许应用程序订阅这些事件并处理它们,它使我们
    2020-10-07

最新评论