如果首先手动实例化bean,则Spring Aspect不起作用

时间:2018-04-29 07:23:50

标签: spring spring-boot aspectj spring-aop

我有一个简单的方面,如下面

@Aspect
public class PersistentAspect {

    @AfterReturning("@annotation(org.aspect.PersistentOperation)")
    public void log(JoinPoint jp) {
        System.out.println("aspect call");
    }

}

和下面的AppConfig

public class AppConfig {

    private Integer num;
    private String text;

    public Integer getNum() {
        return num;
    }

    @PersistentOperation
    public void setNum(Integer num) {

        this.num = num;
    }

    public String getText() {
        return text;
    }

    @PersistentOperation
    public void setText(String text) {

        this.text = text;
    }

}

配置类如下

@EnableWs
@Configuration
public class WsConfig extends WsConfigurerAdapter {

    @Override
    public void addInterceptors(List<EndpointInterceptor> interceptors) {
        AppConfig config = config();
        interceptors.add(new CustomValidatingInterceptor(schema(), null));
    }

    @Bean
    public AppConfig config() {
        AppConfig config = null;
        config = new AppConfig();
        return config;
    }

    @Bean
    public PersistentAspect persistentAspect() {
        PersistentAspect persistentAspect = new PersistentAspect();
        return persistentAspect;
    }
}

如果我在addInterceptors

中使用以下内容
AppConfig config = config();

Aspect不起作用。我有一个明显的解决方案是将代码更改为

AppConfig config = new AppConfig();

现在我想了解的是,是否存在AppConfig config = config();仍然有效的配置。我假设当spring启动Bean时,它可以创建AppConfig的AOP代理,当我启动bean时,它会以某种方式干扰该进程。什么是弹簧/弹簧引导方式处理这个?

以下是pom.xml,所以基本上是最新的Spring 5.0.5

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web-services</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

修改-1

在发布之前,我已经添加了@EnableAspectJAutoProxy,但这没有帮助。

尝试此问题的git repo位于下方

https://github.com/tarunlalwani/spring-aop-so-50084308

1 个答案:

答案 0 :(得分:0)

您的AppConfig bean(使用注释为@Bean的方法正确初始化)需要包装在代理中,然后执行方面逻辑。

您必须通过向WsConfig课程添加@EnableAspectJAutoProxy注释来启用此行为。

顺便说一下:使用

是完全正确的
AppConfig config = config();

在您的addInterceptors方法中。 Spring将返回由config方法创建的bean。