1. 程式人生 > 實用技巧 >【問題集】Static 靜態變數 不能直接使用 @autowired標籤的問題

【問題集】Static 靜態變數 不能直接使用 @autowired標籤的問題

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()方法之前執行。