今天博主在写数据库的时候遇到一个问题:
@ChannelHandler.Sharable
public class TcpHandler extends ChannelInboundHandlerAdapter {
@Autowired
private FormRepository formRepository; //这个借口注入不来啊!气
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception{
//本渣意图是在客户端来一组数据的时候,存入数据库
//此处插入数据
}
}
解决方式:手动注入,本工程使用Netty-4,灵感来源于这位博主Netty-3的演示
https://blog.csdn.net/oJueQiang123456/article/details/92972799
下面书写Netty-4的方法:
-
新建一个SpringUtil类:
@Component public class SpringUtil implements ApplicationContextAware { private static ApplicationContext ac; @Override public void setApplicationContext(ApplicationContext arg0) throws BeansException { ac = arg0; } public static ApplicationContext getApplicationContext() { return ac; } /** * 通过class获取Bean */ public static <T> T getBean(Class<T> clazz){ return getApplicationContext().getBean(clazz); } /** * 如果BeanFactory包含所给名称匹配的bean返回true * @param name * @return boolean */ public static boolean containsBean(String name) { return ac.containsBean(name); } /** * 判断注册的bean是singleton还是prototype。 * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) * @param name * @return boolean */ public static boolean isSingleton(String name) { return ac.isSingleton(name); } /** * @param name * @return Class 注册对象的类型 */ public static Class<?> getType(String name) { return ac.getType(name); } }
-
使用:
@ChannelHandler.Sharable public class TcpHandler extends ChannelInboundHandlerAdapter { private static FormRepository formRepository; static { formRepository = SpringUtil.getBean(FormRepository.class); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception{ //此处插入数据 FormData formData=new FormData(); formData.setEquipno("1201113"); formData.setContent("333"); formRepository.save( formData); } }