Spring Aspect не работает, если сначала создается экземпляр компонента - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть простой аспект, как показано ниже

@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(); все еще можно заставить работать. Я предполагаю, что когда весна инициирует Бин, она может создать прокси-сервер AOP AppConfig, а когда я инициирую бин, это как-то мешает этому процессу. Что такое способ пружинного / пружинного ботинка?

Ниже 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>

Edit-1

До публикации я уже добавил @EnableAspectJAutoProxy, но это не помогло.

Репозиторий git для решения проблемы находится ниже

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

1 Ответ

0 голосов
/ 29 апреля 2018

Ваш компонент AppConfig (который вы правильно инициализируете с помощью метода, помеченного @Bean) должен быть заключен в прокси, который затем выполняет логику аспекта.

Вы должны включить это поведение, добавив аннотацию @EnableAspectJAutoProxy в свой класс WsConfig.

Кстати: использовать

абсолютно правильно
AppConfig config = config();

в вашем addInterceptors методе. Spring вернет компонент, созданный методом config.

...