面向切面编程(注解式)---实现请求,返回日志的自动打印
Pointcut 切点 用方法作为一系列要准备植入地的别名 (所有的方法路径就是切面)
Around Before AfterReturning 通知织入到某些切点--此时的切点就用这个方法别名了
示例:
配置文件:
<!-- 启动对@AspectJ注解的支持 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
@Component
@Aspect
public class LogAopAspect {
//execution 切面的路径表达方式,@within 切面的注解表达方式
@Pointcut("execution(* com.houbank.incoming.web.controller..*(..)) and @within(org.springframework.web.bind.annotation.Controller)")
private void anyAcesssAndResponseMethdod() {
}
@Autowired
private HttpServletRequest request;
@Around("anyAcesssAndResponseMethdod()")
public Object notifyLog(ProceedingJoinPoint joinPoint) throws Throwable {
}
}
又如:
@Component
@Aspect
public class MonitorAdvise {
@Pointcut("@within(org.springframework.web.bind.annotation.RestController)")
public void apiMethod() {
}
@Pointcut("execution(* com.houbank.bank.*.service.*.*(..)))")
public void serviceMethod() {
}
@Around("apiMethod() || serviceMethod()")
@Monitor
public Object aroundExecuteApiMethod(ProceedingJoinPoint pJoinPoint) throws Throwable {
return MethodInvocationAspect.aspectMonitorAnnotation(pJoinPoint);
}
}
================切面也可传参数============
package com.houbank.xloan.core.db;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Component
@Aspect
@Order(1)
// order设置为1.保证在配置@Transactional时,优于事务进行切面
public class MultipleDataSourceAspectAdvice {
private Log logger = LogFactory.getLog(MultipleDataSourceAspectAdvice.class);
// 所有service接口的
@Around("@annotation(dbRoute) &&execution(* com.houbank.xloan.api.service.*.*(..))")
public Object doAround(ProceedingJoinPoint point, DbRoute dbRoute)
throws Throwable {
Object retVal = null;
try {
Object target = point.getTarget();
String method = point.getSignature().getName();
Class<?> classz = target.getClass();
// 打印log
if (logger.isDebugEnabled()) {
logger.debug(String
.format("class %s,method %s", classz, method));
}
// 设置路由数据源
if (dbRoute != null && StringUtils.isNotEmpty(dbRoute.value().getValue())) {
DbContextHolder.setDataSourceType(dbRoute.value().getValue());
}
retVal = point.proceed();
} catch (Exception e) {
// e.printStackTrace();
throw e;// 确保抛出异常
} finally {
// 环绕通知后,恢复数据源为默认
DbContextHolder.setDataSourceType(DbEnum.DEFAULT_DATA_SOURCE);
}
return retVal;
}
}
相关推荐
面向切面编程(AOP)是一种编程范式,它旨在将关注点分离,使得系统中的核心业务逻辑与系统服务(如日志、事务管理、权限控制等)可以解耦。在Android开发中,AOP的应用可以帮助我们更好地组织代码,提高可维护性和...
在IT行业中,Spring MVC、MyBatis Plus以及AOP(面向切面编程)是Java Web开发中的重要组件,常用于构建高效、灵活的企业级应用。本项目“Spring MVC Mybatis Plus 实现AOP 切面日志系统”旨在提供一个基础的日志...
面向切面编程(Aspect-Oriented Programming,AOP)是Java开发中的一种重要技术,它主要解决了传统面向对象编程中的横切关注点问题。在OOP中,业务逻辑与系统服务(如日志、事务管理等)往往交织在一起,使得代码...
本文将深入探讨“基于切面的日志记录SSMdemo”,这是一个结合了Spring、SpringMVC和MyBatis框架,并利用AOP(面向切面编程)实现日志功能的简单学习案例。 首先,我们来了解SSM框架。SSM是Spring、SpringMVC和...
- **面向切面编程**(AOP)是一种编程范式,它允许开发者将跨多个对象的公共行为(如日志记录、安全检查等)定义为“切面”,并通过配置而非显式编程将其添加到应用程序中。 #### 五、Spring MVC的工作流程 Spring...
在日志脱敏场景下,开发者可以在敏感字段上添加注解,然后在运行时通过AOP(面向切面编程)或者其他处理机制自动执行脱敏逻辑。这种方式使得代码更加整洁,也易于维护。 这些实现可以为开发者提供灵活的选择,根据...
在Spring AOP(面向切面编程)中,切面环绕通知是一种强大的机制,它允许我们在方法执行前后插入自定义的行为,比如记录日志、事务管理等。本篇将深入探讨如何利用Spring AOP的切面环绕通知来实现一个日志记录系统,...
Spring AOP(面向切面编程)提供了一种优雅的方式来实现这一需求,它允许我们在不修改原有代码的情况下,插入额外的功能。本教程将通过一个具体的例子来介绍如何使用Spring AOP在Spring Boot中打印Web请求的参数信息...
1. **Spring AOP(面向切面编程)**: - **AOP概念**:AOP是Spring框架的核心特性之一,它允许程序员定义“切面”,这些切面可以包含业务逻辑的某一部分,如日志、事务管理等。切面可以在程序运行时“织入”到其他...
在IT行业中,Spring框架是Java开发中的一个核心组件,它提供了丰富的功能,包括依赖注入、面向切面编程(AOP)以及与各种技术的集成,如Spring MVC和Hibernate。本项目"使用切面的方式记录日志springMvc + hibernate...
面向切面编程(Aspect-Oriented Programming,AOP)是一种编程范式,它旨在提高代码的可维护性和可重用性,通过将关注点(如日志、事务管理等)从核心业务逻辑中分离出来。在Android开发中,AOP也被广泛应用于处理如...
AOP(面向切面编程)是Spring框架的重要特性,它允许程序员定义“切面”,即关注点的模块化,如日志、事务管理等。在Spring中,我们可以通过注解来声明切面,例如`@Aspect`、`@Before`、`@After`、`@Around`和`@...
在"Android-logging-aspect"项目中,提供了一种高效且灵活的日志收集方式,通过AOP(面向切面编程)和Listener两种全局实现。下面我们将详细探讨这两种方法。 首先,AOP(面向切面编程)是一种编程范式,它允许...
为了解决这一问题,可以利用Spring框架中的AOP(Aspect Oriented Programming,面向切面编程)技术来实现。 #### 二、Spring AOP 概述 Spring AOP 是Spring框架提供的一种实现AOP的方法。通过AOP,开发者可以在不...
这通常通过AOP(面向切面编程)来实现,比如使用Spring AOP的切面来拦截方法的调用,然后在进入和离开方法时记录日志。在方法的入口,记录请求参数;在方法执行后,记录响应结果和处理耗时,同时可以通过`...
Spring提供了强大的事务管理、AOP(面向切面编程)等功能,Struts则负责处理HTTP请求并调度控制器,而Hibernate则简化了数据库操作,实现了对象与数据库表之间的映射。 2. AOP(面向切面编程):AOP是Spring框架的...
面向切面编程是一种编程范式,旨在提高代码的模块化,通过将关注点分离,比如日志记录、事务管理、性能监控、缓存等,从核心业务逻辑中解耦出来。AspectJ通过提供一种称为“方面”的新组件来实现这一目标,这些方面...
**Spring AOP 面向切面编程详解** 在Java世界中,Spring框架以其强大的功能和易用性闻名,其中一个核心特性就是面向切面编程(Aspect-Oriented Programming,简称AOP)。AOP是为了解决传统面向对象编程中横切关注点...
这个入门实例将向我们展示如何使用Spring Boot与JPA(Java Persistence API)、PostgreSQL数据库以及AOP(面向切面编程)来实现数据验证。 首先,让我们详细了解一下Spring Boot。Spring Boot的核心理念是“约定...