小编kri*_*aex的帖子

AspectJ:如何将方面库编织到Java项目中

我使用AspectJ构建小型库(Java和Maven).图书馆必须是独立的.图书馆提供方面和注释.库的功能是 - "执行具有特定注释的方法时调用建议".当我在一个模块中使用所有内容时,一切正常,但是当我将库和项目与必须应用建议的类分开时,问题就会出现.我创建简单的架构. 架构 图书馆B - 我的图书馆(方面和注释)项目A - 项目必须适用的商业方法是否有可能做到这一点?

java aop aspectj maven

8
推荐指数
1
解决办法
3964
查看次数

在Eclipse中突出显示Spock测试关键字

我正在使用Eclipse进行Java项目,其中一些使用Groovy/Spock编写的测试使用了given: when: then:语法.我想用一些颜色突出显示这些关键字.注意:spock插件应该是这样但不起作用.所以我想自己这样做.

eclipse syntax-highlighting spock

8
推荐指数
1
解决办法
171
查看次数

ProGuard:保持用@Keep注释的接口实现

我想用自定义@Keep注释在我的应用程序中注释一些接口,并配置ProGuard

  • 不会混淆带注释的接口及其方法,
  • 在实现类时,不要混淆那些接口方法的实现.

我试过类似的东西

# Kept interfaces and all their methods
-keep interface @com.foo.bar.annotation.Keep * {
    <methods>;
}

# Classes implementing kept interfaces
-keep class * implements @com.foo.bar.annotation.Keep *
Run Code Online (Sandbox Code Playgroud)

但显然语法无效.我尝试了其他的东西,但是ProGuard文档及其示例并没有真正清楚确切的语法以及在什么情况下可能出现的情况.

java annotations interface proguard

7
推荐指数
1
解决办法
5203
查看次数

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

我正在研究Spring AOP模块,我对AROUND建议的确切运作方式有些怀疑.

阅读官方文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html

我可以阅读有关AROUND ADVICE的内容:

围绕建议:围绕连接点的建议,例如方法调用.这是最有力的建议.around通知可以在方法调用之前和之后执行自定义行为.它还负责选择是继续加入点还是通过返回自己的返回值或抛出异常来快速建议的方法执行.

这是周围建议的序列图:

在此输入图像描述

因此,根据我的理解,我可以定义一个建议(我的自定义行为),它将在切入点指定的关节点之前和之后执行.

例如,我可以用这种方式定义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;
}
Run Code Online (Sandbox Code Playgroud)

在调用服务方法之前和之后执行实现的chaching行为.这样对吗?

我无法完全理解的是它是如何使用ProceedingJoinPoint点参数的.

根据我的理解,它用于选择执行或不执行特定操作但具体如何工作?

另一个疑问是如何正确使用AOP建议如何回答以下问题:

如果我想尝试捕获异常,我必须使用哪些建议?

我认为在这种情况下,答案是使用After throw通知,因为当匹配的方法执行通过抛出异常退出时,通知会执行.

但我不确定它,因为根据我的理解,只有在方法抛出异常时才会执行建议.或者在这种情况下我必须使用**AROUND ADVICE*?

TNX

java aop spring spring-mvc spring-aop

7
推荐指数
1
解决办法
1万
查看次数

尽管明确注册了 TimedAspect,@Timed 仍然无法工作 - spring boot 2.1

我需要使用测微计@Timed 注释来测量方法度量。因为它不适用于任意方法;我在 spring 配置中明确添加了 @TimedAspect 的配置。已经参考这篇文章以获得精确的配置注意:已经尝试为此添加一个单独的配置类,以及将 TimedAspect bean 作为我现有配置 bean 的一部分

如何使用弹簧靴2和千分尺测量服务方法

然而,不幸的是它不起作用。Bean 已注册,并且从配置类调用在启动时成功通过。调试的时候发现的。但是,@Around 中的代码似乎永远不会执行。不会抛出任何错误;并且我能够在 /metrics 和 /prometheus 端点上查看默认的“系统”指标。

注意:这是在通过执行业务流多次调用“方法”之后。我知道如果根本没有调用该方法,它可能不会出现在指标中

版本:弹簧靴 2.1.1、弹簧 5.3、千分尺 1.1.4、执行器 2.1

尝试了以下帖子的所有内容:

如何使用弹簧靴2和千分尺测量服务方法

https://github.com/izeye/sample-micrometer-spring-boot/tree/timed-annotation

https://github.com/micrometer-metrics/micrometer/issues/361

