本文小编为大家详细介绍“netty中spring对象注入失败怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“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; @Componentpublic class ToolNettySpirngAutowired implements ApplicationContextAware { private static ApplicationContext applicationContext; @Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {if (ToolNettySpirngAutowired.applicationContext == null) {ToolNettySpirngAutowired.applicationContext = applicationContext;}} // 获取applicationContextpublic 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返回指定的Beanpublic 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);}
读到这里,这篇“netty中spring对象注入失败怎么解决”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。