@Aspect 必须是 @Component 吗?

问题描述 投票:0回答:1

我制作了一个小应用程序来检查一些事情。这是代码(假设所有文件都在同一个包中)

@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
对于方面类来说不是必需的,那么为什么缺少它会有效地禁用我的方面?

没有回答我的问题

java spring spring-aop
1个回答
0
投票

@Aspect
是 AspectJ 库的一部分,AspectJ 库是 Spring 附带的独立库,因此 Spring 无法更改
@Aspect
注解源代码来添加元
@Component
(spring 无法使
@Aspect
换句话说就是刻板印象)

@Aspect
是aspectj注释的一部分:
org.aspectj.lang.annotation.Aspect

对于

如果方面类不需要@Component

@Component
只是通过组件扫描在应用程序上下文中注册方面(
@ComponentScan
,您添加到
Config
类让Spring搜索构造型注释并将它们注册到应用程序上下文中)

© www.soinside.com 2019 - 2024. All rights reserved.