最近在学习了springboot,但是遇到了这样一个问题,我搭建完架构后,想加上一个请求日志打印和响应日志打印,这无疑就用到了spring的AOP机制了,但是我配置完了之后,确是没有生效。我也百度了,但是看配置都和我差不多,但是我的却不生效,这令我百思不得其解,希望大家帮我看看。我的代码如下:/**
 * 这配置AOP的代码
 */
@Aspect
@Component
public class HttpAspect{    private Logger logger = LoggerFactory.getLogger(HttpAspect.class);    public HttpAspect(){
        logger.info("=============初始化AOP===============");
    }    @Pointcut("execution(public * com.springboot.mybatis.controller.*.*(..))")
    public void log(){
    }    /**
     *
     * 获取请求的信息
     */
    @Before("log()")
    public void doBefore(JoinPoint joinPoint){        ServletRequestAttributes arrt = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = arrt.getRequest();
        logger.info("请求地址 url:{}",request.getRequestURL());
        logger.info("请求方式 :{}",request.getMethod());
        logger.info("请求者ip地址:{}",request.getRemoteAddr());
        logger.info("访问的类与方法:{}",joinPoint.getSignature().getDeclaringTypeName()+"."
                +joinPoint.getSignature().getName());
        logger.info("请求参数:{}",joinPoint.getArgs());
    }    /**
     * 获取响应的信息
     * @param object
     */
    @AfterReturning(returning = "object", argNames = "object", pointcut = "log()")
    public void doAfterReturning(Object object){        logger.info("响应信息如下:");
        logger.info("response:{}",object.toString());
    }
}
/**
 * 这是启动应用的代码
 */
@SpringBootApplication(scanBasePackages = "com")
@MapperScan(basePackages = "com.springboot.mybatis.dao")
public class SpringbootMybatisApplication { public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisApplication.class, args);
}
}
#这是我的配置文件
server:
  port: 8080
  context-path: /sbmspring:
  profiles:
    active: dev
#数据库配置
  datasource:
    url: jdbc:mysql://localhost:3306/testaclec?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
  #页面跳转配置
  mvc:
    view:
      prefix: /view/
      suffix: .html#mybatis 配置
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.springboot.mybatis.model#分页插件配置
pagehelper:
    helperDialect: mysql
    reasonable: true
    supportMethodsArguments: true
    params: count=countSqllogging:
  config: classpath:logback-spring.xml

解决方案 »

  1.   

    你这个可能运行Spring boot 的@SpringBootApplicatioin里的@ComponentScan(excludeFilters = {
    @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
    @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) 他是不会定义你自己的扫描包的,应该把你的你的@SpringBootApplicatioin运行的类放在上层的 例如:com.kkk.clm 放在 com.kkk里面就能扫描到了
      

  2.   

    @会飞的fish 你的意思是改成@SpringBootApplication(scanBasePackages = "com.springboot.mybatis") 这样的了,试了不行哦!
      

  3.   

    不是改那个,那个自定义包,他是不会去扫描的
    /**
     * 这是启动应用的代码
     */
    @SpringBootApplication(scanBasePackages = "com")
    @MapperScan(basePackages = "com.springboot.mybatis.dao")
    public class SpringbootMybatisApplication {
     
        public static void main(String[] args) {
            SpringApplication.run(SpringbootMybatisApplication.class, args);
        }
    }
    @SpringBootApplication这个注解不会扫描自定义包的,无论你写很多包名都是不行的,@MapperScan(basePackages = "com.springboot.mybatis.dao")这个注解在这面不起作用的直接去掉,直接把这个类移到com目录下,就可以了
      

  4.   

    @EnableEurekaClient
    @SpringBootApplication
    @ComponentScan("com.xxx.*") //这里要能扫描到你注解的HttpAspect 才行
    public class PheryWebApplication
    {  public static void main(String[] args)
      {
        SpringApplication.run(PheryWebApplication.class, args);
      }
    }你把你的HttpAspect类随便注入其他类中,看是不是能注入,我的不能,我就加了扫描包,可以注入了, 注解也生效了
      

  5.   

    @会飞的fish   多谢你给的灵感
      

  6.   

    @ComponentScan(basePackages="com.zcw")
    @Component//这个必不可缺,否则aop不生效
    @Aspect//开启切面Aop//不能只使用@Component,因为只使用此注解启动会报aop切面类注入容器失败(我这里是这样),
    //需加上@ComponentScan(basePackages="XXX.XXX.XXX")扫描具体包才能注入成功
      

  7.   


    我按照7楼的办法,可以使用了,没有加入basePackage.
      

  8.   

    配置类或者启动类加这个注解 @EnableAspectJAutoProxy