Spring autowired bean for @Aspect aspect is null

后端 未结 9 1062
离开以前
离开以前 2020-11-29 03:42

I have the following spring configuration:





        
相关标签:
9条回答
  • 2020-11-29 04:07
    @Configurable(autowire = Autowire.BY_TYPE)
    

    Add this annotation to your Aspectj class. Then it will be handled by Spring IOC.

    0 讨论(0)
  • 2020-11-29 04:13

    For Spring Boot to use @Autowired with AspectJ I have found the following method. In configuration class add your aspect:

    @Configuration
    @ComponentScan("com.kirillch.eqrul")
    public class AspectConfig {
    
        @Bean
        public EmailAspect theAspect() {
            EmailAspect aspect = Aspects.aspectOf(EmailAspect.class);
            return aspect;
        }
    
    }
    

    Then you can successfully autowire your services in your aspect class:

    @Aspect
    public class EmailAspect {
    
        @Autowired
        EmailService emailService;
    
    0 讨论(0)
  • 2020-11-29 04:14

    I dont have 50 rep to comment on a question so here is another answer relating to @ Jitendra Vispute answer. The official Spring doc mentions:

    You may register aspect classes as regular beans in your Spring XML configuration, or autodetect them through classpath scanning - just like any other Spring-managed bean. However, note that the @Aspect annotation is not sufficient for autodetection in the classpath: For that purpose, you need to add a separate @Component annotation (or alternatively a custom stereotype annotation that qualifies, as per the rules of Spring’s component scanner).Source: Spring '4.1.7.Release' documentation.

    This would mean that adding a @Component annotation and adding the @ComponentScan on your Configuration would make @Jitendra Vispute's example work. For the spring boot aop sample it worked, though I did not mess around with context refreshing.Spring boot aop sample:

    Application:

    package sample.aop;
    @SpringBootApplication
    public class SampleAopApplication implements CommandLineRunner {
        // Simple example shows how an application can spy on itself with AOP
        @Autowired
        private HelloWorldService helloWorldService;
        @Override
        public void run(String... args) {
            System.out.println(this.helloWorldService.getHelloMessage());
        }
        public static void main(String[] args) throws Exception {
            SpringApplication.run(SampleAopApplication.class, args);
        }
    }
    

    The application should also run as plain Spring Framework application with the following annotations instead of @SpringBootApplication:

    • @Configuration
    • @EnableAspectJAutoProxy
    • @ComponentScan

    and an AnnotationConfigApplicationContext instead of SpringApplication.

    Service:

    package sample.aop.service;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    @Component
    public class HelloWorldService {
        @Value("${name:World}")
        private String name;
        public String getHelloMessage() {
            return "Hello " + this.name;
        }
    }
    

    Monitor Aspect:

    package sample.aop.monitor;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.stereotype.Component;
    @Aspect
    @Component
    public class ServiceMonitor {
        @AfterReturning("execution(* sample..*Service.*(..))")
        public void logServiceAccess(JoinPoint joinPoint) {
            System.out.println("Completed: " + joinPoint);
        }
    }
    
    0 讨论(0)
提交回复
热议问题