时间:2021-05-19
前言
最近项目已经开发完成,但发现需要加用户操作日志,如果返回去加也不太现实,所以使用springAOP来完成比较合适。下面来一起看看详细的介绍:
注解工具类:
切面类:
@Aspectpublic class MyInterceptor { @Pointcut("execution(** com.luchao.spring.test3.service.impl.*.*(..))") private void anyMethod(){}//定义一个切入点 @Before("anyMethod() && args(name)") public void doAccessCheck(String name){ System.out.println(name); System.out.println("前置通知"); } @AfterReturning("anyMethod()") public void doAfter(){ System.out.println("后置通知"); } @After("anyMethod()") public void after(JoinPoint point){ System.out.println("最终通知"); } @AfterThrowing("anyMethod()") public void doAfterThrow(){ System.out.println("例外通知"); } @Around("anyMethod()") public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{ Signature signature = pjp.getSignature(); MethodSignature methodSignature = (MethodSignature)signature; Method targetMethod = methodSignature.getMethod();// System.out.println("classname:" + targetMethod.getDeclaringClass().getName());// System.out.println("superclass:" + targetMethod.getDeclaringClass().getSuperclass().getName());// System.out.println("isinterface:" + targetMethod.getDeclaringClass().isInterface());// System.out.println("target:" + pjp.getTarget().getClass().getName());// System.out.println("proxy:" + pjp.getThis().getClass().getName());// System.out.println("method:" + targetMethod.getName()); Class[] parameterTypes = new Class[pjp.getArgs().length]; Object[] args = pjp.getArgs(); for(int i=0; i<args.length; i++) { if(args[i] != null) { parameterTypes[i] = args[i].getClass(); }else { parameterTypes[i] = null; } } //获取代理方法对象 String methodName = pjp.getSignature().getName(); Method method = pjp.getSignature().getDeclaringType().getMethod(methodName, parameterTypes); if(method.isAnnotationPresent(LogAnnotation.class)){ System.out.println("存在1"); } //获取实际方法对象,可以获取方法注解等 Method realMethod = pjp.getTarget().getClass().getDeclaredMethod(signature.getName(), targetMethod.getParameterTypes()); if(realMethod.isAnnotationPresent(LogAnnotation.class)){ realMethod.getAnnotation(LogAnnotation.class).operateDescribe(); System.out.println("存在2"); } System.out.println("进入环绕通知"); Object object = pjp.proceed();//执行该方法 System.out.println("退出方法"); return object; }}配置类:
@Configurable@EnableAspectJAutoProxy@ComponentScan(basePackages = "com.luchao.spring.test3")public class test3Config { @Bean public MyInterceptor myInterceptor(){ return new MyInterceptor(); } @Bean public EncoreableIntroducer encoreableIntroducer(){ return new EncoreableIntroducer(); }}服务类:
@Componentpublic class PersonServiceBean implements PersonServer { /** * 保存方法 * @param name */ @LogAnnotation(operateModelNm = "测试方法", operateFuncNm = "保存方法") public void save(String name) { System.out.println("我是save方法"); } /** * 更新方法 * @param name * @param id */ public void update(String name, Integer id) { System.out.println("我是update()方法"); } /** * 获取方法 * @param id * @return */ public String getPersonName(Integer id) { System.out.println("我是getPersonName()方法"); return "xxx"; }}测试方法:
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = test3Config.class)public class SpringAOPTest { @Autowired private PersonServer personServer; @Test public void inteceptorTest(){ Encoreable encoreable = (Encoreable)personServer; encoreable.performEncore(); personServer.save("test"); }}在springAOP切面中使用的是代理,所以直接获取的是代理对象,不能获取真实对象的一些信息,如注解等。
//获取代理方法对象 String methodName = pjp.getSignature().getName(); Method method = pjp.getSignature().getDeclaringType().getMethod(methodName, parameterTypes);如果要获取真实对象,获取注解的信息,可以方便我们进行判断记录。
//获取实际方法对象,可以获取方法注解等 Method realMethod = pjp.getTarget().getClass().getDeclaredMethod(signature.getName(), targetMethod.getParameterTypes());这样就完成了一个简单的操作日志记录demo。另外,如果不是讲某个方法设置切点,可以ant风格的切点切入方式,设置多个或所有方法。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
logging日志模块:是用来记录日志的模块,一般记录用户在软件中的操作 使用方法:模板直接拿来用,手动修改#logging的配置信息(模板)import
这篇文章主要介绍了Spring框架实现AOP添加日志记录功能过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以
系统日志管理。日志就是记载和记录系统中发生的任何一个和数据相关的操作文件,此套管理平台中日志管理功能一方面可以记录用户的所有操作,做到有据可查,有理可依,同时也
二进制日志的文件的作用mysql二进制日志文件用来记录所有用户对数据库操作,即记录用户对数据库操作的sql语句。如果有此文件,当数据库发生意外时,可以通过此文件
简介Binlog日志,即二进制日志文件,用于记录用户对数据库操作的SQL语句信息,当发生数据误删除的时候我们可以通过binlog日志来还原已经删除的数据,还原数