Плетение времени загрузки Spring Boot AOP

Не уверен, что происходит не так, но AOP просто не работает в моей настройке с весенней загрузкой (v1.1.6).

@Configuration
@ComponentScan
@EnableJpaRepositories
@EnableTransactionManagement
@EnableAutoConfiguration
@EnableCaching
@EnableLoadTimeWeaving
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

И в классе аспектов

@Aspect
public class MyAspect {
  @AfterReturning(pointcut = "execution(private * com.myapp.service.MyService.test(..)) && args(str1,str2)", argNames = "str1,str2")
    public void advice(String str1, String str2) throws IOException {
        System.out.println("Advising after returning");
    }
}

В классе обслуживания, который нуждается в совете

@Service
public class MyService {
  public void test(String str1, String str2) throws IOException {
    System.out.println("Test method in service");
    //rest of the implementation
  }
}

У меня также есть META-INF/aop.xml, например

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver>
        <!-- only weave classes in our application-specific packages -->
        <include within="com.myapp.*"/>
    </weaver>

    <aspects>
        <!-- weave in just this aspect -->
        <aspect name="com.myapp.aspect.MyAspect"/>
    </aspects>

</aspectj>

Когда я запускаю приложение с -javaagent:path/to/spring-instrument-4.1.0.RELEASE.jar

Я получаю это сообщение в консоли

2014-09-05 08:42:12.500  INFO 65053 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
[AppClassLoader@58644d46] warning javax.* types are not being woven because the weaver option '-Xset:weaveJavaxPackages=true' has not been specified
2014-09-05 08:42:13.114  INFO 65053 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2014-09-05 08:42:13.156  INFO 65053 --- [           main] o.s.b.a.e.jmx.EndpointMBeanExporter      : Registering beans for JMX exposure on startup
[AppClassLoader@58644d46] error can't determine implemented interfaces of missing type org.springframework.security.config.http.SessionCreationPolicy
when weaving type org.springframework.boot.actuate.autoconfigure.ManagementServerProperties$Security
when weaving classes 
when weaving 
 [Xlint:cantFindType]
[AppClassLoader@58644d46] error can't determine implemented interfaces of missing type org.springframework.security.config.http.SessionCreationPolicy
when weaving type org.springframework.boot.actuate.autoconfigure.ManagementServerProperties$Security
when weaving classes 
when weaving 
 [Xlint:cantFindType]

Однако с советом ничего не происходит. Это не сработает.

Я делаю что-то неправильно?


person sat    schedule 05.09.2014    source источник


Ответы (3)


Чтобы рекомендовать частные методы, вам нужно использовать привилегированный аспект:

public privileged aspect MyAspect {
    // ...
}

Но документация AspectJ говорит:

Ограничения. Привилегированные аспекты не поддерживаются стилем аннотации.

Поэтому, пожалуйста, используйте собственный синтаксис, а не стиль @AspectJ. Прежде чем вы это сделаете, проверьте, работают ли непривилегированные аспекты в стиле аннотаций с общедоступными методами должным образом, чтобы исключить другие причины, по которым ваши аспекты переплетаются.

person kriegaex    schedule 08.09.2014

У меня такая же проблема. В моем случае мне пришлось аннотировать свой класс аспекта аннотацией @Component.

 @Aspect
 @Component
 public class MyAspect {
     ...
 }

В следующей ссылке есть пример AOP с весенней загрузкой, который мне помог.

https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-aop

person C.L.S    schedule 08.03.2016

Добавьте ниже изменения в свой код, и он должен работать. Не нужно создавать aop.xml. Эти изменения добавят аспект к контейнеру, а также переплетут его.

Прочтите -- Включить Spring AOP или AspectJ

@Configuration
@ComponentScan
@EnableJpaRepositories
@EnableTransactionManagement
@EnableAutoConfiguration
@EnableCaching
@EnableAspectJAutoProxy -- Use this instead of @EnableLoadTimeWeaving

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

@Aspect
 @Component/@Configurable -- Both of them work
 public class MyAspect {
     ...
 }
person nickstack    schedule 04.10.2018