我的方面在Eclipse中使用AspectJ插件很有效,但是如果我尝试将它与Maven一起使用,我得到......没什么.
我试过这个http://mojo.codehaus.org/aspectj-maven-plugin/includeExclude.html
我在我的方面添加了loggin,我尝试使用junit测试来测试它,但是当我运行时
mvn clean
mvn test
Run Code Online (Sandbox Code Playgroud)
我明白了......
[INFO] [aspectj:compile {execution: default}]
Run Code Online (Sandbox Code Playgroud)
但我没有看到登录测试
如果我在Eclipse中进行编译它可以找到,但我喜欢它是IDE独立的(所以我可以将它与Hudson一起使用)
PS我使用.aj文件为Aspect
我试图谷歌它,但我找不到任何有用的例子.
我有一个基于Spring 3的java应用程序构建.这个项目有另一个jar作为依赖.
这个依赖包含一个@org.aspectj.lang.annotation.Aspect类(比如说com.aspectprovider.aspects.MyAspect).有一个@Before建议从实现接口的类编织方法Foo.就像是:
@Before("execution(* com.project.Foo.save(..))")
Run Code Online (Sandbox Code Playgroud)
该Foo接口可以是"项目"内或另一罐子.这个例子没关系.
我的项目包含实现的类Foo.当然,那些是我希望它被编织的类.
我的Spring应用程序上下文配置文件(applicationContext.xml)包含以下行:
<aop:aspectj-autoproxy />
Run Code Online (Sandbox Code Playgroud)
我还将方面声明为bean,并注入一些属性:
<bean id="myAspect" class="com.aspectprovider.aspects.MyAspect"
factory-method="aspectOf" >
<property name="someproperty" value="somevalue" />
</bean>
Run Code Online (Sandbox Code Playgroud)
通过日志记录,我可以看到MyAspect实例化并注入了属性.但是方法保存没有被截获.这就是问题.
如果我将方面类从jar复制到具有Spring的应用程序,它可以工作.当这些方面包含在外部jar中时,方法save不会被截获.有线索吗?
编辑:我如何调用Foo的保存方法:
//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 …Run Code Online (Sandbox Code Playgroud)
我在我的Android项目中使用AspectJ,我想编写一个pointcut能够捕获所有调用onCreate()和onDestroy()我的活动的函数.我是AspectJ的新手,所以可能我在这里遗漏了一些东西,但为什么这样:
pointcut createActivity(Activity a) : target(a) && execution(* Activity.onCreate(..)) && within(com.test.activities..*);
工作而且这个:
target(a) && call(* Activity.onCreate(..)) && within(com.test.activities..*);
不起作用?
我有一些方法会抛出一些异常,我想使用AspectJ来建议计算执行时间,如果抛出一些异常并登录错误日志并通过重新抛出异常继续流程.
我尝试通过以下方式实现这一点,但eclipse说"未处理的异常类型".
代码 - 使用aspectj: -
public interface Iface {
public void reload() throws TException;
public TUser getUserFromUserId(int userId, String serverId) throws ResumeNotFoundException, TException;
public TUser getUserFromUsername(String username, String serverId) throws ResumeNotFoundException, TException;
public TResume getPartialActiveProfileFromUserId(int userId, int sectionsBitField, String serverId) throws ResumeNotFoundException, UserNotFoundException;
public TResume getPartialActiveProfileFromUsername(String username, int sectionsBitField, String serverId) throws ResumeNotFoundException, UserNotFoundException, TException;
}
Run Code Online (Sandbox Code Playgroud)
代码方面j: -
public aspect AspectServerLog {
public static final Logger ERR_LOG = LoggerFactory.getLogger("error");
Object around() : call (* com.abc.Iface.* (..)) {
Object ret; …Run Code Online (Sandbox Code Playgroud) 我正在尝试在AspectJ中注入Spring bean,就像下面显示的代码一样,无论如何我服务器(WAS Liberty Profile)一直抱怨方法aspectOf缺失.我可以知道如何解决这个问题?
应用程序的context.xml
<aop:aspectj-autoproxy/>
<import resource="/context-file-A.xml"/>
Run Code Online (Sandbox Code Playgroud)
上下文文件A.XML
<bean id="loggingAspect" class="com.huahsin.LoggingAspect" factory-method="aspectOf">
Run Code Online (Sandbox Code Playgroud)
JAVA代码
@Aspect
public class LoggingAspect {
...
}
Run Code Online (Sandbox Code Playgroud) 我正在看AspectJ,看看我们是否可以在我们的测试套件中使用它.
我们有一个相当大的第三方Java通信库硬连线使用它自己的类(它们没有实现任何接口),这反过来意味着我们需要一个物理后端存在并正确配置才能运行测试.
我正在考虑删除此限制的选项.一种可能性是创建麻烦类的子类,然后让AspectJ在加载第三方库时简单地用"new OurSubclassOfX"替换"new X",但我是AspectJ的新手,并且从我的文档简要略读不是典型的用例.
AspectJ能做到这一点吗?配置代码段是什么?
我很难过.我正在尝试测试一个AspectJ类.当我运行我的应用程序时,我的Aspect类被完美地拾取.但是,我似乎无法让任何Aspect类拦截测试中的任何方法.
我使用的是Spring 3.2.2,AspectJ 1.7.2和Maven 4.
这是我正在使用的简单测试:
测试AspectJ类
package my.package.path.config;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Aspect
public class TestAOP {
private String message;
public TestAOP() {
}
@Pointcut("execution(* my.package.path.TestAOPClient.relayMessage(..))")
public void aopPointcut() {
}
@Around("aopPointcut()")
public String monitor(ProceedingJoinPoint pjp) throws Throwable {
String msg = (String)pjp.proceed();
this.setMessage(msg);
return msg;
}
Run Code Online (Sandbox Code Playgroud)
}
正在拦截其方法的类
package my.package.path.config;
public class TestAOPClient {
public String relayMessage(String msg) {
return msg;
}
}
Run Code Online (Sandbox Code Playgroud)
测试类
package my.package.path.config;
import static org.hamcrest.Matchers.equalTo;
import …Run Code Online (Sandbox Code Playgroud) 使用maven和纯java项目,我能够使用codehaus的aspectj-maven-plugin来编织(编译时)方面(从我构建的库)到我的带注释的类.
我想用android项目(gradle build)做同样的事情,但似乎找不到太多的文档.
我已经找到了Android的贴切项目在这里,但不能换我围绕着如何用AspectJ织使用它的头.
任何帮助赞赏.
根据Spring的文档使用Spring IoC配置AspectJ方面以配置Spring IOC的方面,必须在xml配置中添加以下内容:
<bean id="profiler" class="com.xyz.profiler.Profiler"
factory-method="aspectOf">
<property name="profilingStrategy" ref="jamonProfilingStrategy"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
正如@SotiriosDelimanolis所建议的那样,在JavaConfig中将以下内容重写为:
@Bean
public com.xyz.profiler.Profiler profiler() {
com.xyz.profiler.Profiler profiler = com.xyz.profiler.Profiler.aspectOf();
profiler.setProfilingStrategy(jamonProfilingStrategy()); // assuming you have a corresponding @Bean method for that bean
return profiler;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果Profiler方面是用native aspectj .aj语法编写的,这似乎只能起作用.如果它是用Java编写的并带有注释@Aspect,我会收到以下错误消息:
对于类型Profiler,方法aspectOf()未定义
对于使用@AspectJ语法编写的方面,是否有使用JavaConfig编写此方法的等效方法?
ANT中有一个关于此问题的解决方案,但我们如何通过gradle实现这一目标?是否可以通过编译后编织来实现.意思是用lombok编译来获取所有生成的delombok代码,然后在这个生成的delombok代码上编织方面而不是aspectJ擦除它?
以下这些SO帖子似乎没有任何关于如何解决这个问题的决定?
Lombok无法与AspectJ一起使用? 使用AspectJ + Lombok的Gradle + RoboBinding不兼容
DiscussionThread http://aspectj.2085585.n4.nabble.com/AspectJ-with-Lombok-td4651540.html
谢谢Setzer