在工作中做项目微服务化,需要把原来老的项目拆分成一个个小的接口对外提供服务。对拆分出来的接口,需要做权限控制与入参,出参,耗时等日志记录。于是做个了切面类,来通过切面对相应方法做记录。
1.首先我们需要引入相应的jar包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> |
2.找一个你需要做切面拦截的接口
例如我想对下图中的testProxy()方法做切面拦截,记录日志信息:
package com.example.demo.service.impl; import java.util.Date; import org.springframework.stereotype.Service; @Servicepublic class TestAspectServiceImpl { |
2.1.1接着开始写切面类
在这里我们对需要控制的接口做了出参和入参进行日志记录:
package com.example.demo.aspect; import java.util.Arrays; import org.aspectj.lang.ProceedingJoinPoint; @Aspect |
execution(* com.example.demo.service.impl..*.*(..))
execution()是最常用的切点函数,其语法如下所示: 整个表达式可以分为五个部分:
1、execution(): 表达式主体。
2、第一个*号:表示返回类型,*号表示所有的类型。
3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.example.demo.service.impl包、子孙包下所有类的方法。
4、第二个*号:表示类名,*号表示所有的类。
5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。
2.1.2编写测试类
@Test public void ProxyServiceImplTest() { testAspectServiceImpl.testAspect("isAspect?"); } |
单元测试结果为,可以看到切面打印了入参与出参:
com.example.demo.aspect.TestAspect : Service start. method : TestAspectServiceImpl.testAspect(..) , Param : [isAspect?] ========1552894755581=========== com.example.demo.aspect.TestAspect : Service finish. method : TestAspectServiceImpl.testAspect(..), Result : isAspect?yes |
这里是直接根据描述的路径去找到想要增加切面的方法,如果我们想个性化,可以通过在方法上增加标签,即可实现对该方法的切面工作。
2.2.1自定义标签
package com.example.demo.annotation; import java.lang.annotation.Documented; //声明注解的保留期限 |
2.2.2标签切面
@Aspect
|
在你所有添加切面的接口中加上注解就可以了
@Service public class TestAspectServiceImpl { @Authority public String testAspect(String str) { System.out.println("========" + new Date().getTime() + "==========="); return str + "yes"; } } |