【问题标题】:Spring AOP: Disadvantages when using it - Spring Features which use Spring AOP do not have this disadvantages?Spring AOP:使用时的缺点 - 使用 Spring AOP 的 Spring Features 没有这个缺点?
【发布时间】:2011-08-23 04:52:32
【问题描述】:

我正在使用 Spring Framework 3.0.5 和 Spring Security 3.0.5,我对面向方面的编程有疑问。目前我试图找出面向方面编程的缺点和优点。当然,理论上我知道:我可以避免冗余代码,我只需要在方面进行更改,而不是在代码中的任何地方等等。但我仍然有一些问题:

我发现的缺点:

我使用 Spring AOP 编写了一个示例应用程序。我用注释(@Pointcut、@Before、@Aspect 等等)配置了一个方面。触发切面的方法(当然是切入点的一部分)当然是不同类的一部分,并且没有任何注释。

=> 我真的认为一个很大的缺点是,当观察其他类的那些方法时,并不清楚它们是否触发了一个方面。它们不需要注释或其他任何东西,它们只是在切面的切入点中被提及。 (我真的希望你明白我的意思)。所以这就是为什么我认为 AOP 使代码也更难理解!

a) 这个问题有解决办法吗? (当我将整个配置放在一个 XML 文件中时,这可能会解决吗?我不这么认为。)

b)如果我使用 AspectJ 代替 Spring AOP,这个问题还会存在吗?

使用 Spring AOP 的 Springs Features:他们没有这个缺点?

由于 Spring AOP 是许多 Spring 特性的一部分(就像声明式事务管理或(也许)Spring Security(?)),我仔细研究了这些特性。我根本找不到任何缺点。

c) 让我们以声明式事务管理为例:使用这些注解 (@transactional) 管理事务非常容易,我并没有发现我上面提到的缺点。我可以看到触发特定行为的方法。 (所有@transactional 方法都会触发事务行为)也许我误解了一些东西,这不是使用AOP 的地方吗?但是如果我没有误解这一点,为什么在这里可以看到哪些方法触发了方面,为什么在我上面的示例中看不到?我真的很想知道这个!

感谢您的回答! :-)

编辑:a) 和 b) 已回答(使用标记这些方法的 IDE),c) 仍然丢失:-)

【问题讨论】:

    标签: spring aop aspectj spring-aop


    【解决方案1】:

    对于点 b) 如果您使用带有 Spring IDE 和 AspectJ 插件或 STS 的 Eclipse,IDE 将向您显示 Aspect 的编织位置。


    对于点 b) 如果您使用 AspectJ 和支持 AspectJ(带有 AspectJ 插件的 Eclipse,或 STS)的 IDE,那么您将在织入 Aspect 的源代码中看到标记。

    编译时 AspectJ 的一个缺点是您无法在库中编织方面。 (没有先进的技术)。


    对于点 c) 像@Transactional 这样的声明性方面只有一个缺点。 -- 你可以忘记在方法上添加注解。

    但是,如果您有例如这样的规则:类中的每个公共方法都由 @Service 注释(或者如果您想构建自己的 @TransactionalService),那么您不需要指定 @Transactional 注释在每种方法上。 -- 所以总结一下:声明性方面非常适合阅读(你不会忽视它们),如果你的代码非常(可以说)“个体”(而不是术语“不一致”),它们也很好。但是,如果您在具有强架构规则的环境中工作(例如 @Service 类中的每个公共方法...),那么您可以将这些规则写在切入点定义中,而不是使用声明性方面。

    【讨论】:

    • 谢谢!很高兴知道支持 AspectJ 的 @IDE 显示标记。关于将方面绑定到库中,我必须承认,这对我来说太具体了,而且我对它的经验如此之少,以至于我什至无法想象一个例子。但感谢您分享您的知识!
    【解决方案2】:

    实际上,对于 a) 点,Ralph 给出的答案相同:将 Eclipse 与 AspectJ 插件一起使用,或者如果您仍然使用 Spring,请使用 STS。 这样,如果某个方法与编辑器左侧的切入点匹配,您将在 IDE 中看到,由红色小箭头表示:

    【讨论】:

    • 谢谢!当你点击这个红色箭头时会发生什么?然后打开 Aspect 了吗?
    • 如果我没记错的话,你不能点击它们,但你会得到一个工具提示,上面写着“由 YourAdvice 建议”。
    • @nano7:你不能点击图标,但是一个hove显示有多少方面被编织了。反正没问题,因为Eclipse(AspectJ插件)有“交叉引用”视图. - 如果将光标放在这样的行上,“交叉引用”视图会列出所有编织的方面,如果单击它们,IDE 会打开相应的方面。另一方面,如果您将光标放在某个方面,“交叉引用”会显示它的编织位置。
    • 谢谢拉尔夫。好吧,我使用 NetBeans,所以..... :-) 总的来说,我真的认为如果 PointCuts 也有一些注释会更好,只是为了使其更具可读性!
    • 抱歉,我指的是 JoinPoints,而不是 PointCuts
    【解决方案3】:

    实际上,Spring AOP 支持创建自定义注解。

    我用 Advice 定义了一个名为 Loggable binding 的注解。Loggabel 可以应用于任何你想要的方法。

    public @interface Loggable {
    
    }
    
    @Aspect
    public class EmployeeAnnotationAspect {
    
        @Before("@annotation(com.ben.seal.spring.aspect.Loggable)")
        public void myAdvice(){
            System.out.println("Executing myAdvice!!");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      相关资源
      最近更新 更多