Tag: aop

如何使用AspectJ拦截处理自身exception的方法

我正在尝试在发生某些特定exception时添加一些监控。 例如,如果我有这样的方面: @Aspect public class LogAspect { @AfterThrowing(value = “execution(* *(..))”, throwing = “e”) public void log(JoinPoint joinPoint, Throwable e){ System.out.println(“Some logging stuff”); } } 和测试类: public class Example { public void divideByZeroWithCatch(){ try{ int a = 5/0; } catch (ArithmeticException e){ System.out.println(“Can not divide by zero”); } } public void divideByZeroWithNoCatch(){ int b = […]

具有多个注释的方法的AspectJ切入点

使用加载时编织,纯AspectJ。 我们有2个@Count和@Count注释,以及一些带注释的方法。 @Time (name=”myMethod1Time”) @Count (name=”myMethod1Count”) public void myMethod1(){..}; @Time (name=”myMethod2Time”) public void myMethod2(){..}; @Count (name=”myMethod3Count”) public void myMethod3(){..}; 现在我为myMethod1定义了我自己的方面, myMethod1有多个注释: // multiple annotations, not working @Around(“@annotation(time) && @annotation(count)) public Object myAspect(Time time, Count count) {..} 这不起作用。 但是,捕获方法myMethod2可以使用单个注释正常工作: // single annotation, is working @Around(“@annotation(time)) public Object myAnotherAspect(Time time) {..} 我想只捕获签名中存在Time和Count注释的方法,我想使用注释值。 谁知道如何实现这一目标?

APT和AOP在同一个项目中,使用Maven

我必须在同一个Maven项目中使用Annotation Processing(apt)和AspectJ。 两者都适合自己,但我需要根据apt创建的代码创建方面。 所以我需要二进制编织(原始源文件由apt扩展)。 如何在maven项目中启用二进制编织? 我知道唯一的标准选项是使用weaveDependencies参数提供依赖项 ,但这很糟糕。 还有别的办法吗? 好吧,我可以使用Maven Antrun插件嵌入AspectJ ant任务 ,但我不想诉诸于此 。

@Around建议究竟如何在Spring AOP中运行?

我正在研究Spring AOP模块,我对AROUND建议的确切运作方式有些怀疑。 阅读官方文档: http : //docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html 我可以阅读有关AROUND ADVICE的内容 : 围绕建议:围绕连接点的建议,例如方法调用。 这是最有力的建议。 around通知可以在方法调用之前和之后执行自定义行为。 它还负责选择是继续加入点还是通过返回自己的返回值或抛出exception来快速建议的方法执行。 这是周围建议的序列图: 因此,根据我的理解,我可以定义一个建议(我的自定义行为),它将在切入点指定的关节点之前和之后执行。 例如,我可以通过这种方式定义AROUND ADVICE : @Around(“execution(@example.Cacheable * rewards.service..*.*(..))”) public Object cache(ProceedingJoinPoint point) throws Throwable { Object value = cacheStore.get(cacheKey(point)); if (value == null) { value = point.proceed(); cacheStore.put(cacheKey(point), value); } return value; } 在调用服务方法之前和之后执行已实现的chaching行为。 这样对吗? 我无法完全理解的是它是如何使用ProceedingJoinPoint点参数的。 根据我的理解,它用于选择执行或不执行特定操作但具体如何工作? 另一个疑问是如何正确使用AOP建议如何回答以下问题: 如果我想尝试捕获exception,我必须使用哪些建议? 我认为在这种情况下,答案是使用After throw advice,因为当匹配的方法执行通过抛出exception退出时,通知会执行。 […]

自定义注释中的Spring表达式语言

我想在自定义注释中使用Spring Expression Language。 此注释将由自定义Aspect使用。 看一下这个: @StatisticEventTrigger(value = TestStatisticEvent.class, expression = “#p1”) public void someOtherMethod(String arg1, Long arg2) { 如您所见,我想使用表达式(在本例中)来检索一些特定的参数。 当我有我的Aspect,触发带注释的方法时,我想评估spring表达式(以编程方式)来检索用于进一步业务的值;) 有任何想法吗? 到目前为止谷歌不是我的朋友!

Spring aop拦截来自同一服务类的调用

我有一个与上面提到的相同的场景 Spring @Transaction方法调用同一个类中的方法,不起作用? 我指的是答案#1,我认为这对我的简单pojo课程有效,但它没有。 在我的情况下,我没有注释@Transaction。 它是一个简单的pojo类。 如果我在上面的post中举例,我希望拦截每个方法adduser以及使用spring aop的addusers。 是否可以拦截从同一服务调用中调用的方法? 我指的是AspectJAwareProxy,它可以解决问题,但不能解决整个问题。 我的意思是我不希望任何东西被添加到我的业务逻辑中。 所以我想避免任何编码,除了定义切入点和定义建议。 是否有可能使用Java和spring aop? 我正在使用CGlib来生成代理。 Spring版本是3.0.5。请。 谢谢,Ajay

为什么没有为Jersey控制器检测到我的Aspect(使用自定义注释)?

我想在Jersey控制器上创建一个Aspect来衡量服务执行的时间。 我正在与我的切入点作斗争,因为它没有被检测到,我的方面永远不会被启动。 我尝试过使用大量的切入点,例如: execution(@Monitor * *.*(..)) execution(public * *(..)) change the order of @Aspect and @Component Added a pointcut like this: @Pointcut(“execution(@Monitor * *.*(..))”) public void monitorRequestTargets(){} @Around(“monitorRequestTargets()”) Tried using AOP and CGLIB Also tried changing the order of configuration in context.xml Eclipse检测到我的方法正在建议我的方法,但它不会在运行时执行。 你能否给我一些提示,说明为什么没有创建方面或切入点没有启动? 我的代码如下。 的context.xml 我的MonitorAspect @Component @Aspect public class MonitorAspect { private static […]

AspectJ加载时间编织不能在Spring bean上运行

我正在开发一个项目,该项目使用Spring配置的Java(而不是xml)风格来连接依赖项。 它还具有应通过AspectJ编织到所需方法(通过注释)的分析逻辑。 设置工作正常,我可以看到我所需的包中的类被编织,并且可以从中记录分析信息。 问题是编织对@Bean类@Bean 。 我通过以下方式在aop.xml启用了调试: 我可以看到我所需的包中的类被编织,但不是配置中的bean。 如果我直接实例化类(不注入它们)编织工作。 不幸的是,我不能在这里发布真实的代码,但这是一个愚蠢的例子: @Configuration @EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED) public class MySpringConfig { @Bean AnnotatedClass1 annotatedClass1() { return new AnnotatedClass1(new AnnotatedClass2()); } } AnnotatedClass1和AnnotatedClass2存在于同一个包中,编织工作在直接实例化的那个上,而不是bean返回的那个。 我搜索过Spring AOP文档,但我似乎无法找到与此相关的任何内容。 你需要为自动代理做一些魔术,以及SpringAOP的一些限制,但加载时间编织应该尽可能地工作 – 例如我试过私有方法并且它有效。

Spring AOP切入点有一个特定的参数

我需要创建一个我难以描述的方面,所以让我指出这些想法: com.xy的包(或任何子包)中的任何方法.. 一个方法参数是接口javax.portlet.PortletRequest的实现 这个方法可能有更多的争论 他们可能是任何顺序 我需要一个切入点和给出的PortletRequest的“around”建议 目前我有点像: @Pointcut(“execution(* com.xy.*.*(PortletRequest,..)) && args(request,..)”) public void thePointcut(PortletRequest request) { } @Around(“thePointcut(request)”) public Object theAdvice(ProceedingJoinPoint joinPoint, PortletRequest request) { … 并收到错误: 错误10:47:27.159 [ContainerBackgroundProcessor [StandardEngine [Catalina]]] osweb.portlet.DispatcherPortlet – 上下文初始化失败org.springframework.beans.factory.BeanCreationException:创建名为’org.springframework.web.servlet的bean时出错。 mvc.HttpRequestHandlerAdapter’:bean的初始化失败; 嵌套exception是java.lang.IllegalArgumentException:w arning此类型名称不匹配:PortletRequest [Xlint:invalidAbsoluteTypeName] 任何帮助高度赞赏 亲切的问候,丹 更新我试图拦截的方法是: 在公共类com.xyMainClass中 : public String mainRender(Model model, RenderRequest request) throws SystemException 在公共类com.xyasd.HelpClass中 : public final […]

如何通过spring aop 更改返回值

我在DAO层有一个返回值的方法,我想通过spring AOP改变返回值,根据不同的要求,然后发送到SERVICE层中的相应方法; 但我不知道该怎么做。