解決netty中spring對象註入失敗的問題
netty中spring對象註入失敗
今天在做項目的時候發現在netty中註入service失敗,百度許久後也找不到答案(@Component,@PostConstruct)未起作用,後靈光一現
發現瞭問題所在
如圖:
這些地方都必須通過spring註入才能實現其他依賴註入,之前這裡都是采用new的,所以導致spring註入失敗
在netty中註入spring成份
前不久,在Netty中使用到數據庫數據,由於Netty服務啟動後的上下文與 Spring的上下文不同,所以在Netty中獲取DAO數據很頭痛,無法使用@Autowired註入。
Aware本義就是"自動的",顧名思義Spring自動做瞭些事情。在此某些特殊的情況下,Bean需要實現某個功能,但該功能必須借助於Spring容器,此時就必須先獲取Spring容器,然後借助於Spring容器實現該功能。
為瞭讓Bean獲取它所在的Spring容器,可以讓該Bean實現ApplicationContextAware接口。
可以通過以下方式
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * * @author shilei * * @time 2019年6月19日 下午5:17:50 * * @desc Netty中註入 Spring Autowired */ @Component public class ToolNettySpirngAutowired implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if (ToolNettySpirngAutowired.applicationContext == null) { ToolNettySpirngAutowired.applicationContext = applicationContext; } } // 獲取applicationContext public static ApplicationContext getApplicationContext() { return applicationContext; } // 通過name獲取 Bean. public static Object getBean(String name) { return getApplicationContext().getBean(name); } // 通過class獲取Bean. public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz); } // 通過name,以及Clazz返回指定的Bean public static <T> T getBean(String name, Class<T> clazz) { return getApplicationContext().getBean(name, clazz); } }
在使用時 可在某業務Handler中添加以下代碼:
private static NodeServService nodeServService; static { nodeServService = ToolNettySpirngAutowired.getBean(NodeServService.class); } private static NodeJpaRepository nodeDao; static { nodeDao = ToolNettySpirngAutowired.getBean(NodeJpaRepository.class); }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- SpringBoot項目如何將Bean註入到普通類中
- 基於Spring上下文工具類 ApplicationContextUtil
- Springboot如何獲取上下文ApplicationContext
- SpringBoot中的main方法註入service
- 獲取Spring的上下文環境ApplicationContext的最簡單方式