【问题标题】:Struts 1 and Spring AOPStruts 1 和 Spring AOP
【发布时间】:2018-02-22 17:10:30
【问题描述】:

我有一个使用 Struts 1 制作的应用程序,它需要一些听觉,所以我想要使用方面,所以我不需要更改类,而是“拦截”对方法的调用。

我正在尝试使用 Spring AOP + Aspectj 集成,但首先我需要集成 Struts 和 Spring。我在这里尝试了几个教程和类似的问题,但显然它们主要用于 Struts 2。

更具体地说,我正在这样做:

web.xml

...
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
...

applicationContext.xml

<context:component-scan base-package="com.app"/>
<context:annotation-config/>
<aop:aspectj-autoproxy />

<bean id="loggerAspect" class="com.app.util.LoggerAspect"/>

LoggerAspect.java

@Aspect
public class LoggerAspect {

    @Before("execution(* com.app.action.FileAction.list(..))")
    public void test(JoinPoint joinPoint) {
        System.out.println("Calling: " + joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName());
    }
}

pom.xml

    <!-- Spring -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <!--  -->
    <!-- Spring AOP -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <!-- AspectJ -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.13</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.13</version>
    </dependency>

我没有对 struts-config.xml 文件做任何事情。服务器加载应用程序没有任何问题,但 Spring 没有加载等方面。

知道如何解决这个问题吗?

【问题讨论】:

  • 寻找答案我发现了这篇帖子stackoverflow.com/a/1606780/1950103,他们说:“Spring-AOP 无法向不是由 Spring 工厂创建的任何东西添加方面”。所以我的理解是我不能使用 Spring AOP 和 Struts,因为我没有将类映射为 bean。这是真的吗?
  • 我已经在 applicationContext 中添加了我的类 com.app.action.FileAction 作为 bean,但仍然无法加载 Spring

标签: java spring aspectj spring-aop struts-1


【解决方案1】:

如果您想将 AOP 应用到遗留的非 Spring 应用程序中,则不要仅仅因为 Spring AOP 而引入 Spring。您直接使用 AspectJ 并在这里有几个选项:

  • 如果您控制原始应用程序的构建,则使用 AspectJ 编译器编译原始应用程序,如果您不这样做:
  • 编译后二进制编织创建原始类文件的 AOP 增强副本。重新包装它们并使用它们来代替未编织的原件。
  • 加载时编织:Java 代理在类加载期间进行编织。

AspectJ 比 Spring AOP 强大得多,速度更快(无代理)并且完全独立于 Spring。这就是你想要使用的。

【讨论】:

  • 感谢@kriegaex,方面的概念非常方便,但尽管有这些功能,但我认为 AspectJ 本身的实现有点不切实际。我还在做一些测试并寻找过滤器之类的选项,所以我不依赖第三方
  • 那你到底为什么要问一个 AspectJ 问题,让人们花时间阅读和回答它,如果你将这个概念视为“不切实际”?正如我所说,你的问题是 Spring AOP,将一个大框架引入到一个原本不需要它的遗留应用程序中。使用 AspectJ 并快乐。如果你学会正确地做这件事,没有什么是不切实际的。我不知道任何其他添加方式,例如在 10 分钟内记录或跟踪任何应用程序,而无需更改源代码或引入带有拦截器的大型框架。你有没有试过?如果是,请描述您的困难。
  • 至于依赖关系:AspectJ 只是一个 JAR,将其与 Spring 或任何其他框架进行比较。您真的想为您正在考虑引入的任何框架锁定供应商吗?这不是依赖吗?你的论点没有说服力。
  • 不要误会,再读一遍,因为我的意思是配置,越简单越好,这就是我寻找Spring AOP的原因,否则这不是最常见的方式使用方面。我仍在测试,但如果我最终选择过滤器,这是 servlet 的基本功能,所以看,不再有依赖项
  • 如果您能找到解决问题的板载方法,那很好。我仍然没有看到 AspectJ 的复杂之处。你说你还在测试拦截器。使用 AspectJ,您将在 30 分钟内完成,根据我的经验,配置非常容易。无论如何,让我不要再在这个问题上浪费时间了。祝你好运。
猜你喜欢
  • 2014-05-07
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多