不被spring容器管理的對象的處理

前兩天突然接到一個緊急需求,要求寫一個tcp接口,定時的獲取客戶端推送過來的數據,並批量入庫。

由於一開始我用postconstruct註解開啓socket服務端,導致本來的tomcat端口未能正常啓動,只開啓了socket端口,從而也使由schedule標註的註解未能生效,(當時還沒意識到是tomcat端口未能正常啓動引起的)於是就改用spring-quartz生成的定時任務。

在寫具體業務功能的時候發現,spring-quartz是不受spring 容器管理的,所以在,quartz的定時任務裏注入由spring容器管理的對象時,該對象始終爲null,於是通過百度發現了common包下的ApplicationContextHelper類,這個類實現了ApplicationContextAware接口,即可以通過應用上下文獲取該對象,參考鏈接爲:https://www.jianshu.com/p/1d82ed2a2d20

代碼如下:
 

package com.bocom.config;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
* User: panchao
* Date: 2019/12/25
* 解決quartz注入bean爲null的問題
*/
@Component("springApplicationContext")
public class ApplicationContextHelper implements ApplicationContextAware {

    @Autowired
    private static ApplicationContext appCtx;

    @Override
    public void setApplicationContext( ApplicationContext applicationContext ) throws BeansException {
        appCtx = applicationContext;
    }

    public static ApplicationContext getApplicationContext(){
        return appCtx;
    }

    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    public static Object getBean( String beanName ) {
        return appCtx.getBean( beanName );
    }
}

至此,就可以完成不被spring容器管理的對象的調用了。

以上有提到@Postconstruct註解導致Application主類未被啓動,從而導致tomcat端口不存在,原以爲是這個註解導致的,但是這個註解下放其他的業務方法並不會出現這個問題,由此猜測可能是socket的影響,於是把socket的啓動放到主類一起,然後socket端口和tomcat端口就都正常了。

發佈了19 篇原創文章 · 獲贊 0 · 訪問量 2628
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章