spring之AOP切面不生效!!!!!原因在这
首先配置好切面代码 打印日志
package com.rfca.aop;import com.fasterxml.jackson.databind.ObjectMapper;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;@Component
@Aspect
@Lazy(false)
public class Logaop {private Logger logger = LoggerFactory.getLogger(Logaop.class);// private final static String intfName = "Activity/starFireOrderDetailSyn";/*** 定义切入点:对要拦截的方法进行定义与限制,如包、类** 1、execution(public * *(..)) 任意的公共方法* 2、execution(* set*(..)) 以set开头的所有的方法* 3、execution(* com.lingyejun.annotation.LoggerApply.*(..))com.lingyejun.annotation.LoggerApply这个类里的所有的方法* 4、execution(* com.lingyejun.annotation.*.*(..))com.lingyejun.annotation包下的所有的类的所有的方法* 5、execution(* com.lingyejun.annotation..*.*(..))com.lingyejun.annotation包及子包下所有的类的所有的方法* 6、execution(* com.lingyejun.annotation..*.*(String,?,Long)) com.lingyejun.annotation包及子包下所有的类的有三个参数,第一个参数为String类型,第二个参数为任意类型,第三个参数为Long类型的方法* 7、execution(@annotation(com.lingyejun.annotation.Lingyejun))*/@Pointcut("execution(* com.rfca.newcontroller..*.*(..))")private void cutMethod() {}/*** 后置通知:在目标方法执行后调用,若目标方法出现异常,则不执行 后置通知完成计件*/@Around("cutMethod()")public Object myLogger(ProceedingJoinPoint pjp) throws Throwable {long l = System.currentTimeMillis();//使用ServletRequestAttributes请求上下文获取方法更多ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();String className = pjp.getSignature().getDeclaringTypeName();String methodName = pjp.getSignature().getName();//使用数组来获取参数Object[] array = pjp.getArgs();ObjectMapper mapper = new ObjectMapper();//执行函数前打印日志logger.info("调用前:{}:{},传递的参数为:{}", className, methodName, mapper.writeValueAsString(array));logger.info("URL:{}", request.getRequestURL().toString());logger.info("IP地址:{}", request.getRemoteAddr());//调用整个目标函数执行Object obj = pjp.proceed();//执行函数后打印日志logger.info("调用后:{}:{},返回值为:{}", className, methodName, mapper.writeValueAsString(obj));logger.info("耗时:{}ms", System.currentTimeMillis() - l);return obj;}}
重点
需要在扫描controller的那个xml中配置 <aop:aspectj-autoproxy proxy-target-class=“true”/> 有时候配置到applicationContext.xml中是不生效的,
因为 切面类和 被代理的类都要由spring 或者springMVC管理
只有 Spring 生成的对象才有 AOP 功能,因为 Spring 生成的代理对象才有 AOP 功能。
切入的类和被切入的类必须是被spring管理的(springIOC),如果是自己new 出来的,切入无效。
而且所对应的切入方法不能是static 修饰的
可能是springmvc的bug吧。你把
aop:aspectj-autoproxy/
放到DispatcherServlet所对应的**-servlet.xml配置文件中,就可以了。
项目配置如下就可以生效了
结果
spring之AOP切面不生效!!!!!原因在这相关推荐
- Spring MVC AOP切面失效原因与处理
Spring MVC AOP切面失效原因与处理 问题概述 AOP的两类实现 解决方案 方法一:用Autowired 注入自身的实例 方法二:从Spring上下文获取增强后的实例引用 方法三: 利用Ao ...
- spring同类调用事务不生效-原因及三种解决方式
spring提供的声明式事务注解@Transactional,极大的方便了开发者管理事务,无需手动编写开启.提交.回滚事务的代码. 但是也带来了一些隐患,如果注解使用不当,可能导致事务不生效,最终导致 ...
- 【Spring】注解(AOP)不生效原因分析以及解决方案
一 问题 我们在使用spring的注解时,稍不注意就很有可能会遇到注解没有生效的情况,比如下面这段代码,在发生类内调用时就出现了问题, import org.springframework.stere ...
- Spring中AOP切面编程学习笔记
注解方式实现aop我们主要分为如下几个步骤: 1.在切面类(为切点服务的类)前用@Aspect注释修饰,声明为一个切面类. 2.用@Pointcut注释声明一个切点,目的是为了告诉切面,谁是它的服务对 ...
- [原创]java WEB学习笔记107:Spring学习---AOP切面的优先级,重用切点表达式
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring自定义AOP切面
切面 切面需要实现PointcutAdvisor接口,包含切点和通知. package com.morris.spring.aop;import org.aopalliance.aop.Advice; ...
- Spring的AOP切面编程
语言苍白无力,我们直接代码说话 package com.example.demo.aspect; import org.springframework.stereotype.Component; @C ...
- Java手写Spring的AOP(切面织入)小Demo--盲僧代理击飞 亚索接大实例
在学习Spring的过程中总会很迷茫,打个@Aspect注解切面功能就有了,只要脱离了框架感觉自己还是什么都没会,所以自己猜了一下切面的思路,大概写了个小Demo,欢迎交流. 涉及知识:JDK动态代理 ...
- Spring的AOP实现
Spring的AOP切面,通过代理的方式来实现切面 静态代理:是使用AspectJ:即在编译阶段生成AOP代理类,也成为编译时增强. 动态代理:使用Spring AOP. 1.使用AspectJ的编译 ...
最新文章
- webClient 利用代理连接Rss资源
- tensorfllow MNIST机器学习入门
- 新一代(New Generation)测试框架TestNG
- 《从零开始学Swift》学习笔记(Day 6)——哎呀常量和变量都该什么时候用啊?...
- 不想工作就想创业?我劝你看完这档综艺再决定
- python ljust 库_Python知识精解:str ljust()方法
- 非整数倍数数据位宽转换8to12
- 算法移植优化(四)c++11 多线程
- Oracle传统基本体系结构初步介绍(2)
- 请谨慎设置WinForm控件DataGridView列的AutoSizeMode属性
- Wpf ScrollBar自定义样式
- OpenProj打开不了或者提示”Failed to load Java VM Library”的错误的解决方案
- 2020年高效搬砖必备的IDEA插件(附安装包)
- gyb优化事项(2)
- 2016年计划,2015年总结
- DBeaver 环境配置
- KVM虚拟化,超详细
- 视频教程-spring cloud与spring boot实战视频教程-Java
- SMETA验厂辅导,SEDEX(Smeta)验厂系统介绍及验厂结果查询
- 天道酬勤系列之C++ 常量介绍
热门文章
- PXE系列之一:PXE环境搭建
- linux xxd命令
- MySQL:索引原理
- 机器学习 数据挖掘 统计学 深度学习
- nodejs+vue 智慧餐厅点餐餐桌预订系统
- vscode运行cpp文件:检测到 #include 错误。请更新 includePath。已为此翻译单元(E:\C++ Code\test1\test1\test1.cpp)禁用波形曲线。
- 输入你的密码来连接到_查看电脑已连接的WIFI密码
- 基于SSM技术的医院在线预约诊疗系统设计与实现 毕业设计-附源码011130
- mybatis-plus使用this.saveBatch报java.lang.NullPointer空指针异常
- 定义一个名为Cylinder类表示圆柱,它继承Circle类