1.問題原因
被static修飾變量,是不屬於任何實例化的對象擁有,spring的依賴注入只能在對象層級上進行依賴注入,所以不能直接使用@autowired標簽進行注入。
2.解決方案
2.1 在靜態方法中使自定義的工具類,該工具類實現ApplicationContextAware ,在該工具類中通過applicationContext.getBean 來湖區想要的bean類。
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static Object getBean(String beanName) {
return applicationContext.getBean(beanName);
}
public static Object getBeanByNull(String beanName) {
try {
return applicationContext.getBean(beanName);
}
catch (NullPointerException e)
{
return null;
}
}
public static boolean containsBean(String beanName) {
return applicationContext.containsBean(beanName);
}
}
2.2 使用@autowired 標簽進行set方法注入。
具體為,將需要視同bean申明為靜態的全局變量, 在通過set方法注入,在靜態方法中就能直接使用該變量。
@Component
public class TestClass{
private static FirstClass firstClass;
@Autowired
public void setFirstClass(FirstClass firstClass){
TestClass.firstClass = firstClass;
}
public static void print(){
firstClass.print();
}
}
2.3 使用@PostConstruct注解
@Component
public class TestClass{
@Autowired
private FirstClass firstClass;;
private static FirstClass firstClass2;
@PostConstruct
public void init(){
firstClass2=firstClass;
}
public static void print(){
firstClass2.print();
}
}
被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,並且只會被服務器調用一次,類似於Servlet的init()方法。被@PostConstruct修飾的方法會在構造函數之后,init()方法之前運行。