Spring------SpringAOP的@Aspect注解不起作用的问题

在学习用SpringBoot时用注解的方式配置SpringAOP发现并没有起到作用,最后在网上找到了问题所在,在此记录一下。

参考自:https://stackoverflow.com/questions/9633840/spring-autowired-bean-for-aspect-aspect-is-null/11445798#11445798

 这是项目的目录结构:

Spring------SpringAOP的@Aspect注解不起作用的问题_第1张图片

 LogAspect.java

package com.vmars.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAspect {
    private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);

    @Before(value = "execution(* com.vmars.controller.IndexController.*(..))")
    public void beforeMethod(JoinPoint joinPoint) {

        StringBuilder sb = new StringBuilder();
        for (Object arg : joinPoint.getArgs()) {
            sb.append("arg: " + arg.toString() + " | ");
        }

        logger.info("Before Method : " + sb.toString());
    }

    @After(value = "execution(* com.vmars.controller.IndexController.*(..))")
    public void afterMethod(JoinPoint joinPoint) {
        logger.info("After Method.");
    }
}

IndexControl.java

package com.vmars.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

@Controller
public class IndexController {

    private static final Logger logger = LoggerFactory.getLogger(IndexController.class);


    @RequestMapping(path = {"/"})
    @ResponseBody
    public String index() {

        logger.info("Visit Index Page");

        return "Hello vMars";
    }

}

1.首先排查自己的pom.xml,观察是不是把所对应需要的包都导进去了。



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        1.4.2.RELEASE
         
    
    com.vmars
    demo
    0.0.1-SNAPSHOT
    demo
    Demo project for Spring Boot

    
        1.8
    

    

        
        
            org.aspectj
            aspectjrt
        

        
            org.aspectj
            aspectjweaver
        

        
            org.springframework
            spring-aop
            4.3.14.RELEASE
        

        
            cglib
            cglib
            2.2.2
        

        
            org.springframework.boot
            spring-boot-starter-aop
        

        




        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
            org.springframework.boot
            spring-boot-starter-velocity
        

        
            org.springframework.boot
            spring-boot-test
            test
        

    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    


2.如果所需要的包都已导入,但还是不起作用观察是否写对格式

这里注意除了@Aspect注解外,还要加上@Component注解

Spring------SpringAOP的@Aspect注解不起作用的问题_第2张图片

在官方文档中有写到:(文章地址)

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).

有道翻译:

您可以将方面类注册为Spring XML配置中的常规bean,或者通过类路径扫描自动检测它们——就像任何其他Spring管理的bean一样。但是,请注意@Aspect注释并不足以在类路径中进行自动检测:为此,您需要添加一个单独的@Component注释(或者根据Spring组件扫描器的规则,添加一个符合条件的自定义原型注释)。

 

 

你可能感兴趣的:(Spring,Java,SpringAOP)