1,新建SpringBoot工程导入一下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
-------------------------------------------------------------------------------------
一个简单的web接口
结果
3,定义切面
@Aspect
@Component
public class WebLogAspect {
private Loggerlogger = LoggerFactory.getLogger(WebLogAspect.class);
//定义切面
@Pointcut("execution(public * com.example.demo.log.*.*(..))")
public void webLog(){}
@Before("webLog()")
public void doBefore(JoinPoint joinPoint){
//获取请求信息
ServletRequestAttributes servletRequestAttributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request= servletRequestAttributes.getRequest();
//记录日志
logger.info("URL:"+request.getRequestURL().toString());
logger.info("METHOD"+request.getMethod());
logger.info("IP:"+request.getRemoteAddr());
}
@AfterReturning(returning ="ret",pointcut ="webLog()")
public void doAfterReturning(Object ret){
logger.info("response:"+ret);
}
}
1,定义切面需加注解@Aspect,@Component是交给Spring IOC容器托管。
2, @Pointcut("execution(public * com.example.demo.log.*.*(..))"),定义了一个切面,参数是pointcut expression。public是修饰符,*是返回值 com...是包名+类名+方法名。
Spring AOP Advice共有五种类型:
@After ,@Before,@AfterReturning,@AfterThrowing,@Around
实例:利用AOP解耦应用程序。
Spring AOP实例
包租婆的核心业务只有签合同与收房租,其余可以交给中介商去做。
包租婆类的代码·如下:
中介商可以完美使用AOP实现。代码如下图:Aspect=PointCut+Advice
pointcut定义在哪里切入
前置通知与后置通知实现何时切入
使用环绕通知实现
@Around实现代码
测试:










网友评论