- 浏览: 441837 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
建悦胡:
好文,必须顶
关于系统中使用多个PropertyPlaceholderConfigurer的配置 -
阿毛色色:
感谢!解决问题
关于系统中使用多个PropertyPlaceholderConfigurer的配置 -
fangwei06056115:
...
Maven中指定得AspectJ依赖无法添加得解决方案 -
abc3720:
Dashboard配置系统 是是商业的吗?如果不是发我看一下吗 ...
图示ExtJS商业智能的仪表盘配置系统 - (Season 1) -
maidou80:
的确有帮助 3Q
Ext表单中的combobox回填显示值问题
注释形式的AOP编程,便利的实现了运行时对类及其方法的监控及干预,使生活变得更美好。 —— 《Seraph川上曰》
环境 :系统开发过程中,我们都曾实现过将系统元数据或字典表添加到缓存中,以便程序调用,减少数据库访问IO。
问题 :在用户通过前端页面更新系统字典表时,需手工刷新系统缓存,操作很不友好。
解决方案 :监听持久层DAO方法的调用,对于目标表的insert,update,delete操作进行相应的系统缓存更新。
示例环境 :Spring2.5 + iBatis + AspectJ
参考书目 :Spring 2.5 Aspect-Oriented Programming
Spring AOP自动代理的XML配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <aop:aspectj-autoproxy/> </beans>
被监测类的代码:
public interface ScDbInfoDAO { BigDecimal insert(ScDbInfo record); int updateByPrimaryKey(ScDbInfo record); int updateByPrimaryKeySelective(ScDbInfo record); List selectByExample(ScDbInfoExample example, String orderByClause); List selectByExample(ScDbInfoExample example); ScDbInfo selectByPrimaryKey(BigDecimal dbId); int deleteByExample(ScDbInfoExample example); int deleteByPrimaryKey(BigDecimal dbId); int selectCountByExample(ScDbInfoExample example); }
然后是AspectJ实现:
import org.apache.log4j.Logger; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Service; /** * @author seraph * */ @Service @Aspect public class JdbcSourceInterceptor { private static final Logger log = Logger.getLogger(JdbcSourceInterceptor.class); @AfterReturning(value="execution(* com.longtop.data.switching.db.dao.ScDbInfoDAO.*(..))", argNames="rtv", returning="rtv") public void afterInsertMethod(JoinPoint jp, Object rtv) throws Throwable { Signature signature = jp.getSignature(); log.debug("DeclaringType:" + signature.getDeclaringType()); log.debug("DeclaringTypeName:" + signature.getDeclaringTypeName()); log.debug("Modifiers:" + signature.getModifiers()); log.debug("Name:" + signature.getName()); log.debug("LongString:" + signature.toLongString()); log.debug("ShortString:" + signature.toShortString()); for (int i = 0; i < jp.getArgs().length; i++) { Object arg = jp.getArgs()[i]; if(null != arg) { log.debug("Args:" + arg.toString()); } } log.debug("Return:" + rtv); } }
运行时的监测日志:
JdbcSourceInterceptor - DeclaringType:class dao.impl.ScDbInfoDAOImpl JdbcSourceInterceptor - DeclaringTypeName:dao.impl.ScDbInfoDAOImpl JdbcSourceInterceptor - Modifiers:1 JdbcSourceInterceptor - Name:selectByPrimaryKey JdbcSourceInterceptor - LongString:ScDbInfoDAOImpl.selectByPrimaryKey(BigDecimal) JdbcSourceInterceptor - ShortString:selectByPrimaryKey JdbcSourceInterceptor - Args:1 JdbcSourceInterceptor - Return:ScDbInfo: [dbId=1, dbName=oracle, dbDesc=oracle驱动, dbType=2, dbIp=10.1.7.19, dbPortNo=1521, dbInstName=dc, dbUserName=cgst, dbPwd=cgst, maxConnNum=100, minConnNum=20, initConnNum=26]
通过以上的日志我们可以看出,@AfterReturning注释AOP中,通过JoinPoint和返回参数我们可以得到类运行时的所有相关信息,如通过方法名我们可以鉴别出是insert, update还是delete操作,针对不同的操作实现不同的处理方法,如调用缓存的add(),remove(),refresh()方法。我们还可以获取方法的调用参数及返回值,这极大的方便了我们对原业务逻辑的AOP处理。
一些相关概念:
- Aspect - 切面
- Pointcut - 切入点
- Joinpoint - 连接点
- Pointcut Designators (PCD)
Spring AOP中, 切入点(Pointcut)注释符在使用execution方法时以下的连接点(joinpoint)是可用的。
• execution
• within
• this
• target
• args
• @target
• @args
• @within
• @annotation
• bean
以下的切入点(pointcut)仅支持基于XML的Spring AOP配置,不支持AspectJ注释形式。如使用将会导致IllegalArgumentException异常。他们是:
• call
• get
• set
• preinitialization
• staticinitialization
• initialization
• handler
• adviceexecution
• withincode
• cflow
• cflowbelow
• if
• @this
• @withincode
发表评论
-
System.getProperty()系统参数
2011-09-21 13:17 1162Properties props=System.ge ... -
jchardet字符编码自动检测工具
2011-04-08 11:25 2050jchardet is a java port of the ... -
Spring3注释装配的最佳实践
2011-01-31 12:43 25292005夏于上海,初次使用了Spring框架开发企业应用,当时 ... -
Maven中指定得AspectJ依赖无法添加得解决方案
2011-01-30 17:30 8929使用Maven长久以来一直遇到这样得一个问题,就是pom文件中 ... -
Eclipse自动注释模版
2010-12-12 22:00 1069/** * 类说明:<br> ... -
数据仓库学习网站及图书
2010-09-08 15:28 1527Web Sites Archit ... -
获取中文字符数
2010-06-22 12:03 0private boolean isChineseWo ... -
LoadProperties
2010-06-22 10:36 0import java.io.FileNotFoundE ... -
晒书名:已收藏O'Reilly出版社‘动物世界’系列图书(二)
2010-04-01 15:30 1511书接上回,下所列为后23部经典动物书,书目及图片 ... -
晒书名:已收藏O'Reilly出版社‘动物世界’系列图书(一)
2010-04-01 15:17 4229引言:)子在川上,曾经曰:逝者如斯夫,不舍昼夜。恩,眼一睁一闭 ... -
Log4j异步日志简明配制
2009-11-10 20:15 3784最近搭建一个新的WebService工程,感觉日志系统有些慢, ... -
Mac下的Eclipse3.4反编译插件
2009-09-17 10:26 3427Mac的朋友如最近在使用eclipse3.4以上版本做开发,对 ... -
iBatis的SqlMap简化
2009-09-02 11:54 0啊 -
Jetty嵌入式服务器的JNDI快速配置指南
2009-07-30 15:02 6169J etty提供HTTP服务器、客户端,它是javax ... -
关于系统中使用多个PropertyPlaceholderConfigurer的配置
2009-07-29 11:51 24372多数的鲜为人知方法都是因为有着罕见的应用,就比如说Spring ... -
Abator正式更名为Ibator
2009-06-26 17:57 1045好久没有使用Ibatis了,今天使用Ibatis的生成器Aba ... -
倒排索引,反向索引-Inverted index
2009-05-04 11:17 2293倒排索引(英语:Inverted index),也常被称为 ... -
晒书名:已收藏Manning出版社In Action系列图书
2009-04-22 16:39 4778引言:-) 曾几何时俺还在上海学习、生活、工作,欣赏着外滩的美 ... -
Run to create a run-able Java Package?
2008-10-24 12:33 1170怎样创建一个可运行的Java程序包? Manifest-V ... -
Spring中form绑定找不到commandClass问题的解决
2008-08-11 17:18 4046今天在使用<spring:bind>标签绑定表单中 ...
相关推荐
在本文中,我们介绍了Spring Boot AOP中的@AfterReturning注解,它用于定义在目标方法成功返回后执行的切面逻辑。我们通过一个图书管理系统的实例演示了@AfterReturning的使用方式,并在成功查询图书时记录了查询的...
一个基于@AspectJ的spring2.0 AOP应用实例,很小很简单,没有任何额外信息,最适合AOP入门学习。使用log4j打印信息。把项目直接import进myeclipse就可以使用啦......
Spring AOP的AspectJ支持jar包; 包括: com.springsource.net.sf.cglib-2.2.0.jar com.srpingsource.org.aopalliance-1.0.0.jar com.srpingsource.org.aspectj.weaver-1.68.RELEASE.jar
NULL 博文链接:https://snowolf.iteye.com/blog/1481442
Spring AOP之基于AspectJ注解总结与案例 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45394409
NULL 博文链接:https://rain1109.iteye.com/blog/1838100
NULL 博文链接:https://quicker.iteye.com/blog/670885
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
NULL 博文链接:https://tuoxinquyu.iteye.com/blog/1465155
以公司订单管理的模型为例(大部分步骤和业务了逻辑已经删除,只保存AOP注解这一部分)Spring AOP
@AspectJ配置Spring AOP,文档,Aspect jar包, 可运行的demo,
下面小编就为大家分享一篇Spring Aop之AspectJ注解配置实现日志管理的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...
Spring 使用AspectJ 实现 AOP(基于xml文件、基于注解)
NULL 博文链接:https://tuoxinquyu.iteye.com/blog/1465187
Spring spectJ AOP 前置通知 后置通知 返回通知 异常通知 环绕通知
When to use Spring AOP and AspectJ AOP? Expert author Ramnivas Laddad shows how to combine technologies such as Spring, Hibernate, Swing, and JDBC with AspectJ. The book fully covers the latest ...
spring5基于aspectj实现aop操作所需jar包 com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.ar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar spring-aspects-5.2.6....
spring aop 自定义切面示例 aspectj 需要相应的架包支持
一个运用Spring AOP 1.0 的小示例