我在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: 但是现在如果我试着运行它。。。 ... 我得到一个错误: 然而,报告为未找到的文件在那里: (我已经将权限更改为添加,以防出现问题,但显然这不是问题所在。 怎么了? (是的,指向)