我有一个很难解释的问题,所以让我们开始吧:
上下文:我有一个在tomcat服务器上运行的应用程序让我们称之为“admin”。管理员具有导入/导出功能。我们自己的应用程序是对此的扩展,我们需要在“管理应用程序”使用导入/导出功能时收集一些信息。
问题:包含类ImportController的第三方jar位于:~/someFolder/admin/WEB-INF/lib/admin.jar
。目标是收集旧项目ID和新项目ID,以便我们的扩展可以将我们的类链接到正确的项目。因为我知道方法签名,但我可以使用AOP这样做。
想法:我带来的想法是将idHiJacker.jar
之类的内容放在~/someFolder/admin/WEB-INF/lib/
中并包含单个切入点和建议,并启用加载时编织。该建议只是将信息放入xml文件中,这样我们的扩展就可以在我们想要在项目导入后放回链接时读取它。
此外,我必须说我是一个纯粹的AOP和网络新手。但我不想导入一个怪物只是用AOP做这个小操作。目前正在阅读aspectJ和AspectWerkz
问题:
编辑:如果你有很好的教程来链接答案,那就太棒了
感谢您的时间和回答
答案 0 :(得分:1)
问题:
1) Am I in the right direction? Do you see anything that would make this idea not work at all?
我看不出有什么理由不起作用。除了Aspect Oriented Programming
和cross-cutting
之外,advice
的概念是在某些其他切入点之前或之后执行某些操作,并且通常会影响该建议功能的行为。你在这里正是这样做的。
2) If this is possible what would be the good practice to do it in a very clean manner?
对于方面/建议存在一些固有的混乱 - 由于控制流被劫持更多,因此需要简单的顺序读取代码来理解最新情况。
3) Should i do it with AspectJ? AspectWerkz? Or Something else?
我从未使用过AspectWerkz,但我对AspectJ有很好的经验;特别是在stackoverflow上的支持方面,甚至可能更多地在其邮件列表上。
4) Am i doing this for nothing? Is there an easier way to do that operation?
除非您可以更改导入控制器的代码或更改客户端以进行额外调用以执行链接操作,否则这种基于拦截的方法似乎是最好的恕我直言。
答案 1 :(得分:0)
我建议使用更简单的解决方案 - 使用装饰器模式环绕第三方ImportController,在调用第三方库之前放置您的功能。您应该能够这样做,因为您似乎可以访问管理应用程序。
这基本上是做AOP正在做的事情,但是使用代码。使用加载时织入器的方法也应该有效,但在我看来很复杂 - 如果你绝对打算这样做,请使用AspectJ。