【問題集】Static 靜態變數 不能直接使用 @autowired標籤的問題
阿新 • • 發佈:2020-07-16
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()方法之前執行。