在以下情况下,我需要使用与方法匹配的切入点创建方面:
方面类看起来像这样
@Pointcut("execution(@MyAnnotationForMethod * *(..,@aspects.MyAnnotationForParam Object, ..)) && args(obj)")
void myPointcut(JoinPoint thisJoinPoint, Object obj) {
}
@Before("myPointcut(thisJoinPoint , obj)")
public void doStuffOnParam(JoinPoint thisJoinPoint, Object obj) {
LOGGER.info("doStuffOnParam :"+obj);
}
Run Code Online (Sandbox Code Playgroud)
注释方法
@MyAnnotationForMethod
public string theMethod(String a, @MyAnnotationForParam @OtherAnnotation Object obj, Object b){
LOGGER.info(a+obj+b);
}
Run Code Online (Sandbox Code Playgroud)
用eclipse - >警告:关于poincut:
Multiple markers at this line
- no match for this type name: MyAnnotationForMethod [Xlint:invalidAbsoluteTypeName]
- no match for this type name: aspects.MyAnnotationForParam On the before : advice defined in xxx.xxx.xxx.xxx.MyAspect has not …Run Code Online (Sandbox Code Playgroud) 在AspectJ中,我想吞下一个异常.
@Aspect
public class TestAspect {
@Pointcut("execution(public * *Throwable(..))")
void throwableMethod() {}
@AfterThrowing(pointcut = "throwableMethod()", throwing = "e")
public void swallowThrowable(Throwable e) throws Exception {
logger.debug(e.toString());
}
}
public class TestClass {
public void testThrowable() {
throw new Exception();
}
}
Run Code Online (Sandbox Code Playgroud)
上面,它没有吞下异常.testThrowable()的调用者仍然收到异常.我希望来电者不要收到例外.怎么办呢?谢谢.
当我尝试使用Roo创建的JPA对象时,我收到此错误.
实体管理器尚未注入(Spring Aspects JAR是否配置为AJC/AJDT方面库?)
我已经按照一些在线建议将spring-aspects.jar添加到Eclipse中的aspectj路径,但我仍然遇到此错误.有谁知道如何解决这个问题?
我使用的环境是Spring 3.0.5,Hibernate 3.6和JBoss 6.0.0.Final.
这里有几个问题:
ajc是否会更改它编译的所有类(甚至是非方面的类)?如果我只编写方面类ant然后将它们放在与常见类相同的类路径中,该怎么办?
ajc编译的项目是否比使用加载时编织的项目执行得更快?
如果我需要编写一个跟踪AspectJ的库,然后我希望这个库可以用于任何项目,该怎么办?在这种情况下,加载时编织是唯一的选择吗?
我们使用aspectJ来获取现有应用程序的一些指标.在eclipse中使用AJDT进行构建和编织时,一切都很有效.但在整合环境中.我们使用ant脚本来构建和部署应用程序.
问题发生在ExceptionHandler上我确实我们的方面不会抛出异常并破坏应用程序
@Aspect
public class ExceptionHandlerAspect {
/**
* Pointcut
*/
@Pointcut("within(com.xxx.yyy.aop.aspect.*..*)")
public void allMethodInAspectPackage() {}
/**
* Pointcut
*/
@Pointcut("!within(com.xxx.yyy.aop.aspect.ExceptionHandlerAspect)")
public void notInExceptionHandlerAspectClass() {}
/**
* Pointcut
*/
@Pointcut("call(* *(..))")
public void allClassAndMethod() {}
/**
@Around("allClassAndMethod() && allMethodInAspectPackage() && notInExceptionHandlerAspectClass()")
public Object logException(ProceedingJoinPoint joinPoint) throws Throwable{
Object ret = null;
try {
ret = joinPoint.proceed();
}catch (Throwable exception) {
if (joinPoint.getSignature().getDeclaringTypeName().equalsIgnoreCase("org.aspectj.lang.ProceedingJoinPoint")) {
throw exception;
}
this.logException.info("Exception in " + joinPoint.getSignature().getDeclaringTypeName(),exception);
}finally {
return ret;
}
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我想拦截我的方面包中的每个调用,除了在ExceptionHandler本身.
ant …
我正在使用Spring 3.1.2.RELEASE和cglib加载时编织,我正在尝试使用具有自定义注释和注释参数的方法.
建议:
@Aspect
public class MyAdvice
{
@Around("execution(@com.mycompany.locking.Lock * *(@com.mycompany.locking.LockVal(*), ..)) " +
"&& args(batch) && @args(propertyToLock)"
public Object lockAndProceed(ProceedingJoinPoint pjp, Object batch, LockVal propertyToLock) throws Throwable {
//Do stuff....
pjp.proceed();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我正在测试的类:
public interface UpdateManager
{
public void processUpdate(MyBatchObject batch);
}
public class UpdateManagerImpl implements UpdateManager
{
@Lock
public void processUpdate(@LockVal("lockValue") MyBatchObject batch)
{
//Do stuff...
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我无法获得执行建议.如果我删除了切入点中的@args和args条件,那么建议就会触发,但是我必须通过ProceedingJoinPoint来获取我需要的参数.
为什么不提出建议?我做错什么了吗?
编辑:以下切入点作为Spring的独立程序工作:
@Aspect
public class MyAdvice
{
@Around("execution(@com.mycompany.locking.Lock * *(@com.mycompany.locking.LockVal(*), ..)) " +
"&& args(batch)"
public Object …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用JDK8运行aspectj-maven插件.但它给出的错误如"java.lang.CharSequence类型无法解析.它是从所需的.class文件间接引用的"
有关如何解决的任何帮助,或者aspectj-maven-plugin是否支持JDK8.我正在使用1.6版本的aspectj - maven-plugin.
如果我使用的是基于AspectJ的Spring AOP,那么我是否可以配置我的方面以使用加载时间编织?或者,当使用基于AspectJ的方法时,Spring AOP是否也支持运行时/编译时编织?
我有一个非常简单的AspectJ方面(使用@AspectJ),它只打印出一条日志消息.我的目标是在我的Android应用程序中建议代码.现在,只要我在应用程序源代码中拥有aspect类本身,这个方面就可以完美地运行.一旦我将方面移动到另一个模块(java - > .jar或android lib - > .aar),我在应用程序中运行建议代码时会遇到以下运行时异常:
java.lang.NoSuchMethodError: com.xxx.xxx.TraceAspect.aspectOf
Run Code Online (Sandbox Code Playgroud)
基本上我的结构是这样的:
Root
+ app (com.android.application)
- MainActivity (with annotation to be adviced)
+ library (android-library)
- TraceAspect (aspect definition)
Run Code Online (Sandbox Code Playgroud)
从ajc编译器,我可以看到ajc编译器选择了我的类并正确地建议它们,所以我真的不知道为什么它可以工作,只要我在源代码中有@AspectJ类,但是一旦我移动就停止工作它是一个jar存档.
我正在使用gradle.我的应用程序的Buildscript非常简单.我按照http://fernandocejas.com/2014/08/03/aspect-oriented-programming-in-android/中的说明进行操作
import com.android.build.gradle.LibraryPlugin
import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Main
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
classpath 'org.aspectj:aspectjtools:1.8.1'
}
}
apply plugin: 'com.android.application'
repositories {
mavenCentral()
}
dependencies {
compile 'org.aspectj:aspectjrt:1.8.1'
compile project (':library')
}
android.applicationVariants.all { variant ->
AppPlugin plugin …Run Code Online (Sandbox Code Playgroud) aspectj ×10
java ×5
aop ×4
spring ×3
maven ×2
android ×1
annotations ×1
gradle ×1
maven-plugin ×1
parameters ×1
spring-roo ×1