Tag: aop

AspectJ加载时间weaver不会检测所有类

我在“aspectj”模式下使用Spring的声明式事务(@Transactional注释)。 它在大多数情况下都可以完全像它应该的那样工作,但对于一个它没有。 我们可以称之为Lang (因为这就是它实际上被称为)。 我已经能够确定加载时间织布机的问题。 通过打开aop.xml中的调试和详细日志记录,它列出了所有正在编织的类。 确实没有在日志中提到有问题的Lang类。 然后我在Lang的顶部放置了一个断点,导致Eclipse在加载Lang类时挂起该线程。 当LTW编织其他类时,这个断点被击中! 所以我猜它要么试图编织Lang并且失败并且没有输出,或者其他一些类有一个引用强制它在实际有机会编织它之前加载Lang 。 我不确定如何继续调试这个,因为我无法以较小的规模重现它。 有关如何继续的任何建议? 更新:其他线索也欢迎。 例如,LTW如何实际运作? 似乎有很多魔法发生。 是否有任何选项可以从LTW获得更多的调试输出? 我目前有: 我忘了汤姆之前提到它: spring-agent被用来允许LTW,即InstrumentationLoadTimeWeaver 。 根据安迪克莱门特的建议,我决定检查AspectJ变压器是否甚至通过了这门课程。 我在ClassPreProcessorAgent.transform(..)放了一个断点,看起来Lang类甚至都没有到达那个方法,尽管它和其他类(Jetty的WebAppClassLoader的一个实例)一样被类加载器加载。 然后我继续在InstrumentationLoadTimeWeaver$FilteringClassFileTransformer.transform(..)放置一个断点。 甚至没有一个人被Lang击中。 我相信应该为所有加载的类调用该方法,无论他们使用什么类加载器。 这开始看起来像: 我的调试有问题。 可能是Lang在Eclipse报告时没有加载 Java bug? 牵强附会,但我想它确实发生了。 接下来的线索:我打开了-verbose:class ,看起来好像是Lang过早加载 – 可能是在变换器添加到Instrumentation之前。 奇怪的是,我的Eclipse断点没有捕获到这个加载。 这意味着Spring是新的嫌疑人。 在ConfigurationClassPostProcessor中似乎有一些处理加载类来检查它们。 这可能与我的问题有关。 ConfigurationClassBeanDefinitionReader这些行导致读取Lang类: else if (metadata.isAnnotated(Component.class.getName()) || metadata.hasAnnotatedMethods(Bean.class.getName())) { beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_LITE); return true; } 特别是, metadata.hasAnnotatedMethods()在类上调用getDeclaredMethods() ,它加载该类中所有方法的所有参数类。 […]

Spring AOP – 带有注释的每个方法的切入点

我试图定义一个切入点,它将捕获每个使用(即) @CatchThis注释的方法。 这是我自己的注释。 此外,我想访问该方法的第一个参数,它将是Long类型。 可能还有其他争论,但我不关心它们。 编辑 这就是我现在所拥有的。 我不知道的是如何传递用@CatchThis注释的方法的第一个参数。 @Aspect public class MyAspect { @Pointcut(value = “execution(public * *(..))”) public void anyPublicMethod() { } @Around(“anyPublicMethod() && @annotation(catchThis)”) public Object logAction(ProceedingJoinPoint pjp, CatchThis catchThis) throws Throwable { return pjp.proceed(); } }

如何用Spring实现AOP

我正在使用Spring,我需要实现AOP,但我完全不熟悉它。 有谁能够帮我?

@Transactional和AOP之间的混淆

@Transactional是否会在春季3取代AOP。它们是否相同? 我可以说@Transactional在内部实现了AOP吗?

尝试重新转换类时得到“UnsupportedOperationException”

