我正在使用Eclipse进行Java项目,其中一些使用Groovy/Spock编写的测试使用了given: when: then:语法.我想用一些颜色突出显示这些关键字.注意:spock插件应该是这样但不起作用.所以我想自己这样做.
我想用自定义@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文档及其示例并没有真正清楚确切的语法以及在什么情况下可能出现的情况.
我正在研究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
我需要使用测微计@Timed 注释来测量方法度量。因为它不适用于任意方法;我在 spring 配置中明确添加了 @TimedAspect 的配置。已经参考这篇文章以获得精确的配置注意:已经尝试为此添加一个单独的配置类,以及将 TimedAspect bean 作为我现有配置 bean 的一部分
然而,不幸的是它不起作用。Bean 已注册,并且从配置类调用在启动时成功通过。调试的时候发现的。但是,@Around 中的代码似乎永远不会执行。不会抛出任何错误;并且我能够在 /metrics 和 /prometheus 端点上查看默认的“系统”指标。
注意:这是在通过执行业务流多次调用“方法”之后。我知道如果根本没有调用该方法,它可能不会出现在指标中
版本:弹簧靴 2.1.1、弹簧 5.3、千分尺 1.1.4、执行器 2.1
尝试了以下帖子的所有内容:
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) 请解释一下,为什么在目标上执行代理上的自调用而不是代理?如果是故意的,那又是为什么呢?如果通过子类创建代理,则可以在每次方法调用之前执行一些代码,即使在自调用时也是如此。我试过了,我有自我调用的代理
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) 我有两个切入点相同的方面类,但建议不同。我需要先执行一个,然后再执行另一个方面。我不能使用 Spring "@Ordered" 注释,因为我使用的是纯 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) 人们经常会问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) 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 ×7
aspectj ×5
aop ×3
annotations ×2
spring ×2
spring-aop ×2
axis2 ×1
eclipse ×1
inheritance ×1
interface ×1
junit ×1
maven ×1
micrometer ×1
mockito ×1
proguard ×1
prometheus ×1
proxy ×1
spock ×1
spring-boot ×1
spring-mvc ×1