`
clarkhill
  • 浏览: 2911 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用java动态代理机制实现AOP是丑陋的

阅读更多
    我们知道,AOP实现,一般要尽可能的透明化。业务类是不管这些切面的。实现的方法,一般都是拦截器,或者类似AspectJ那样的代码生成工具。如果使用动态代理,直接写的话,会使代码很丑陋。我宁可采用别的方法实现。除非实现某个规则约束。但是这样的话就不透明了。所以,生成代码的模式更好一些。
    但是我们在程序里面生成代码,似乎是一件比较奇怪的事情。就好像我们在干jvm干的活。感觉有些怯怯的。想和大家讨论一下。听听大家的意见。另外AOP还有什么实现原理呢?

    另外,使用动态代理似乎效率不是很高。
分享到:
评论
20 楼 senbao18 2008-05-07  
spring可以封装,可以参照一下源码~~~
19 楼 aninfeel 2008-05-07  
本来就无所谓丑陋,优雅的调用总是要封装一些丑陋的代码。
18 楼 szhnet 2008-05-07  
可以用spring的封装
17 楼 flyromza 2008-05-07  
clarkhill 写道
其实我的意思是,实现aop的方式,动态代码生成,比如使用aspectj或者asm要比使用动态代理要好一些。想问问大家的想法。


bci当然比dynamic proxy要来的更加的好,运行时怎么也比不过编译时或装载时,不过么有免费的午餐,技术难度也不可同日而语。
16 楼 bulargy 2008-05-07  
movingboy 写道
单单从代码来看,似乎也就是这样做吧?似乎Guice提供了Annotation来替代手工创建proxy的代码,而Spring则是用配置来实现(不清楚Spring是否也提供了annotation)

spring2.5是可以用aonntation来做aop的~~~
15 楼 alexma 2008-05-07  
我也觉得楼主是否可以尝试用容器呢,比如 Spring ,可以让你的业务代码变得很干净。
14 楼 clarkhill 2008-05-07  
其实我的意思是,实现aop的方式,动态代码生成,比如使用aspectj或者asm要比使用动态代理要好一些。想问问大家的想法。
13 楼 zhxp791008 2008-05-07  
你可以将业务代码调用动态代理的代码进行封装。这样在业务代码中就没有你所说的那么多丑陋的代码了。。
12 楼 movingboy 2008-05-06  
我认为动态代理要与容器配合使用才能发挥威力,应用程序只关心业务逻辑,而生成代理的过程由容器来自动完成;自己手工写代理代码确实把业务逻辑和代理逻辑混在一起了,维护、扩展都比较麻烦
如果自己把代理逻辑抽象出来,与业务逻辑分离,你会发觉就象是在做一个容器。既然如此,为什么不用现成的、成熟的容器呢?
11 楼 anlibo 2008-05-06  
这个怎么感觉不像动态代理来着
10 楼 christensen 2008-05-06  
你这么实现不是aop的概念,其实就是代理模式么
9 楼 christensen 2008-05-06  
感觉如果这么实现的话,用不用aop都差不多。

aop不适合做日志

8 楼 dennis_zane 2008-05-06  
动态代理可以玩的很花巧,这可能就是楼主所说的“丑陋”,用AspectJ未尝不可,就是多了个学习成本的问题,而spring等框架已经封装的很好了
7 楼 movingboy 2008-05-06  
单单从代码来看,似乎也就是这样做吧?似乎Guice提供了Annotation来替代手工创建proxy的代码,而Spring则是用配置来实现(不清楚Spring是否也提供了annotation)
6 楼 quaff 2008-05-06  
<div class='quote_title'>clarkhill 写道</div><div class='quote_div'><p>我把代码贴下来:这段代码是实现了InvocationHandler接口的部分。将日志代码放进去了。</p>
<pre name='code' class='java'>public class LogHandler implements InvocationHandler {

 private Logger logger = Logger.getLogger(this.getClass().getName());
  private Object delegate;
  public LogHandler(Object delegate){
   this.delegate = delegate;
  }

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  Object o = null;
  try {
   logger.info("method stats..." + method);
   o = method.invoke(delegate,args);
   logger.info("method ends..." + method);
  } catch (Exception e){
   logger.info("Exception happends...");
   //excetpion handling.
  }
  return o;
 }
} </pre>
<p>下面是客户端调用代码:</p>
<pre name='code' class='java'>BusinessInterface businessImp = new BusinessObject();

InvocationHandler handler = new LogHandler(businessImp);

BusinessInterface proxy = (BusinessInterface) Proxy.newProxyInstance(
 businessImp.getClass().getClassLoader(),
 businessImp.getClass().getInterfaces(),
 handler);

proxy.processBusiness(); </pre>
<p> businessImp是我们的一个业务实现。我为什么说这种方法比较丑陋呢?就是使用了这些和业务无关的接口和Proxy代理类。虽然这些是jdk提供的,但是给我的感觉是我在写一些和我应用无关的代码。当然上面仅仅是一个简单的示例。也可以想一些办法封装这些操作。但是总给我的感觉是有些怪异,所以希望问一下还有其他的什么实现。惭愧。写这些内容的时候,深感自己水平不行,贻笑大方了。不过刚才想想我的这个帖子标题,的确不好,不应该用这种结论式的标题。给人感觉不好。其实我是想和人探讨的。</p></div><br/>直接用动态代理代码是这样写的,但是用spring或者其他什么框架,你只需要写invoke里面的代码,其他那些机械式都是封装好的
5 楼 clarkhill 2008-05-06  
<p>我把代码贴下来:这段代码是实现了InvocationHandler接口的部分。将日志代码放进去了。</p>
<pre name='code' class='java'>public class LogHandler implements InvocationHandler {

 private Logger logger = Logger.getLogger(this.getClass().getName());
  private Object delegate;
  public LogHandler(Object delegate){
   this.delegate = delegate;
  }

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  Object o = null;
  try {
   logger.info("method stats..." + method);
   o = method.invoke(delegate,args);
   logger.info("method ends..." + method);
  } catch (Exception e){
   logger.info("Exception happends...");
   //excetpion handling.
  }
  return o;
 }
} </pre>
<p>下面是客户端调用代码:</p>
<pre name='code' class='java'>BusinessInterface businessImp = new BusinessObject();

InvocationHandler handler = new LogHandler(businessImp);

BusinessInterface proxy = (BusinessInterface) Proxy.newProxyInstance(
 businessImp.getClass().getClassLoader(),
 businessImp.getClass().getInterfaces(),
 handler);

proxy.processBusiness(); </pre>
<p> businessImp是我们的一个业务实现。我为什么说这种方法比较丑陋呢?就是使用了这些和业务无关的接口和Proxy代理类。虽然这些是jdk提供的,但是给我的感觉是我在写一些和我应用无关的代码。当然上面仅仅是一个简单的示例。也可以想一些办法封装这些操作。但是总给我的感觉是有些怪异,所以希望问一下还有其他的什么实现。惭愧。写这些内容的时候,深感自己水平不行,贻笑大方了。不过刚才想想我的这个帖子标题,的确不好,不应该用这种结论式的标题。给人感觉不好。其实我是想和人探讨的。</p>
4 楼 Readonly 2008-05-06  
动态代理不丑陋,是你看到的代码写得丑陋吧,你好歹也贴些代码出来,大家才容易砸砖阿。
3 楼 clarkhill 2008-05-06  
感谢回复,希望在不吝批评的同时也给我一些提示和解释。AOP的原理基本的我还是知道的,就是以一种透明的方式来实现一个切面。这样的切面是整个系统中所关注的。比如说日志,权限,事物等。我不了解的更多的是实现的方式和方法。希望各位高手给我一些解释。不吝赐教啊。至于我说使用动态代理的方式比较丑陋,是因为我看到了这样的实现。虽然我们可以封装这部分的操作,但是这个我们透明的希望总是有所违背不是么?
2 楼 coolzyt 2008-05-05  
动态代理丑陋,你就不会封装的漂亮一点吗?自己实现一个spring方式的AOP也不难
1 楼 movingboy 2008-05-05  
你连“AOP还有什么实现原理”都没弄明白就下结论说“使用java动态代理机制实现AOP是丑陋的”?佩服你无畏啊~~~

相关推荐

    用Java动态代理实现AOP

    下面,我们将使用动态代理来实现AOP。首先,我们需要定义一个日志处理器,实现InvocationHandler接口。 ```java public class LogHandler implements InvocationHandler { private Logger logger = Logger....

    java 动态代理实现AOP

    ### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经...总之,通过本篇文章的学习,读者应该能够理解和掌握如何使用Java动态代理来实现AOP的基本原理及实践操作。

    Java动态代理(Spring Aop原理)

    Java动态代理是Java提供的一种在运行时创建代理对象的技术,它是通过实现InvocationHandler接口和使用Proxy类来实现的。在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    因此,在实际开发中,需要根据应用场景的性能要求和维护需求,权衡是否使用动态代理。 总之,AOP通过提供一种新的角度来解决OO编程中存在的问题,使得我们能够在保持业务逻辑清晰的同时,增加额外的通用功能。利用...

    java使用动态代理来实现AOP(日志记录)的实例代码共6

    // 使用动态代理创建代理对象 public static Object getProxy(Object target) { return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new ...

    java-用Java动态代理实现AOP.pdf

    从文件内容可以看出,文档主要讨论了如何使用Java动态代理来实现AOP的基本原理。文档中提供了一个简单的例子,其中定义了一个业务接口BusinessInterface和一个实现了该接口的BusinessObject类。BusinessObject类中的...

    java分页 动态代理 aop实现

    这些代码可能涉及到如何创建分页对象,如何与数据库交互获取分页数据,以及如何在AOP中使用动态代理进行拦截和处理。 总的来说,Java分页、动态代理和AOP是Java开发中的关键技术,它们能帮助我们构建出更加高效、可...

    用java自己实现的动态代理 AOP

    Java动态代理是Java编程中一个重要的特性,它允许在运行时创建代理对象,这些代理对象可以作为原有对象的代理,实现在调用原有方法前后添加额外的功能,这正是AOP(面向切面编程)的核心思想。下面我们将深入探讨...

    个人用java动态代理模拟实现spring aop

    在本主题中,我们将探讨如何使用Java动态代理来模拟实现Spring AOP的功能。 首先,我们需要了解Java中的两种动态代理机制:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于目标对象实现了接口的情况...

    动态代理实现AOP机制

    动态代理是实现AOP的一种常见手段,尤其在Java中应用广泛。 动态代理主要分为JDK动态代理和CGLIB动态代理两种方式: 1. **JDK动态代理**: JDK动态代理基于接口实现,它通过`java.lang.reflect.Proxy`类和`java....

    java反射与代理实现AOP

    Java动态代理是一种实现AOP的技术手段之一。它可以动态地生成代理类来拦截方法调用。Java动态代理的核心类主要有两个: - `java.lang.reflect.InvocationHandler`: 定义了一个接口,用于处理代理对象的方法调用。 -...

    java动态代理机制

    - **缓存机制**:在数据访问层,如果一个方法需要频繁访问数据库,可以使用动态代理在方法执行前先检查缓存,如果缓存中有结果则直接返回,避免了不必要的数据库访问。 - **事务管理**:动态代理可以用来管理事务...

    spring之AOP(动态代理)

    总结一下,Spring的AOP机制通过JDK动态代理和CGLIB动态代理提供了强大的横切关注点管理功能。开发者可以轻松地定义切面和通知,以实现如日志、事务管理等功能,同时保持核心业务代码的清晰和简洁。在Spring Boot项目...

    使用java动态代理技术实现简单的AOP切面编程实例

    Java 动态代理技术是Java平台提供的一种强大的编程机制,它允许我们在运行时创建具有特定接口的代理对象,这些代理对象可以对方法调用进行拦截和处理,这正是AOP(面向切面编程)的核心思想。在Java中,动态代理主要...

    java动态代理实例aop

    总之,Java动态代理和AOP提供了强大的工具,使我们能够优雅地实现代码解耦,提高代码的复用性和可维护性。通过代理对象,我们可以在不修改原始类代码的情况下,添加额外的功能或改变原有行为,这对于系统的服务层和...

Global site tag (gtag.js) - Google Analytics