基于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技术,要求包含前置通知、后置通知、环绕通知、返回通知、异常返回通知。请掌握这五种通知的特点,及应用场景
NULL 博文链接:https://pretyliang-163-com.iteye.com/blog/1671800
一个运用Spring AOP 1.0 的小示例
aop的原理基于java动态代理模式,本资源是spring的aop运用简单示例,用于帮助初学者理解和运用aop技术
本文主要是介绍SpringAOP的相关知识,在本文里面我能介绍了SpringAOP的实现机理,在实现过程中所用到的相关技术,最后,通过一个简单的实例来对SpringAOP进行实现,进而加读者对SpringAOP的理解,以达到熟练运用的...
sping AOP面向切面的编程,程序运行过程中动态加入所需代码等,对公共的问题进行集中处理,具体的实现有动态代理与静态代理,本文通过对AOP的代理机制,前置、后置、环绕、异常的通知进行了综合总结和运用!
spring-springMVC开发文档和AOP详解,便于学习运用框架知识
《Spring3.0就这么简单》主要介绍了Spring3.0的核心内容,不仅讲解了Spring3.0的基础知识,还深入讨论了SpringIoC容器、SpringAOP、使用SpringJDBC访问数据库、集成Hibernate、Spring的事务管理、SpringMVC、单元...
aop的运用,aop却面的运用。只有核心代码
j2ee项目经常需要记录操作者的日志,本demo在ssh框架上运用了spring的aop,加上threadlocal(用户信息,请求信息)完成了日志记录。
最终通过一个综合案例,实现灵活运用Spring框架中的各个部分。 2、适应人群 学习spring,要有一定的Java基础,同时应用过spring基于xml的配置。(或者学习过官网的Spring课程) 学习springmvc,要有一定java web...
该项目运用SpringBoot框架,MyBatis持久层,SqlSession映射,AOP技术,对项目日志进行管理
<br>AOP 入门 AOP 的观念与术语都不是很直觉,可以先从代理机制(Spring 实现 AOP 的一种方式)来看看实际的例子,从而了解 AOP 的观念与各种术语。 从代理机制初探 AOP 动态代理 <br>AOP 观念与...
全书分3篇共21章,具体内容包括:Spring环境的安装与使用、JSP与JSTL简介、 Spring基础概念与工具、用SpringJdbcTemplate访问数据库、使用Mayen工程、Spring MVC编程、基于 MVC的资源共享网站设计、Spring的AOP编程...
Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际...3 动态代理+Spring AOP 4 责任链模式进阶 Spring Framework设计模式 Spring 设计模式
如quartz、jcrontab、JobServer等,在这里我介绍一种比较简单的调度,没有quartz那么复杂,目的在于实用就行,这种调度就是spring提供的调度功能,该调度功能基于quartz+AOP进行实现,我们开始一个例子吧。
其发展历史从学术领域和研发机构 的运用开始,目前流行的Spring应用程序框架将AOP思想融入了整个框架的设计开发与应用当中。使用Spring框架固然给 我们的编程带来了好处与便利,但是同时存在着一个问题,对于...
本系列的第二部分将更深入地介绍如何运用Spring中的所有通知类型和切入点来实现更实用的方面和面向方面设计模式。本文的目的不是要介绍构成模块化J2EE系统——即Spring框架——的所有重要元素,我们将只把注意力放在...