面向方面编程(AOP)有哪些缺点?

2024-04-09

面向方面编程有哪些可能的和关键的缺点?

例如:新手的神秘调试(可读性影响)


我认为最大的问题是没人知道如何定义切面的语义, or 如何非程序地声明连接点.

如果您无法独立于要嵌入的上下文来定义某个方面的功能,或者无法以不损害其嵌入的上下文的方式定义它所具有的效果,那么您(和工具) )无法可靠地推断出它的作用。 (您会注意到方面最常见的示例是“日志记录”,它被定义为“将一些内容写入应用程序不知道的日志流”,因为这是非常安全的)。这违反了大卫帕纳斯的关键概念信息隐藏 http://en.wikipedia.org/wiki/Information_hiding。我看到的最糟糕的方面示例之一是将同步原语插入到代码中;这会影响代码可能具有的交互顺序。您怎么可能知道这是安全的(不会死锁?不会活锁?不会无法保护?在同步伙伴中抛出异常时可以恢复?)除非应用程序已经只做了一些琐碎的事情。

连接点现在通常通过提供某种标识符通配符来定义(例如,“将此方面放入任何名为“DataBaseAccess*”的方法中)。为了实现这一点,编写受影响方法的人员必须表明其代码的意图通过以有趣的方式命名代码来进行方面化;这几乎不是模块化的。更糟糕的是,为什么方面的受害者甚至必须知道它的存在?并考虑如果您简单地重命名某些方法会发生什么;方面不再注入它所在的位置是需要的,并且你的应用程序会中断。需要的是连接点规范,它是故意的;无论如何,方面必须知道哪里需要它,而不需要程序员在每个使用点放置霓虹灯标志。 (AspectJ 有一些与控制流相关的连接点,在这方面似乎更好一些)。

