当前位置: 首页 > 面试题库 >

为什么Spring AOP在运行时不编织外部jar?

堵毅然
2023-03-14
问题内容

我在Spring 3上构建了Java应用程序。该项目还有另一个jar作为依赖项。

此依赖项包含一个@org.aspectj.lang.annotation.Aspect类(可以说com.aspectprovider.aspects.MyAspect)。有一种@Before建议是从实现接口的类中编织一个方法Foo。就像是:

@Before("execution(* com.project.Foo.save(..))")

Foo接口可以在“项目”内部或另一个jar中。对于这个例子来说没关系。

我的项目包含实现的类Foo。当然,这些是我要编织的类。

我的Spring应用程序上下文配置文件(applicationContext.xml)包含以下行:

<aop:aspectj-autoproxy />

我还将该方面声明为bean,并注入了一些属性:

<bean id="myAspect" class="com.aspectprovider.aspects.MyAspect"
  factory-method="aspectOf" >
  <property name="someproperty" value="somevalue" />
</bean>

槽式日志记录,我可以看到它MyAspect已实例化并注入了属性。但是保存方法没有被拦截。这就是问题。

如果将方面类从jar复制到具有Spring的应用程序中,则可以正常工作。当这些方面包含在外部jar中时,不会拦截方法save。有什么线索吗?

编辑:我如何调用Foo的save方法:

//in a JSF managed bean
@Inject
private Foo myFoo;  //there's a implementation of Foo in a package that spring is looking at. So it is injected correctly.

public String someAction() {
    myFoo.save("something"); //the @Before advice is only called if the class containing the aspect is not in an external jar
}


//in a class with a main method
void main(String[] ars) {
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    //right after the previous line, I can see in the log that MyAspect is instantiated.
    Foo myFoo = ac.getBean(Foo.class);
    myFoo.save("something"); //the @Before advice is only called if the class containing the aspect is not in an external jar
}

基本上,我applicationContext.xml有以下几行:

<context:annotation-config />
<context:component-scan base-package="com.project" />
<context:component-scan base-package="com.aspectprovider.aspects" />
<aop:aspectj-autoproxy />
<bean id="myAspect" class="com.aspectprovider.aspects.MyAspect" factory-method="aspectOf" >
    <property name="someproperty" value="somevalue" />
</bean>

我认为我不需要放任何东西

<context:component-scan  base-package="com.project">
    <context:include-filter type="aspectj" expression="com.aspectprovider.aspects.*" />
</context:component-scan>

问题答案:

我最终在Spring的applicationContext xml配置中声明了各个方面并删除了注释。

到目前为止,正在使用的是将AspectJ插件用于Maven,但是每次我在eclipse中更改一个类时,我都必须运行$ mvn compile(因为eclipse不了解这些方面,并且在没有它们的情况下编译了这些类),这是很糟糕的事情对任何愿意使用的人说MyAspect

然后,我刚刚创建了一个配置文件并记录了文档:要使用MyAspect,只需将此配置规则导入到您的spring的上下文配置中即可。



 类似资料:
  • 发生在运行时,因为编译器不能在决定执行哪个函数,但为什么编译器不能在编译时决定呢? 产出: 狗在吃...

  • 问题内容: 更新5: 我已经基于最新的Eclipse下载了最新的Spring ToolsSuite IDE。当我将项目导入为Maven项目时,Eclipse / STS似乎使用Maven目标来构建我的项目。这意味着AspectJ最终可以在Eclipse中正常工作。 更新4: 我最终仅使用Maven + AspectJ插件进行编译时编织,有效地绕过Eclipse的机制。 更新3: 看来AspectJ

  • 我有一个使用编译时编织方面的项目,它依赖于两个外部JAR。我从https://github.com/eveoh/gradle-aspectj使用gradle-aspectj插件 按以下方式生成.分级: 我的项目基于intellij idea(16)+gradle(2.12)+spring boot(1.2.3) 任何帮助都将不胜感激。 ===============================

  • 下载chromedriver并解压缩它。

  • 问题内容: 在一个Android应用中,我将此代码添加到 onCreate() 进口是: 代码可以编译,但是出现异常: 在不同的上下文中,故障会导致(即 _java.lang.ArrayStoreException:java.net.Socket无法存储在类型为java.io.Closeable []的数组中_ )。 我想念什么吗?知道该怎么办吗? 编辑 类似,当按原样使用时,它会导致 java.

  • 按照https://openjfx.io/openjfx-docs/#install-javafx的说明,我通过以下方式编译了示例HelloFX. java: 但是现在如果我试着运行它。。。 ... 我得到一个错误: 然而,报告为未找到的文件在那里: (我已经将权限更改为添加,以防出现问题,但显然这不是问题所在。 怎么了? (是的,指向)