简介
AOP(Aspect Oriented Programming),面向切面编程。对面向对象编程的补充。
作用是在不修改源代码的前提下,给程序添加业务无关的公共功能。例如日志、事务。
原理
AOP实现方式有两种:JDK代理方式和CGLIB动态代理方式 。 默认情况下会采用Jdk的动态代理实现AOP ;目标对象没有实现接口,必须采用CGLIB的动态代理,用的是继承的方式 。
实例:创建ExceptAspect 增强类 :
pom文件导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
@Component
@Aspect
@Slf4j
public class ExceptAspect {
@AfterThrowing(pointcut = "within(com.gxc.mdg.controller.*)", throwing = "ex")
public void handleException(JoinPoint join , Exception ex) throws Exception{
Class declaringType = join.getSignature().getDeclaringType();
String clazz = declaringType.getCanonicalName();
String name = join.getSignature().getName();
log.error( clazz + name + "error {}", ex.getMessage() );
}
}
@EnableAspectJAutoProxy
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Component
@Aspect
@Slf4j
public class LogAspect {
@Autowired
ObjectMapper objectMapper ;
@Pointcut("execution(public * com.longfor.gxc.mdg.controller.*Controller.*(..))")
public void point() {
}
@Before(value ="point()")
public void before(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
// 这段代码会生成到controller 函数之前运行
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
try {
log.debug(String.format("method:[%s] uri:[%s] params:[%s]", request.getMethod(), request.getRequestURI(),
objectMapper.writeValueAsString(args)));
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
网友评论