- 浏览: 224547 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (163)
- c++ (30)
- JavaScript (30)
- java (61)
- jQuery (3)
- ACE (2)
- oracle (9)
- jni (0)
- android (2)
- shell (1)
- myeclipse (1)
- Hibernate (1)
- linux (2)
- sqlserver (2)
- windows (2)
- sql (2)
- php (2)
- css (1)
- 学习 (1)
- ExtJs (1)
- RSS (1)
- 报文 (1)
- 跟我学Spring3 (6)
- dos (1)
- server (1)
- nosql (4)
- mongodb (6)
- photoshop (1)
- WebService (2)
- 股票 (1)
- OpenGL (3)
- Spring3MVC (6)
- 生活 (1)
- struts2 (1)
- 云盘 (1)
- blog (1)
- nosql nodejs mongoose (1)
最新评论
-
sblig:
配置分片: mongo -port 27017config ...
搭建Mongodb集群:分片Sharding+副本集Replica Set -
sblig:
配置路由:mongs: 40000 40100 40200sc ...
搭建Mongodb集群:分片Sharding+副本集Replica Set -
fuanyu:
哥们,干得漂亮。。
struts2 高危漏洞修复 -
sblig:
配置列子如下
<?xml version="1 ...
跟我学Spring3 学习笔记一 -
sblig:
307622798 写道博主你好,最近在看你的js系列文章,发 ...
JavaScript 学习笔记 二 对象的访问
/** * JDK 实现的动态代理 打印日志切面类 */ public class LogInvocationHandler implements InvocationHandler { public static void main(String[] args) { // 需要代理的接口,被代理类实现的多个接口都必须在这里定义 Class[] proxyInterface = new Class[] { IBusiness.class, IBusiness2.class }; // 构建AOP的Advice,这里需要歘如业务的实例 LogInvocationHandler handler = new LogInvocationHandler(new Business()); // 生成代理类的字节码加载器 ClassLoader classLoader = LogInvocationHandler.class.getClassLoader(); // 织入器,织入代码并生成代理类 IBusiness2 proxyBusiness = (IBusiness2) Proxy.newProxyInstance( classLoader, proxyInterface, handler); //使用代理类的实例调用方法 proxyBusiness.doSomeThing2(); ((IBusiness)proxyBusiness).doSomeThing(); } private Object target;// 目标对象 LogInvocationHandler(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 执行原有的逻辑 Object rev = method.invoke(target, args); // 执行织入的日志,你可以控制那些方法执行切入逻辑 if (method.getName().equals("doSomeThing2")) { System.out.println("记录日志"); } return rev; } } interface IBusiness { public boolean doSomeThing(); } interface IBusiness2 { public boolean doSomeThing2(); } class Business implements IBusiness, IBusiness2 { public boolean doSomeThing() { System.out.println("执行业务逻辑"); return false; } public boolean doSomeThing2() { System.out.println("执行业务逻辑2"); return false; } }
动态代理的核心其实就是代理对象的生成,即Proxy.newProxyInstance(classLoader, proxyInterface, handler)
动态代理在运行期通过接口动态生成代理类,这为其带来了一定的灵活性,
但这个灵活性却带来了两个问题,第一代理类必须实现一个接口,
如果没实现接口会抛出一个异常。第二性能影响,因为动态代理使用反射的机制实现的,
首先反射肯定比直接调用要慢,经过测试大概每个代理类比静态代理多出10几毫秒的消耗。
其次使用反射大量生成类文件可能引起Full GC造成性能影响,
因为字节码文件加载后会存放在JVM运行时区的方法区(或者叫持久代)中,
当方法区满的时候,会引起Full GC,所以当你大量使用动态代理时,
可以将持久代设置大一些,减少Full GC次数。
CgLib 实现动态代理
/** * Cglib是一个强大的,高性能的Code生成类库, * 它可以在运行期间扩展Java类和实现Java接口, * 它封装了Asm,所以使用Cglib前需要引入Asm的jar */ public class LogIntercept implements MethodInterceptor{ public static void main(String[] args) { //创建一个织入器 Enhancer enhancer = new Enhancer(); //设置父类 enhancer.setSuperclass(Business.class); //设置需要织入的逻辑 enhancer.setCallback(new LogIntercept()); //使用织入器创建子类 IBusiness2 newBusiness = (IBusiness2)enhancer.create(); newBusiness.doSomeThing2(); ((IBusiness)newBusiness).doSomeThing(); } public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable { //执行原有逻辑,注意这里是invokeSuper Object rev = proxy.invokeSuper(target, args); //执行织入的日志 if (method.getName().equals("doSomeThing2")) { System.out.println("记录日志"); } return rev; } }
发表评论
-
[Java性能剖析]远程调试配置
2014-07-10 10:48 808一、服务器操作如下: 找到文件:apache-tomcat-5 ... -
[jdk工具命令]Java SE 文档
2014-07-10 10:43 778oracle java se documentation j ... -
[jdk命令工具]jconsole远程项目监控
2014-07-10 10:37 789入口:catalina.sh JAVA_OPTS=&quo ... -
[jvm参数]JVM简单配置
2014-07-10 10:35 1224-Xms256m -Xmx512M -XX:MaxPermSi ... -
struts2 高危漏洞修复
2013-07-23 10:30 11881. /** * 过滤器 */ ... -
转:调查服务器响应时间的利器 tcprstat
2012-11-16 13:50 1485http://rdc.taobao.com/blog/cs/? ... -
跟我学Spring3 学习笔记七 初始化与销毁
2012-10-18 16:45 2094最后 遗留一个问题, ... -
跟我学Spring3 学习笔记六 注入
2012-10-18 14:31 2232跟我学Spring3 学习笔 ... -
动态生成class
2012-10-16 11:17 1368ASM 进行动态生成class import org.obj ... -
FtpUtil ftp工具类 过滤文件名
2012-10-10 16:25 6946工具类: import java.io.Buff ... -
java 高性能网络编程 NIO
2012-09-28 16:31 1518服务器端: // 1. 分配一个 Serve ... -
java 高性能网络编程 mina
2012-09-28 10:52 1691服务器端: // 创建一个非阻塞的server端so ... -
代理 下载网页,挖掘数据
2012-09-25 13:51 899URL url = new URL("http:// ... -
java nio 编程学习 一
2012-09-21 16:08 1178Java.nio中的主要类ServerSocketChanne ... -
MongoDB 实战笔记 四
2012-09-20 14:12 1145import java.net.UnknownHostExce ... -
Json 添加元素拼接JSON字符串(转)
2012-09-20 13:55 7055package com.util; import jav ... -
MongoDB 实战笔记 三
2012-09-20 13:37 2479导出mongoexport -d m ... -
MongoDB 实战笔记 二
2012-09-20 11:45 938MongoDB 实战笔记 count 查询记录 ... -
MongoDB 实战笔记 一
2012-09-20 11:30 1181MongoDB 实战笔记 来建立一个 test 的集 ... -
Struts 学习笔记 二
2012-09-17 16:56 875login.jsp 登陆页面 <html:form ac ...
相关推荐
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。AOP的核心概念是切面、通知、连接点、切入点和织入。在...
面向切面编程(AOP)是一种编程范式,旨在将横切关注点(如日志、安全等)与业务逻辑分离,从而提高模块化。AOP通过预定义的“切面”对横切关注点进行模块化,从而可以在不修改业务逻辑代码的情况下增加新功能。动态...
在Java世界中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种设计模式,它允许程序员在不修改源代码的情况下,插入新的行为或增强已有功能。Spring框架是AOP实现的一个典范,它提供了两种主要的动态...
学习AOP动态代理有助于我们理解面向切面编程的核心思想,提高代码的组织效率,使我们能够更好地构建松耦合、高内聚的系统。通过阅读《AOP动态代理(反射机制)》这本书,你可以深入理解这些概念,并通过丰富的示例掌握...
在Java开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种重要的编程范式,它允许程序员将关注点分离,使代码更模块化,更易于维护。AOP通常用于实现横切关注点,如日志记录、事务管理、权限检查...
在Spring框架中,面向切面编程(AOP)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。本篇文章将深入探讨如何使用Spring的动态代理机制实现AOP...
在Java编程领域,Spring框架是应用最广泛的轻量级开源框架之一,它提供了一系列强大的功能,包括依赖注入、面向切面编程(AOP)等。本篇将详细讲解Spring中的AOP实现,特别是JDK动态代理的应用。 首先,我们要了解...
在讨论Spring AOP(面向切面编程)时,首先需要理解几个核心概念。Spring AOP 是Spring框架提供的一个功能模块,它允许开发者将横切关注点(cross-cutting concerns)从业务逻辑中解耦出来,通过在方法调用前后进行...
为了解决这一挑战,面向方面编程(AOP)应运而生。Spring框架作为Java开发领域的领头羊之一,提供了强大的AOP支持。本文旨在深入探讨Spring AOP的核心概念及其原理。 #### 二、AOP基本概念 AOP是一种编程范式,其目的...
动态代理和Spring AOP(面向切面编程)是两个关键的设计概念,它们在实现高效、模块化的系统中起着至关重要的作用。本文将深入探讨这两个概念,并结合实际应用进行解析。 首先,让我们理解什么是动态代理。动态代理...
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程思想和技术,它作为OOP(面向对象编程)的一种补充,主要解决了OOP在处理横切关注点方面的不足。在传统的面向对象程序设计中,通常会将应用划分为不同的...
面向切面编程(AOP)是一种编程范式,主要用于处理系统中的横切关注点,比如日志、事务管理、性能监控等。动态代理是实现AOP的一种常见技术,它允许我们在运行时创建对象的代理,从而在不修改原有代码的情况下添加...
Spring AOP(面向切面编程)则是一种流行的应用框架,它利用动态代理来实现对业务代码的切面增强,如日志、事务管理等。现在让我们深入探讨JDK动态代理和Spring AOP的原理。 首先,JDK动态代理基于Java的反射机制,...
Spring AOP(Aspect Oriented Programming)是Spring框架中的一个核心组件,用于实现面向切面编程。AOP是一种编程范式,旨在将横切关注点(Cross-cutting concerns)从业务逻辑中分离出来。传统的面向对象编程(OOP...
面向切面编程(AOP)是一种编程范式,它允许程序员定义“横切关注点”,这些关注点可以插入到应用程序的多个点上,而无需在每个插入点重复代码。Java中的动态代理是实现AOP的一种方式,特别是对于接口的代理。下面...
面向切面编程(AOP,Aspect Oriented Programming)是一种编程范式,旨在将关注点分离,使得业务逻辑和系统服务(如日志、事务管理、权限控制等)能够解耦。这种编程方式允许程序员定义“切面”,这些切面封装了特定...
【AOP编程入门详解】 面向切面编程(Aspect Oriented Programming,简称AOP)是一种编程范式,旨在解决传统面向对象编程(OOP)中的一些问题,如代码重复、高耦合度等。AOP的核心思想是将关注点分离,即把系统中...
### AOP编程入门知识点详解 #### 一、AOP概念介绍 面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,它旨在通过将横切关注点(cross-cutting concerns)从业务逻辑中解耦,提高系统的模块化...
面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,它旨在提高软件的模块化程度,通过将关注点分离到不同的“切面”中来实现。在.NET环境中,AOP通常通过拦截器(Interceptor)或动态代理...