Spring 带有自定义注释的 AOP 不工作
Spring AOP with custom annotation not working
我查看了每个 example on stack exchange 和 spring 的示例网站,一切似乎都应该有效。我一定是遗漏了一些简单的东西
我有一个自定义注释,理想情况下我想将其应用于 class 的所有方法(如果 class 被注释)或任何被注释的方法。这是方面、测试和代码:
注释
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({METHOD})
@Retention(RUNTIME)
public @interface Monitor {
String value() default "Monitor";
}
看点
@Aspect
@Component
public class LatencyAspect {
@Autowired
private Logger logger;
@Around("@annotation(Monitor)")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
Object retVal = joinPoint.proceed();
logger.info("logged");
return retVal;
}
}
测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class,classes = {LatencyConfig.class, LatencyTest.ContextConfiguration.class})
@ComponentScan
public class LatencyTest {
final static Logger log = mock(Logger.class);
@Autowired
private SomeClass someClass;
@Test
public void testExample() throws Exception {
someClass.doSomething("foo");
verify(log).info("logged");
}
@EnableAspectJAutoProxy(proxyTargetClass = true)
@Configuration
static class ContextConfiguration {
@Bean
public SomeClass properties() {
return new SomeClass();
}
@Bean
public Logger log() {
return log;
}
}
public static class SomeClass {
@Monitor
@Transient
public String doSomething(String whatever) {
return "done";
}
}
}
结果
Wanted but not invoked:
logger.info("logged");
-> at org.bongiorno.latency.LatencyTest.testExample(LatencyTest.java:74)
Actually, there were zero interactions with this mock.
链接
Spring 没有从 JUnit 测试 class 中获取 @ComponentScan
注释。将注释移动到您的 LatencyConfig
class 或测试本地 LatencyTest.ContextConfiguration
内部配置 class.
我查看了每个 example on stack exchange 和 spring 的示例网站,一切似乎都应该有效。我一定是遗漏了一些简单的东西
我有一个自定义注释,理想情况下我想将其应用于 class 的所有方法(如果 class 被注释)或任何被注释的方法。这是方面、测试和代码:
注释
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({METHOD})
@Retention(RUNTIME)
public @interface Monitor {
String value() default "Monitor";
}
看点
@Aspect
@Component
public class LatencyAspect {
@Autowired
private Logger logger;
@Around("@annotation(Monitor)")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
Object retVal = joinPoint.proceed();
logger.info("logged");
return retVal;
}
}
测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class,classes = {LatencyConfig.class, LatencyTest.ContextConfiguration.class})
@ComponentScan
public class LatencyTest {
final static Logger log = mock(Logger.class);
@Autowired
private SomeClass someClass;
@Test
public void testExample() throws Exception {
someClass.doSomething("foo");
verify(log).info("logged");
}
@EnableAspectJAutoProxy(proxyTargetClass = true)
@Configuration
static class ContextConfiguration {
@Bean
public SomeClass properties() {
return new SomeClass();
}
@Bean
public Logger log() {
return log;
}
}
public static class SomeClass {
@Monitor
@Transient
public String doSomething(String whatever) {
return "done";
}
}
}
结果
Wanted but not invoked:
logger.info("logged");
-> at org.bongiorno.latency.LatencyTest.testExample(LatencyTest.java:74)
Actually, there were zero interactions with this mock.
链接
Spring 没有从 JUnit 测试 class 中获取 @ComponentScan
注释。将注释移动到您的 LatencyConfig
class 或测试本地 LatencyTest.ContextConfiguration
内部配置 class.