1. 程式人生 > 程式設計 >JAVA解決在@autowired,@Resource注入為null的情況

JAVA解決在@autowired,@Resource注入為null的情況

使用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 [email protected]
 * @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的情況就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。