AOP介绍
java支持面向切面编程,即利用AOP技术实现方法切面编织入其他代码逻辑。它有以下特点:
- 侵入性小,几乎可以不改动原来逻辑的情况下把新的逻辑加入业务。
- 实现方便,使用几个注解就可以实现,使系统更容易扩展。
- 更好的复用代码,比如事务日志打印,简单逻辑适合所有情况。
常见AOP注解含义
@Aspect:切面。表示一个横切进业务的一个对象。它里面包含切入点(Pointcut)和Advice(通知)。
@Pointcut:切入点。表示需要切入的位置,比如某些类或者某些方法,也就是先定一个范围。
@Before:Advice(通知)的一种,切入点的方法体执行之前执行。
@Around:Advice(通知)的一种,环绕切入点执行也就是把切入点包裹起来执行。
@After:Advice(通知)的一种,在切入点正常运行结束后执行。
@AfterReturning:Advice(通知)的一种,在切入点正常运行结束后执行,异常则不执行
@AfterThrowing:Advice(通知)的一种,在切入点运行异常时执行。
简单实践
1、定义AOP形式注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({
ElementType.METHOD,
ElementType.TYPE
})
@Retention(RetentionPolicy.RUNTIME)
public @interface PrintUser {
// 此处也可以加变量参数
}
2、定义Aspect切面类
@Aspect
@Component
@Slf4j
public class PrintUserAspect {
@Pointcut("execution(* com.xxx.platform.xxx.project.web.xxx.controller..*(..))")
public void pointCut(){
}
@After(value = "pointCut()")
public void Before() {
try{
log.info("访问用户:"+ UserUtil.getUserName()+",userId:"+UserUtil.getUserId());
}catch(Exception e){
log.warn("记录访问用户信息失败",e);
}
}
}
3、将AOP应用到具体类或者接口上
@PrintUser
@RestController
public class XXXXController{
@PostMapping("/login")
public void login(HttpServletRequest request){
System.out.println("Scheme:"+request.getScheme());
}
}
5379

被折叠的 条评论
为什么被折叠?



