web-dev-qa-db-fra.com

Spring AOP fonctionne sans @EnableAspectJAutoProxy?

J'apprends Spring (actuellement son cadre AOP). Même si toutes les sources que j'ai lues disent que pour activer AOP, il faut utiliser @EnableAspectJAutoProxy annotation (ou son équivalent XML) mon code semble fonctionner avec une annotation commentée. Est-ce parce que j'utilise Lombok ou Spring Boot (v. 1.5.9.RELEASE, dépendant de Spring v. 4.3.13.RELEASE)?

Un exemple minimal suit:

build.gradle

buildscript {
    ext {
        springBootVersion = '1.5.9.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'Java'
apply plugin: 'org.springframework.boot'

group = 'lukeg'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter')
    compileOnly('org.projectlombok:lombok')
    compile("org.aspectj:aspectjweaver:1.8.11")
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

ApplicationConfiguration.Java (notez que l'annotation AOP est commentée)

package lukeg;

import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
//@EnableAspectJAutoProxy
public class ApplicationConfiguration {
    @Bean
    TestComponent testComponent() {
        return new TestComponent();
    }
}

LearnApplication.Java

package lukeg;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

@SpringBootApplication
public class LearnApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(LearnApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfiguration.class);
        TestComponent testComponent = context.getBean(TestComponent.class);
        System.out.println(""+testComponent);
    }
}

LoggerHogger.Java

package lukeg;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LoggerHogger {

    @Pointcut("execution(* lukeg*.*.toString(..))")
    public void logToString() {}

    @Before("logToString()")
    public void beforeToString () {
        System.out.println("Before toString");
    }
}

TestComponent.Java

package lukeg;

import lombok.Data;


@Data
public class TestComponent {
}
8
lukeg

Le @SpringBootApplication l'annotation contient le @EnableAutoConfiguration annotation. Cette configuration automatique est l'une des attractions de Spring Boot et simplifie la configuration. La configuration automatique utilise @Conditional annotations de type (comme @ConditionalOnClass et @ConditionalOnProperty) pour analyser le chemin de classe et rechercher les classes clés qui déclenchent le chargement de "modules" comme AOP.

Voici un exemple AopAutoConfiguration.Java

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.Advice;
import org.aspectj.weaver.AnnotatedElement;

@Configuration
@ConditionalOnClass({ EnableAspectJAutoProxy.class, Aspect.class, Advice.class,
    AnnotatedElement.class })
@ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)
public class AopAutoConfiguration {

  @Configuration
  @EnableAspectJAutoProxy(proxyTargetClass = false)
  @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false", matchIfMissing = false)
  public static class JdkDynamicAutoProxyConfiguration {

  }

  @Configuration
  @EnableAspectJAutoProxy(proxyTargetClass = true)
  @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true", matchIfMissing = true)
  public static class CglibAutoProxyConfiguration {

  }

}

Comme vous pouvez le voir, si vous ajoutez l'une des classes AOP ci-dessus à votre chemin de classe (ou propriété), Spring la détectera et se comportera efficacement comme si vous aviez l'annotation @EnableAspectJAutoProxy sur votre classe principale.

Votre projet a un fichier LoggerHogger qui a un @Aspect.

11
Ian Mc