欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-09-25 14:58:46
使用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的情况就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。