我制作了一个小应用程序来检查一些事情。这是代码(假设所有文件都在同一个包中)
@Configuration
@ComponentScan
@EnableAspectJAutoProxy
public class Config {
}
@Component
public class SomeBean {
public SomeBean() {
System.out.println("Creating SomeBean...");
}
public String someAspectedMethod() {
return "some string";
}
}
@Aspect
@Component // note this
public class SomeAspect {
public SomeAspect() {
System.out.println("Creating SomeAspect...");
}
@Around("execution(String SomeBean.someAspectedMethod())")
public Object methodAdvice(ProceedingJoinPoint joinPoint) {
System.out.println("Running methodAdvice()..."); // never gets printed
Object object;
try {
object = joinPoint.proceed();
} catch (Throwable e) {
throw new RuntimeException(e);
}
return object;
}
}
public class App {
public static void main(String[] args) {
var context = new AnnotationConfigApplicationContext(Config.class);
SomeBean someBean = context.getBean(SomeBean.class);
String returnedVal = someBean.someAspectedMethod();
System.out.println(returnedVal);
System.out.println(returnedVal.getClass());
}
}
控制台输出:
Creating SomeAspect...
Creating SomeBean...
Running methodAspect()...
some string
class java.lang.String
我注意到,一旦删除
@Component
注释,该方面就不再应用
@Aspect
// @Component
public class SomeAspect {
控制台输出:
Creating SomeBean...
some string
class java.lang.String
这就引出了一个问题:为什么
@Aspect
不是一个@Component
(刻板印象注释),就像@Service
、@Repository
和其他一些一样?如果 @Component
对于方面类来说不是必需的,那么为什么缺少它会有效地禁用我的方面?
这没有回答我的问题
@Aspect
是 AspectJ 库的一部分,AspectJ 库是 Spring 附带的独立库,因此 Spring 无法更改 @Aspect
注解源代码来添加元 @Component
(spring 无法使@Aspect
换句话说就是刻板印象)
@Aspect
是aspectj注释的一部分:org.aspectj.lang.annotation.Aspect
对于
如果方面类不需要@Component
@Component
只是通过组件扫描在应用程序上下文中注册方面(@ComponentScan
,您添加到Config
类让Spring搜索构造型注释并将它们注册到应用程序上下文中)