基于Spring 的 AOP MethodBeforeAdvice 拦截增强 实现
方法执行前通知(可以理解为方法执行前“增强”)需要实现接口:MethodBeforeAdvice
AOP拦截实现类:
public class BaseModelBeforeAdvice implements MethodBeforeAdvice {
private static Method addMethod = null;
private static Method updateMethod = null;
private static Method updateBatch = null;
private static Logger logger = LoggerFactory.getLogger(BaseModelBeforeAdvice.class);
public BaseModelBeforeAdvice() {
try {
addMethod = BaseDao.class.getMethod("add", Object.class);
updateMethod = BaseDao.class.getMethod("update", Object.class);
updateBatch = BaseDao.class.getMethod("updateBatch", Object.class, List.class);
} catch (SecurityException e) {
logger.error("初始化BaseModelBeforeAdvice class 安全错误", e);
} catch (NoSuchMethodException e) {
logger.error("初始化BaseModelBeforeAdvice class 没有找到方法错误", e);
}
}
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
//添加方法
if (method.equals(addMethod)) {
if (BaseModel.class.isAssignableFrom(args[0].getClass())) {
BaseModel baseModel = (BaseModel) args[0];
//如果id为空才自动生成,不推荐在业务代码中直接设置id,临时方案应急使用 切记切记切记!!!
if (StringUtil.isEmpty(baseModel.getId())) {
baseModel.setId(IDGenerate.uuid());
}
Date date = new Date(SystemClock.now());
baseModel.setCreateDate(date);
baseModel.setUpdateDate(date);
//set当前用户操作信息
try {
BaseUser baseUser = (BaseUser) SecurityUtils.getSubject().getPrincipal();
if (baseUser != null) {
baseModel.setCreateBy(baseUser.getId());
baseModel.setCreateByName(baseUser.getUsername());
}
} catch (UnavailableSecurityManagerException e) {
logger.warn(" shiro security init fail " + e.getMessage());
}
} else if (BaseIncrementIdModel.class.isAssignableFrom(args[0].getClass())) {
//如果是直接继承BaseIncrementIdModel类只需要这只id属性
BaseIncrementIdModel baseIn = (BaseIncrementIdModel) args[0];
baseIn.setId(IDGenerate.uuid());
}
if (Deleted.class.isAssignableFrom(args[0].getClass())) {
((Deleted) args[0]).setDeleted(Deleted.DELETE_FALSE);
}
} else if (method.equals(updateMethod) || method.equals(updateBatch)) {
//修改方法
if (BaseModel.class.isAssignableFrom(args[0].getClass())) {
BaseModel baseModel = (BaseModel) args[0];
baseModel.setUpdateDate(new Date(SystemClock.now()));
}
}
}
}
Spring.xml文件增加面向切边 aop:config配置
<!-- baseDao方法拦截器,设置操作人和时间 -->
<bean id="baseModelBeforeAdvice" class="com.global.pdp.core.spring.BaseModelBeforeAdvice"/>
<aop:config>
<aop:pointcut id="baseModelBeforeAdvicePoint"
expression="execution(* com.global.pdp.core.BaseDao.add(..)) or execution(* com.global.pdp.core.BaseDao.update(..)) or execution(* com.global.pdp.core.BaseDao.updateBatch(..))"/>
<aop:advisor advice-ref="baseModelBeforeAdvice" pointcut-ref="baseModelBeforeAdvicePoint"/>
</aop:config>
分享到:
相关推荐
1、编写切面类,包含权限审核方法和日志记录方法,这两个方法将来会织入到...5、编写案例,运用Spring AOP技术,要求包含前置通知、后置通知、环绕通知、返回通知、异常返回通知。请掌握这五种通知的特点,及应用场景
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、...通过实践这些示例,可以更好地理解Spring AOP的精髓,从而在实际项目中灵活运用。
在本文中,我们将深入探讨Spring AOP的运用,并结合源码分析其工作原理。 首先,了解AOP的基本概念: 1. 切面(Aspect):切面是关注点的模块化,这些关注点通常是跨越多个对象的横切关注点,例如事务管理、日志...
Spring AOP,即Spring的面向切面编程模块,是Spring框架的重要组成部分,它允许开发者在不修改源代码的情况下,对程序进行横切关注点的处理,如日志、事务管理等。实现这一功能,主要依赖于三个核心的jar包:aop...
通过深入理解并熟练运用Spring AOP,开发者可以编写更加模块化、可维护的代码,减少重复的工作,并提高系统的整体设计质量。在实际项目中,结合源码阅读和相关工具,能进一步提升对Spring AOP的掌握和运用水平。
在本项目中,我们将探讨如何通过配置文件实现Spring AOP,包括前置通知、后置通知以及拦截器的运用。 首先,我们需要理解Spring AOP的核心概念。切面(Aspect)是关注点的模块化,这些关注点定义了跨越多个对象的...
《Spring AOP:面向切面编程的深度解析》 ...理解并熟练运用Spring AOP,能够让我们编写出更加优雅、高效的企业级应用。在实际开发中,根据需求选择合适的实现方式,充分利用其优势,能够显著提升开发效率和软件质量。
Spring AOP,全称为Aspect Oriented Programming,是Spring框架中的一个重要模块,主要负责处理系统中的...文件"5.SpringAOP_01"和"6.SpringAOP_02"很可能是课程的分阶段内容,涵盖了从基础概念到进阶实践的详细讲解。
**Spring AOP 使用实例** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它提供了一种在不...在实际开发中,合理地运用Spring AOP,可以显著提高项目的质量和开发效率。
在提供的压缩包文件"springAOP"中,可能包含了以下内容: - **切面类(Aspect Class)**:包含切点和通知的Java类,可能使用了`@Aspect`注解。 - **目标类(Target Class)**:被AOP代理的对象,通常包含业务逻辑。...
Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于...理解和熟练运用这两种技术,是每个Spring开发者必备的技能。
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它扩展了传统的面向对象编程,使得开发者可以方便地...在实际开发中,灵活运用Spring AOP能够有效提升项目的开发效率和质量。
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,比如日志、事务管理、性能监控等。在这个"spring aop练习"中,我们将深入探讨如何使用注解来...
在IT行业中,Spring AOP(面向切面编程)是一种强大的工具,它允许程序员在不修改原有业务代码的情况下,实现如日志记录、性能监控、事务管理等横切关注点的功能。本示例将深入探讨Spring AOP的基础知识,以及如何在...
`SpringAop.ppt`文件很可能包含了一个详细的讲解,涵盖了Spring AOP的基本概念、配置方式、使用注解声明切面、基于XML的配置以及如何自定义切面。PPT通常会通过图表、代码示例和流程图来帮助理解复杂的概念,使得...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下...通过深入理解并熟练运用Spring AOP,开发者可以构建出更加健壮、易于维护的系统。
在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱,而Spring AOP(面向切面编程)则是Spring框架中的一个重要...通过理解和实践这个实例,开发者可以更好地掌握Spring AOP,并在实际项目中灵活运用。
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了强大的模块化和代码复用机制。在Java应用中,AOP主要用于处理那些具有横切关注点(如日志记录、...
《深入解析Spring AOP:源码解读与应用实践》 Spring AOP,即Spring的面向切面编程,是Spring...通过阅读源码,我们可以更深入地了解Spring AOP的工作流程,从而在实际项目中灵活运用,提升代码的可维护性和扩展性。
**Spring AOP 概念理解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它允许我们通过...理解和熟练运用Spring AOP及其@AspectJ注解是每个Spring开发者必备的技能之一。