我正在使用Spring Framework 3.0.5和Spring Security 3.0.5,我对面向方面的编程提出了疑问。目前我试图找出面向方面编程的缺点和优点。当然,我在理论上知道它们:我可以避免冗余代码,我只需要在方面进行更改,而不是在代码中的任何地方等等。但我仍然有一些问题:
我发现的缺点:
我使用Spring AOP的方面编写了一个示例应用程序。我配置了带注释的Aspect(@Pointcut,@ Before,@ Aspect等)。触发方面的方法(当然是Pointcut的一部分)当然是不同类的一部分,没有任何注释。
=>我真的认为一个很大的缺点是,当观察其他类的那些方法时,不清楚它们是否触发了一个方面。他们不需要注释或其他任何东西,只是在方面的切入点中提到它们。 (我真的希望你明白我的意思)。这就是为什么我认为AOP使代码也不易理解!
a)这个问题有解决方案吗? (当我将整个配置放在XML文件中时,这可能会解决吗?我不这么认为。)
b)当我使用AspectJ而不是Spring AOP时,这个问题是否仍然存在?
使用Spring AOP的弹簧特性:它们没有这个缺点吗?
由于Spring AOP是许多Spring功能的一部分(就像声明式事务管理或(可能)Spring Security(?)),我仔细研究了这些功能。我根本找不到任何劣势。
c)让我们以声明式事务管理为例:使用这些注释(@transactional)管理事务非常容易,我真的找不到上面提到的缺点。我可以看到触发特定行为的方法。 (所有@transactional方法触发事务行为)也许我误解了一些东西,这不是使用AOP的地方?但是,如果我没有误解这一点,为什么在这里可以看到哪些方法触发方面,为什么不能在上面的例子中看到它?我真的很想知道这个!
感谢您的回答! : - )
编辑:a)和b)得到解答(使用标记这些方法的IDE),c)仍然缺失: - )
答案 0 :(得分:3)
对于点b) 如果您将Eclipse与Spring IDE和AspectJ插件或STS一起使用,IDE将向您显示Aspects编织的位置。
对于点b) 如果您使用AspectJ和支持AspectJ的IDE(带有AspectJ插件的Eclipse或STS),那么您将在编码Aspect的源代码中看到标记。
编译时间不利于AspectJ,您无法在库中编辑方面。 (没有先进的技术)。
对于点c) 像@Transactional这样的声明性方面只有一个缺点。 - 您可以忘记将注释放在方法上。
但是,如果您有一个规则,例如:@Service所声明的类中的每个公共方法(或者如果您想构建自己的@TransactionalService),都是事务性的,那么您不需要指定@Transactional注释在每种方法上。 - 所以在摘要中:声明性方面非常适合阅读(你不会忽略它们),如果你的代码非常(简单地说)是“个人”(而不是“不一致”这个词),它们就很好。但是如果您在具有强大的Architecural规则的环境中工作(就像@Service类中的每个公共方法一样......),那么您可以在Point Cut Definition中编写此规则,而不是使用声明性Aspects。
答案 1 :(得分:2)
实际上对于点a)同样的答案认为Ralph给出了:使用带有AspectJ插件的Eclipse,或者无论如何使用Spring,使用STS。 这样,您将在IDE中看到某个方法是否与编辑器左侧的切入点匹配,用小红色箭头表示:
答案 2 :(得分:0)
实际上,Spring AOP支持创建自定义注释。
我使用Advice定义了一个名为Loggable绑定的注释.Loggabel可以应用于您想要的任何方法。
public @interface Loggable {
}
@Aspect
public class EmployeeAnnotationAspect {
@Before("@annotation(com.ben.seal.spring.aspect.Loggable)")
public void myAdvice(){
System.out.println("Executing myAdvice!!");
}
}