因此,方面是一种有趣的想法,但我认为它们在技术上还不成熟。这种不成熟使得它们的使用变得脆弱。这就是问题所在。 (我是自动化软件工程工具的忠实粉丝[参见我的简历],但不是这样的)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面向方面编程(AOP)有哪些缺点? 的相关文章

  • 实体方面(春季)

    我在定义我的方面时遇到了一些问题 我有一堆实体 我想在其中分析 get methods 所以我编写了以下切入点和方法 Pointcut execution tld myproject data entities get public voi
  • 为反应式管道编写方面

    我正在为返回承诺的方法编写方面 考虑以下方法 public Mono
  • 运行时 AOP 与编译时 AOP

    这两种AOP框架的优缺点是什么 我使用Unity作为我的aop框架 但我猜像postsharp这样的编译时aop框架可能比运行时aop框架有更好的性能 看起来运行时aop框架使用反射来实现注入 我不是 NET 人员 但我了解 Java 生态
  • 使用大量 AOP 请求作用域 bean 时出现性能问题

    我正在使用 Spring 3 开发一个半大型应用程序 并且在同时处理数百个用户时遇到性能问题 我正在使用 Spring 的 AOP 代理来使用多个请求范围的 bean 并且我可以看到 每次我对其中一个 bean 调用任何方法时 都会调用 C
  • 如何在 Spring 中注入具有受保护方法的 JDK 代理类?

    我的情况相当奇怪 我使用 Spring 3 0 6 和一个实现和接口的 bean 到目前为止 都是很正常的事情 我的 bean 也有一些受保护的方法 我正在使用一些 AOP JDK 代理 一切正常 当我想将此 bean 注入另一个包类时 我
  • 使用 Guice AOP 在 Jersey 中进行方法拦截

    是否可以使用 Guice AOP 拦截 Jersey 资源上的带注释的方法 我已经成功配置了 Guice 与 Jersey 的依赖注入集成 没有任何问题 但是我配置的拦截器根本没有拦截我带注释的方法 web xml
  • 如何将AOP引入到生产性软件开发中?

    我知道这个问题以前曾被问过 但这是一年半前的事了 尽管我认为现在可能是重新提问的时候了 我也认识到它可能被视为主观的 但我认为支持 反对 AOP 是有客观原因的 我有兴趣谁在使用AOP在软件开发中也why or why not使用它 我认为
  • Spring AOP 通用类型

    我是 Spring 的新手 我遇到了一个方面的问题 切入点是一个使用通用类型的接口 public interface DaoJdbc
  • 通过spring AOP + Aspectj进行异常处理

    在我的项目中 我有一个域层 它基本上是 POJO 和一个位于域层之上的 Spring 控制器 服务层 我还有一个位于服务和域之间的 AOP 层 我的域层正在抛出业务异常 这些异常现在正在服务层中处理 但是我想更改它 以便从领域层抛出的异常将
  • 如何让 Spring @ControllerAdvice 与其他自定义 Spring @Aspect 一起工作?

    我有一个自定义记录器使用 Aspect我希望它总是最后运行 这样无论控制器返回什么响应 它都会被记录到数据库中 所以我放了一个 Order 1 在这方面 我还使用编写了一个错误处理程序 ControllerAdvice处理所有意外异常并返回
  • Spring AOP:将目标传递给 Aspect

    我想捕获实现类抛出的异常处理器界面 在方面 我需要访问处理器 这会引发异常 我定义了以下切入点 Pointcut target some package Processor args message public void processo
  • Spring 的 LoadTimeWeaver 代理未启动

    我正在尝试使用 Spring 和 AspectJ 实现加载时编织 据我所知 我已正确配置所有内容 但当我尝试运行集成测试时 我不断收到错误 org springframework beans factory BeanCreationExce
  • Spring AOP:- 在 joinPoint 中获取参数名称为 null

    LoggingAspect java Around allGenericAppServiceImplMethods public Object LoggingAdvice ProceedingJoinPoint joinPoint thro
  • Ninject 通过城堡动态代理拦截具有非空构造函数的代理类

    我当前的大部分实现都基于此处提供的信息 Ninject 拦截任何具有特定属性的方法吗 https stackoverflow com questions 6386461 ninject intercept any method with c
  • AspectJ 是如何工作的?

    我正在尝试了解 Aspect 的工作原理 我有 C C 背景 但魔法永远不会发生 我知道你可以用注释一些函数 Aspect然后写下Aspect的实现等等 但是 新代码是如何 以及在 什么时间 生成的 假设我没有编辑器 我使用编译java类j
  • @Transactional 和 AOP 之间的混淆

    Transactional 是否在 Spring 3 中替代了 AOP 它们相同吗 我可以说 Transactional在内部实现了AOP吗 The Transactionnal注释只是声明方法 或类的所有方法 是事务性的简单方法 Spri
  • 如何在 Guice 中定义方法拦截器的顺序?

    有时需要知道 Guice 中拦截方法调用的方法拦截器的顺序 一个简单的示例场景是使用 guice persist 提供的 Transactional 方法拦截器和自定义 Retry 方法拦截器 重试拦截器必须在事务拦截器外部运行 以确保重试
  • AspectJ 加载时间编织不适用于 Spring beans

    我正在开发一个项目 该项目使用 Spring 配置的 Java 而不是 xml 风格来连接依赖项 它还具有分析逻辑 应通过 AspectJ 将其编织到所需的方法上 通过注释 设置正在运行 我可以看到我想要的包中的类正在编织 并且分析信息已从
  • AspectJ - 匹配具有通用参数的方法的切入点

    我有一个接受任何类型作为其参数的通用方法 例如 我想要一个切入点 它与仅以 String 类型作为参数的方法的调用相匹配 最终的要求是将建议执行的范围限制为 字符串 参数 这是我的通用类和方法 public class Param
  • 具有多个注释的方法上的 AspectJ 切入点

    使用加载时编织 纯 AspectJ 我们有2个注释 Time and Count 以及一些带注释的方法 Time name myMethod1Time Count name myMethod1Count public void myMeth

随机推荐