JDK1.6,动态修改jvm中加载的类。 当我评论代码时: classReader.accept(classAdapter, ClassReader.SKIP_DEBUG); , “UnsupportedOperationException”exception消失。 实际上,为了测试我的代码,我没有修改任何字段或方法。 但是程序在调用retransformClasses()之后捕获exception”UnsupportedOperationException” 。 有没有类似的例外? 可以给我一些建议吗? 代码如下: public byte[] modifySleepMethod() throws Exception { System.out.println(“Call modifySleepMethod”); ClassReader classReader = new ClassReader(classfileBuffer); System.out.println(“new classreader”); ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_MAXS); System.out.println(“new classwriter”); ClassAdapter classAdapter = new ModifyMethodClassAdapter(classWriter); classReader.accept(classAdapter, ClassReader.SKIP_DEBUG); byte[] classFile = null; classFile = classWriter.toByteArray(); FileOutputStream fos; try { fos = new […]

Spring AOP Pointcut不会触发

我是Spring和AOP的新手。 我正在尝试这个简单的事情,我创建了一个自定义注释,在任何方法之前放置应该执行一些代码。 这是我创建的注释 // Declares a custom annotation that validates json @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface JsonSchemaAnnotation { } 接下来,我创建了包含逻辑的Spring Aspect类 @Aspect public class UpdateUIMetadataInterceptor { @Pointcut(“execution(public * com.fico.cardinal.cm.*.*(..))”) public void anyPublicMethod() { System.out.println(“Running”); } @Before(“anyPublicMethod() && @annotation(jsonSchemaAnnotation)”) public void validateJson(ProceedingJoinPoint pjp) throws Throwable { System.out.println(“Running”); } } 这是我的简单测试课程 public class ValidationTest { public static void […]

AOP中调用和执行之间的区别

我试图尽可能简单地理解AOP中执行和调用之间的区别。 从我收集的内容中,execution()将在执行代码中添加一个连接点,因此在这种情况下是HelloWorldSayer.sayHello() ,但如果切入点是call() ,则连接点将是HelloWorldSayer.main() 。 它是否正确? public class HelloWorldSayer { public static void main (String[] args) { sayHello(); } public static void sayHello() { System.out.println(“Hello”); } } public aspect World { public hello(): execution(static void HelloWorldSayer.sayHello()); after() hello() { System.out.println(“Bye”); } }

切入点不适用于通用接口

我正在使用Spring框架(2.5)和它的AOPfunction。 我有一个切入点表达式,比如 @Pointcut(“execution(public * org.springframework.batch.item.ItemReader+.read(..))”) public void itemReaderMethods() {} ItemReader接口是Spring接口,它的签名是: org.springframework.batch.item.ItemReader 该接口有一个名为’read’的方法,我想为其应用建议:方法签名是: org.springframework.batch.item.ItemReader.read() 但是,当我使用上面的切入点表达式运行我的应用程序时,我得到以下exception: java.lang.IllegalArgumentException:警告此类型名称不匹配:org.springframework.batch.item.ItemReader [Xlint:invalidAbsoluteTypeName] 我的猜测是,由于ItemReader是一个通用接口,因此切入点不能正确匹配。 如果是这种情况,我如何编写切入点表达式以匹配通用接口?

AspectJ AOP LTW无法动态加载javaagent

这是我的非工作项目示例 。 它包含2个模块: aop-lib – 用作lib的方面。 它包含以下类 Wrap.java – 它是用于附加建议的注释 WrapDef.java – 它是上面提到的Wrap注释的定义。 aop-app – 使用上面的方面lib DynamicLoad.java – 动态加载javaagent的类 Main.java – 使用Wrap注释的主类。 目录结构如下: . ├── README.md ├── aop-app │ ├── pom.xml │ └── src │ └── main │ └── java │ └── com │ └── aop │ └── app │ ├── DynamicLoad.java │ └── Main.java […]

:: 0处的错误无法找到引用的切入点注释

我正在尝试创建一个方面来监视某些方法的执行时间。 当我尝试运行测试时,我收到此错误: Caused by: java.lang.IllegalArgumentException: error at ::0 can’t find referenced pointcut annotation at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301) at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:207) 当ApplicationContext加载时。 我将注释定义为: @Retention(RetentionPolicy.RUNTIME) @Target( { ElementType.METHOD, ElementType.TYPE }) public @interface TimePerformance { } 这是方面代码: @Aspect public class MonitorImpl{ private static final Log LOG = LogFactory.getLog(MonitorImpl.class); @Pointcut(value=”execution(public * *(..))”) public void anyPublicMethod() { } @Around(“anyPublicMethod() && annotation(timePerformance)”) public Object […]