数据源 代码位置:http://knight-black-bob.iteye.com/blog/2256698
netty 代码位置:http://knight-black-bob.iteye.com/blog/2256690
package com.netty.dto; import com.google.gson.Gson; import com.google.gson.GsonBuilder; public class ResponceInfo { private Integer code; private String message; private Object data; public ResponceInfo() { } public ResponceInfo(Integer code, String message, Object data) { this.code = code; this.message = message; this.data = data; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } @Override public String toString() { Gson gson=new GsonBuilder() .disableHtmlEscaping() .serializeNulls() .create();; return gson.toJson(this); } }
package com.netty.business; import org.springframework.cglib.reflect.FastClass; import org.springframework.cglib.reflect.FastMethod; import com.netty.dto.ResponceInfo; public class CGLibCode { public static ResponceInfo execute(Object targetObject,String methodName,Class<?>[] parameterTypes, Object[] parameters){ try { FastClass serviceFastClass = FastClass.create(targetObject.getClass()); FastMethod serviceFastMethod = serviceFastClass.getMethod(methodName, parameterTypes); return (ResponceInfo)serviceFastMethod.invoke(targetObject, parameters); } catch (Exception e) { return null ; } } }
package com.netty.business; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.log4j.Logger; import org.springframework.util.StringUtils; import com.common.util.ParamsUtils; import com.google.common.base.Strings; import com.netty.service.NettyServicePool; import io.netty.handler.codec.http.HttpMethod; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.QueryStringDecoder; import io.netty.handler.codec.http.multipart.Attribute; import io.netty.handler.codec.http.multipart.DefaultHttpDataFactory; import io.netty.handler.codec.http.multipart.HttpPostRequestDecoder; import io.netty.handler.codec.http.multipart.InterfaceHttpData; import io.netty.handler.codec.http.multipart.InterfaceHttpData.HttpDataType; public class BusinessHandler { private static Logger logger = Logger.getLogger(BusinessHandler.class); private static HttpRequest req; public BusinessHandler(){ req = null; } public static HttpRequest getReq() { return req; } public static void setReq(HttpRequest req) { BusinessHandler.req = req; } public BusinessHandler(HttpRequest req) { BusinessHandler.req = req; } public String handler(){ Map<String, List<String>> _params=null; String srcUrl = req.getUri(); try { if(req.getMethod()==HttpMethod.GET) _params=_getParams(srcUrl); else _params=_postParams(srcUrl); } catch (Exception e) {} return _execute(_params); } private static String _execute(Map<String, List<String>> params) { String cln=ParamsUtils.getStringFromMap(params, "cln");//接口名 String mod=ParamsUtils.getStringFromMap(params, "mod");//方法名 if(StringUtils.hasText(cln) && StringUtils.hasText(mod)){ Object autoService= NettyServicePool.NETTYSERVICES.get(cln); if(null!=autoService){ params.remove("cln"); params.remove("mod"); String[] ps=new String[params.size()]; Class<?>[] cs=new Class<?>[params.size()]; int i=0; for (Entry<String, List<String>> e : params.entrySet()) { cs[i]=String.class; String _value=null ; if(null!=e.getValue() && e.getValue().size()>0) _value=e.getValue().get(0); ps[i]=_value; i++; } return CGLibCode.execute(autoService, mod, cs, ps).toString(); } } return null; } private static Map<String, List<String>> _postParams(String srcUrl) throws IOException { HttpPostRequestDecoder decoder = new HttpPostRequestDecoder(new DefaultHttpDataFactory(false), req); Map<String, List<String>> params=new HashMap<String, List<String>>(); if (decoder != null) { List<InterfaceHttpData> postDatas = decoder.getBodyHttpDatas(); for (InterfaceHttpData postData:postDatas) { if (postData.getHttpDataType() == HttpDataType.Attribute){ Attribute attribute = (Attribute) postData; String v=attribute.getValue(); List<String> list=new ArrayList<String>(); list.add(Strings.nullToEmpty(v)); params.put(attribute.getName(), list); } } } return params; } //未加密 private static Map<String, List<String>> _getParams(String srcUrl) { QueryStringDecoder decoder = new QueryStringDecoder(srcUrl); Map<String, List<String>> params=new HashMap<String, List<String>>(); params = decoder.parameters(); return params; } }
package com.netty.core; import org.apache.log4j.Logger; import com.netty.business.BusinessHandler; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.codec.http.DefaultFullHttpResponse; import io.netty.handler.codec.http.FullHttpResponse; import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.handler.codec.http.HttpVersion; import io.netty.handler.codec.http.HttpHeaders.Names; public class NettyServerHandler extends ChannelInboundHandlerAdapter { Logger logger = Logger.getLogger(NettyServerHandler.class); @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { logger.info("channelRead " + msg); if (msg instanceof HttpRequest){ HttpRequest req = (HttpRequest) msg; logger.info(req.getUri()); if(HttpHeaders.is100ContinueExpected(req)){ ctx.write(new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.CONTINUE)); } String _result=new BusinessHandler(req).handler(); logger.info("_result : " + _result); FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, Unpooled.wrappedBuffer(_result.getBytes())); response.headers().set(Names.CONTENT_TYPE, "text/html; charset=utf-8"); response.headers().set(Names.CONTENT_LENGTH, response.content().readableBytes()); ctx.write(response).addListener(ChannelFutureListener.CLOSE); } } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { logger.info("exceptionCaught "); ctx.close(); } @Override public void channelReadComplete(ChannelHandlerContext ctx) { logger.info("channelReadComplete "); ctx.flush(); } }
package test.netty; import java.net.URI; import org.junit.Test; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.codec.http.DefaultFullHttpRequest; import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.codec.http.HttpMethod; import io.netty.handler.codec.http.HttpRequestEncoder; import io.netty.handler.codec.http.HttpResponseDecoder; import io.netty.handler.codec.http.HttpVersion; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.codec.http.HttpContent; import io.netty.handler.codec.http.HttpResponse; public class NettyClient2Test { public void connect(String host, int port) throws Exception { EventLoopGroup workerGroup = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(workerGroup); b.channel(NioSocketChannel.class); b.option(ChannelOption.SO_KEEPALIVE, true); b.handler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { // 客户端接收到的是httpResponse响应,所以要使用HttpResponseDecoder进行解码 ch.pipeline().addLast(new HttpResponseDecoder()); // 客户端发送的是httprequest,所以要使用HttpRequestEncoder进行编码 ch.pipeline().addLast(new HttpRequestEncoder()); ch.pipeline().addLast(new HttpClientInboundHandler2()); } }); // Start the client. ChannelFuture f = b.connect(host, port).sync(); URI uri = new URI("http://127.0.0.1:8443?cln=mifiDeviceService&mod=getMifiDeviceById&id="+6); String msg = "cln=mifiDeviceService&mod=getMifiDeviceById&id=6"; DefaultFullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri.toASCIIString(), Unpooled.wrappedBuffer(msg.getBytes("UTF-8"))); // 构建http请求 request.headers().set(HttpHeaders.Names.HOST, host); request.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE); request.headers().set(HttpHeaders.Names.CONTENT_LENGTH, request.content().readableBytes()); // 发送http请求 f.channel().write(request); f.channel().flush(); // f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); } } @Test public void Test(){ try{ NettyClient2Test client = new NettyClient2Test(); client.connect("127.0.0.1", 8443); }catch(Exception e){ e.printStackTrace(); } } } class HttpClientInboundHandler2 extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { if (msg instanceof HttpResponse) { HttpResponse response = (HttpResponse) msg; System.out.println("CONTENT_TYPE:" + response.headers().get(HttpHeaders.Names.CONTENT_TYPE)); } if(msg instanceof HttpContent) { HttpContent content = (HttpContent)msg; ByteBuf buf = content.content(); System.out.println(buf.toString(io.netty.util.CharsetUtil.UTF_8)); buf.release(); } } }
package com.mifi.serviceimpl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.common.util.netty.StatusCode; import com.mifi.bean.MifiDevice; import com.mifi.dao.MifiDeviceDao; import com.mifi.service.MifiDeviceService; import com.netty.dto.ResponceInfo; import com.netty.service.NettyServerService; @NettyServerService(name="mifiDeviceService") @Service public class MifiDeviceServiceImpl implements MifiDeviceService { @Autowired MifiDeviceDao dao; // 1 true 0, false public ResponceInfo hasMifiDeviceById(String id){ //return dao.getMifiDeviceById(id) == null ? false : true ; int result=0; if(dao.getMifiDeviceById(Long.parseLong(id)) != null) result=1; return new ResponceInfo(StatusCode.STATUS_SUCCCESS,StatusCode.MSG_SUCCESS,result); } public ResponceInfo getMifiDeviceById(String id){ MifiDevice mifiDevice = null; try{ mifiDevice = dao.getMifiDeviceById(Long.parseLong(id)); }catch(Exception e){ } return new ResponceInfo(StatusCode.STATUS_SUCCCESS,StatusCode.MSG_SUCCESS,mifiDevice); } public ResponceInfo findAllMifiDevices(){ List<MifiDevice> mlist = null ; try{ mlist= dao.findAllMifiDevices(); }catch(Exception e){ } return new ResponceInfo(StatusCode.STATUS_SUCCCESS,StatusCode.MSG_SUCCESS,mlist); } public ResponceInfo addMifiDevice(MifiDevice mifiDevice){ int result=0; try{ result=1; dao.addMifiDevice(mifiDevice); }catch(Exception e){ } return new ResponceInfo(StatusCode.STATUS_SUCCCESS,StatusCode.MSG_SUCCESS,result); } public ResponceInfo delMifiDeviceById(String id){ int result=0; try{ result=1; dao.delMifiDeviceById(Long.parseLong(id)); }catch(Exception e){ } return new ResponceInfo(StatusCode.STATUS_SUCCCESS,StatusCode.MSG_SUCCESS,result); } public ResponceInfo updateMifiDevice(MifiDevice mifiDevice){ int result=0; try{ result=1; dao.updateMifiDevice(mifiDevice); }catch(Exception e){ } return new ResponceInfo(StatusCode.STATUS_SUCCCESS,StatusCode.MSG_SUCCESS,result); } }
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。
谢谢您的赞助,我会做的更好!
相关推荐
基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)...
Java中的CGLib与反射是两种常用的动态代理技术,它们在实现面向切面编程(AOP)时发挥着重要作用。本文将深入探讨这两种技术,并通过一个简单的AOP demo来阐述它们的使用方法。 首先,让我们了解什么是CGLib。CGLib...
它比使用java反射的JDK动态代理要快。 CGLIB底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。 CGLIB缺点:对于...
3. **性能优化**:由于CGLIB是基于字节码操作,所以它的运行效率通常比使用反射更高。特别是在大规模对象创建或者频繁方法调用的场景下,使用CGLIB能显著提高性能。 4. **类的扩展**:CGLIB允许在运行时动态地生成...
相比Java自带的InvocationHandler接口,CGLib的性能更优,因为它避免了反射的开销,而是直接通过字节码技术来生成和执行代理对象。 【版本选择】 描述中提到“版本太高不知道会不会有影响”,这确实是一个需要考虑...
CGLIB是基于ASM(一个底层的Java字节码操作和分析框架)来实现的,它允许开发者在运行时为Java类创建子类,而无需访问其源代码或重新编译。这种技术在许多场景下都非常有用,比如实现AOP(面向切面编程)中的动态...
本文将深入探讨如何在基于Maven的项目中利用CGLib库实现动态代理。CGLib(Code Generation Library)是Java中一个高性能的代码生成库,它在运行期通过字节码技术为类创建子类,以此实现动态代理。 1. Maven项目配置...
由于CGLib是基于字节码操作的,因此对于Java虚拟机(JVM)的运行机制有一定的要求。在某些场景下,如处理final方法或静态方法时,CGLib可能无法实现预期的效果。此外,使用CGLib可能会带来一定的性能开销,因为每次...
CGLib的工作原理是基于ASM库,ASM是一个字节码操作和分析框架,它可以用来动态生成类或增强已存在的Java类的功能。ASM提供了一种直接操作字节码的方法,这使得CGLib能够创建目标类的子类,并在子类中拦截并扩展父类...
- JDK Proxy基于接口实现,而CGLIB基于继承,因此CGLIB可以代理没有接口的类。 - JDK Proxy性能相对较慢,因为涉及到反射,而CGLIB通过字节码生成,性能更好。 - JDK Proxy易于理解和使用,CGLIB则需要更深入的...
CGlib,全称为Code Generation Library,是一个强大的Java代码生成库,广泛用于动态代理、AOP(面向切面编程)框架以及性能优化等场景。它通过字节码技术为类创建子类,从而实现对目标类的功能增强。在Java中,由于...
Cglib基于ASM库,能够在字节码层面操作Java类,通过生成子类来实现对目标类的扩展,而无需修改源代码。这种方法尤其适用于那些不支持接口或无法修改源代码的类。 2. **动态代理**:动态代理是Java中一个重要的概念...
3. **字节码生成**:CGLIB通过ASM库生成新的字节码,然后使用Java的反射API来加载这个新生成的类到JVM中。 在实际开发中,选择使用`cglib2.2.jar`还是`cglib-nodep-2.2.jar`取决于项目的具体情况。如果项目已经包含...
测试基于cglib动态代理测试使用的jar包. asm-7.0-beta.jar asm-commons-7.0-beta.jar asm-util-7.0-beta.jar cglib-3.1.jar
Java中的动态代理、反射和...总之,理解和掌握JDK动态代理、CGLIB动态代理、反射和拦截器是提升Java开发技能的关键步骤。通过实际操作这些示例,你将能够更好地应用这些技术到实际项目中,提高代码的灵活性和可维护性。
这种方式比基于Java反射API的动态代理更高效,因为反射需要在运行时查找方法,而Cglib直接通过字节码操作实现。 在实际开发中,Cglib常用于AOP(面向切面编程)框架,例如Spring AOP。通过Cglib,Spring可以在不...
2. **性能优化**:在某些情况下,CGLIB生成的代理类比使用Java反射机制性能更好,因为它是在运行时通过字节码技术生成的子类,避免了反射带来的性能损耗。 3. **代码生成**:CGLIB也可以用于自动生成类和方法,简化...
这种方法比使用Java反射性能更高,因为反射在运行时解析类和方法会带来一定的开销。 在"cglib-src-2.2.jar"中,包含了CGLIB的源代码,开发者可以深入研究其内部实现,这对于理解其工作原理和进行定制化开发非常有...
赠送jar包:cglib-3.1.jar; 赠送原API文档:cglib-3.1-javadoc.jar; 赠送源代码:cglib-3.1-sources.jar; 赠送Maven依赖信息文件:cglib-3.1.pom; 包含翻译后的API文档:cglib-3.1-javadoc-API文档-中文(简体)版...