更新:因此,问题似乎仅在 Timed 位于抽象方法上时才出现,该方法通过另一种方法调用。能够通过一个简单的例子重现它。请参阅@Timed("say_hello_example") 注释。当我点击 prometheus 端点时,它只会被忽略并且不会出现。

代码:抽象类

public abstract class AbstractUtil {
    public abstract void sayhello();

    public void sayhellowithtimed(String passedVar) {
        System.out.println("Passed var =>"+passedVar);
        System.out.println("Calling abstract sayhello....");
        sayhello();

    }
}
Run Code Online (Sandbox Code Playgroud)

实现类

@Component
@Scope("prototype")
public class ExampleUtil extends AbstractUtil  {

    public static final String HELLO = "HELLO";

    @Timed("dirwatcher_handler")
    public void handleDirectoryWatcherChange(WatchEvent event){ …
Run Code Online (Sandbox Code Playgroud)

aspectj spring-boot prometheus micrometer

7
推荐指数
1
解决办法
6537
查看次数

为什么自调用不适用于 Spring 代理(例如使用 AOP)?

请解释一下,为什么在目标上执行代理上的自调用而不是代理?如果是故意的,那又是为什么呢?如果通过子类创建代理,则可以在每次方法调用之前执行一些代码,即使在自调用时也是如此。我试过了,我有自我调用的代理

public class DummyPrinter {
    public void print1() {
        System.out.println("print1");
    }

    public void print2() {
        System.out.println("print2");
    }

    public void printBoth() {
        print1();
        print2();
    }
}
Run Code Online (Sandbox Code Playgroud)
public class PrinterProxy extends DummyPrinter {
    @Override
    public void print1() {
        System.out.println("Before print1");
        super.print1();
    }

    @Override
    public void print2() {
        System.out.println("Before print2");
        super.print2();
    }

    @Override
    public void printBoth() {
        System.out.println("Before print both");
        super.printBoth();
    }
}
Run Code Online (Sandbox Code Playgroud)
public class Main {
    public static void main(String[] args) {
        DummyPrinter p = new PrinterProxy();
        p.printBoth();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Before …
Run Code Online (Sandbox Code Playgroud)

proxy spring spring-aop

7
推荐指数
1
解决办法
2180
查看次数

AspectJ 方面排序

我有两个切入点相同的方面类,但建议不同。我需要先执行一个,然后再执行另一个方面。我不能使用 Spring "@Ordered" 注释,因为我使用的是纯 aspectJ。

java aop aspectj

6
推荐指数
1
解决办法
2115
查看次数

AspectJ 的集成测试

我正在尝试为自定义方面编写集成测试。这是方面类代码段。

@Aspect
@Component
public class SampleAspect {

    private static Logger log = LoggerFactory.getLogger(SampleAspect.class);

   private int count;

   public int getCount(){
      return count;
   }

    public void setCount(){
      this.count= count;
    }


    @Around("execution(* org.springframework.data.mongodb.core.MongoOperations.*(..)) || execution(* org.springframework.web.client.RestOperations.*(..))")
    public Object intercept(final ProceedingJoinPoint point) throws Throwable {
        logger.info("invoked Cutom aspect");
         setCount(1);
         return point.proceed();

    }

}
Run Code Online (Sandbox Code Playgroud)

因此,只要关节点与切入点匹配,上述方面就会拦截。它的工作正常。但我的问题是如何执行集成测试。

我所做的是在 Aspect 中创建了用于跟踪的属性“count”,并在我的 Junit 中对其进行了断言。我不确定这是否很好,或者是否有更好的方法对方面进行集成测试。

这是我所做的 Junit 的片段。我以糟糕的方式呈现,但我希望它对我为集成测试所做的工作是不可理解的。

@Test
public void testSamepleAspect(){
   sampleAspect.intercept(mockJointPoint);
   Assert.assertEquals(simpleAspect.getCount(),1);
}
Run Code Online (Sandbox Code Playgroud)

java junit integration-testing aspectj mockito

6
推荐指数
1
解决办法
4587
查看次数

使用AspectJ模拟接口和方法的注释继承

人们经常会问AspectJ这样的问题,所以我想在以后可以轻松链接的地方回答.

我有这个标记注释:

package de.scrum_master.app;

import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface Marker {}
Run Code Online (Sandbox Code Playgroud)

现在我注释一个接口和/或方法,如下所示:

package de.scrum_master.app;

@Marker
public interface MyInterface {
  void one();
  @Marker void two();
}
Run Code Online (Sandbox Code Playgroud)

这是一个小驱动程序应用程序,它也实现了接口:

package de.scrum_master.app;

public class Application implements MyInterface {
  @Override
  public void one() {}

  @Override
  public void two() {}

  public static void main(String[] args) {
    Application application = new Application();
    application.one();
    application.two();
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我定义这个方面时,我希望它被触发

  • 为每个构造函数执行带注释的类和
  • 每次执行带注释的方法.
package de.scrum_master.aspect;

import de.scrum_master.app.Marker;

public aspect MarkerAnnotationInterceptor {
  after() : execution((@Marker *).new(..)) && …
Run Code Online (Sandbox Code Playgroud)

java inheritance annotations aspectj

6
推荐指数
1
解决办法
2109
查看次数

Axis2:org.apache.axis2.classloader.BeanInfoCache.getCachedBeanInfo中的线程被阻塞

Axis2版本:1.7.1和WLS 12.1.3

在高负载下,发现许多线程处于阻塞状态,它们执行以下操作:

[ACTIVE] ExecuteThread: '10' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon prio=3 tid=0x0000000109b4b800 nid=0x72 waiting for monitor entry [0xffffffff4b0fc000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:278)
    at com.sun.beans.finder.ClassFinder.findClass(ClassFinder.java:67)
    at com.sun.beans.finder.ClassFinder.findClass(ClassFinder.java:110)
    at java.beans.Introspector.findCustomizerClass(Introspector.java:1245)
    at java.beans.Introspector.getTargetBeanDescriptor(Introspector.java:1239)
    at java.beans.Introspector.getBeanInfo(Introspector.java:415)
    at java.beans.Introspector.getBeanInfo(Introspector.java:252)
    at java.beans.Introspector.getBeanInfo(Introspector.java:214)
    at org.apache.axis2.classloader.BeanInfoCache.getCachedBeanInfo(BeanInfoCache.java:127)
    at org.apache.axis2.databinding.utils.BeanUtil.getBeanInfo(BeanUtil.java:116)
    at org.apache.axis2.databinding.utils.BeanUtil.getPropertyQnameList(BeanUtil.java:162)
    at org.apache.axis2.databinding.utils.BeanUtil.getPullParser(BeanUtil.java:88)
    at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.processProperties(ADBXMLStreamReaderImpl.java:989)
    at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.next(ADBXMLStreamReaderImpl.java:848)
    at org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl.next(ADBXMLStreamReaderImpl.java:851)
    at org.apache.axis2.util.StreamWrapper.next(StreamWrapper.java:71)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.parserNext(StAXOMBuilder.java:663)
    at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:181)
    at org.apache.axiom.om.impl.common.AxiomContainerSupport.ajc$interMethod$org_apache_axiom_om_impl_common_AxiomContainerSupport$org_apache_axiom_om_impl_intf_AxiomContainer$build(AxiomContainerSupport.aj:176)
    at org.apache.axiom.om.impl.llom.OMElementImpl.build(OMElementImpl.java:1)
    at org.apache.axiom.core.CoreElementSupport.ajc$interMethod$org_apache_axiom_core_CoreElementSupport$org_apache_axiom_core_CoreElement$beforeDetach(CoreElementSupport.aj:28)
    at org.apache.axiom.om.impl.llom.OMElementImpl.ajc$interMethodDispatch2$org_apache_axiom_core$beforeDetach(OMElementImpl.java:1)
    at org.apache.axiom.core.CoreChildNodeSupport.ajc$interMethodDispatch1$org_apache_axiom_core_CoreChildNodeSupport$org_apache_axiom_core_CoreChildNode$beforeDetach(CoreChildNodeSupport.aj)
    at org.apache.axiom.core.CoreChildNodeSupport.ajc$interMethod$org_apache_axiom_core_CoreChildNodeSupport$org_apache_axiom_core_CoreChildNode$internalDetach(CoreChildNodeSupport.aj:205)
    at org.apache.axiom.om.impl.llom.OMNodeImpl.ajc$interMethodDispatch2$org_apache_axiom_core$internalDetach(OMNodeImpl.java:1)
    at org.apache.axiom.core.CoreChildNodeSupport.ajc$interMethodDispatch1$org_apache_axiom_core_CoreChildNodeSupport$org_apache_axiom_core_CoreChildNode$internalDetach(CoreChildNodeSupport.aj)
    at …
Run Code Online (Sandbox Code Playgroud)

java multithreading axis2

6
推荐指数
0
解决办法
106
查看次数