【問題集】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()方法之前運行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM