Spring Aop实现方式总结
前面两个文章介绍了Aop及其相关重要概念,下面主要用代码的方式介绍下实现Spring Aop的几种方式
1. 基于注解实现Spring Aop
package cn.test.business;
public interface Work {
public void doWork(String userName);
}
业务类实现
package cn.test.business;
public class Worker implements Work{
@Override
public void doWork(String userName) {
System.out.println(userName + " is working !");
}
}
注解实现切面类
@Aspect
public class AopAnnotationTest { @Pointcut("execution(* cn.test.business.*.*(..))")
private void anyMethod(){}//定义一个切入点 @Before("anyMethod() && args(name)")
public void doBefore(String name){
System.out.println("doBefore...");
} @AfterReturning("anyMethod()")
public void doAfterReturning(){
System.out.println("doAfterReturning...");
} @After("anyMethod()")
public void doAfter(){
System.out.println("doAfter...");
} @Around("anyMethod()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("begin doAround...");
Object object = joinPoint.proceed();
System.out.println("after doAround...");
return object;
} @AfterThrowing("anyMethod()")
public void doThrow(){
System.out.println("意外通知");
}
}
spring配置文件:spring-aop.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <bean id="work" class="cn.test.business.Worker"></bean> <!-- aop注解 实现 -->
<aop:aspectj-autoproxy/>
<bean id="anno-beforeadvice" class="cn.test.aop.advice.annoation.impl.AopAnnotationTest"/> <!-- 实现相应的Advice方法实现aop -->
<!-- <bean id="logBeforeAdvice" class="cn.test.aop.advice.inteface.impl.LogBeforeAdvice"></bean>
<bean id="logAfterReturnAdvice" class="cn.test.aop.advice.inteface.impl.LogAfterReturnAdvice"></bean>
<bean id="logExceptionAdvice" class="cn.test.aop.advice.inteface.impl.LogExceptionAdvice"></bean>
<bean id="logAroundAdvice" class="cn.test.aop.advice.inteface.impl.LogAroundAdvice"></bean> <aop:config>
<aop:pointcut id="pointcut" expression="execution(* cn.test.business.*.*(..))" />
<aop:advisor advice-ref="logBeforeAdvice" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="logAfterReturnAdvice" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="logAroundAdvice" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="logExceptionAdvice" pointcut-ref="pointcut"/>
</aop:config> --> <!-- 定义一个切面类 -->
<!-- <bean id="logAspect" class="cn.test.aop.advice.defineAspectClass.impl.TestAspect"></bean>
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* cn.test.business.*.*(..))" />
<aop:aspect id="aspect" ref="logAspect">
<aop:before pointcut-ref="pointcut" method="doBefore"/>
<aop:after-returning pointcut-ref="pointcut" method="afterReturning" returning="retValue"/>
<aop:after-throwing pointcut-ref="pointcut" method="doThrowing" throwing="ex"/>
<aop:after pointcut-ref="pointcut" method="doAfter"/>
<aop:around pointcut-ref="pointcut" method="doAround"/>
</aop:aspect>
</aop:config> -->
</beans>
测试类:
package cn.test.aop.test; import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; import cn.test.business.Work; @ContextConfiguration(
locations={
"classpath:/spring-aop.xml"
}
)
public class SpringAopTest extends AbstractJUnit4SpringContextTests{ @Autowired
private Work work; @Test
public void aopTest(){
work.doWork("张三");
}
}
测试结果:
begin doAround...
doBefore...
张三 is working !
after doAround...
doAfter...
doAfterReturning...
2. 实现Adivce接口的方式实现Spring Aop
public class LogBeforeAdvice implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
System.out.println(args[0] + "开始工作!");
}
}
定义环绕通知
public class LogAroundAdvice implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
System.out.println(arg0.getArguments()[0] + " 工作中,请勿打扰...");
Object obj = arg0.proceed();
System.out.println(arg0.getArguments()[0] + " 工作完成...");
return obj;
}
}
定义返回后通知
public class LogAfterReturnAdvice implements AfterReturningAdvice{
@Override
public void afterReturning(Object returnValue, Method method,
Object[] args, Object target) throws Throwable {
System.out.println(args[0] + "完成工作");
}
}
定义抛出异常后通知
public class LogExceptionAdvice implements ThrowsAdvice{
public void afterThrowing(Method method, Object[] parameters, Object target, Exception ex){
System.out.println(parameters[0] + " 工作中出现异常... ");
}
}
spring配置文件:只需要把上面的配置文件中第二部分打开即可。
<!-- 实现相应的Advice方法实现aop -->
<bean id="logBeforeAdvice" class="cn.test.aop.advice.inteface.impl.LogBeforeAdvice"></bean>
<bean id="logAfterReturnAdvice" class="cn.test.aop.advice.inteface.impl.LogAfterReturnAdvice"></bean>
<bean id="logExceptionAdvice" class="cn.test.aop.advice.inteface.impl.LogExceptionAdvice"></bean>
<bean id="logAroundAdvice" class="cn.test.aop.advice.inteface.impl.LogAroundAdvice"></bean> <aop:config>
<aop:pointcut id="pointcut" expression="execution(* cn.test.business.*.*(..))" />
<aop:advisor advice-ref="logBeforeAdvice" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="logAfterReturnAdvice" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="logAroundAdvice" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="logExceptionAdvice" pointcut-ref="pointcut"/>
</aop:config>
3. 定义切面类的方式实现Spring Aop
public class TestAspect {
public void doAfter(JoinPoint jp) {
System.out.println(jp.getArgs()[0] + " 回家...");
}
public void afterReturning (JoinPoint joinPoint, Object retValue) {
System.out.println(joinPoint.getArgs()[0] + " 结束工作...");
}
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
long time = System.currentTimeMillis();
Object retVal = pjp.proceed();
time = System.currentTimeMillis() - time;
System.out.println(pjp.getArgs()[0] +" 工作时间: " + time + " ms");
return retVal;
}
public void doBefore(JoinPoint jp) {
System.out.println(jp.getArgs()[0] + " 开始工作...");
}
public void doThrowing(JoinPoint jp, Throwable ex) {
System.out.println(jp.getArgs()[0] + " 工作中出现异常... " + ex);
}
}
spring配置文件:
<bean id="logAspect" class="cn.test.aop.advice.defineAspectClass.impl.TestAspect"></bean>
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* cn.test.business.*.*(..))" />
<aop:aspect id="aspect" ref="logAspect">
<aop:before pointcut-ref="pointcut" method="doBefore"/>
<aop:after-returning pointcut-ref="pointcut" method="afterReturning" returning="retValue"/>
<aop:after-throwing pointcut-ref="pointcut" method="doThrowing" throwing="ex"/>
<aop:after pointcut-ref="pointcut" method="doAfter"/>
<aop:around pointcut-ref="pointcut" method="doAround"/>
</aop:aspect>
</aop:config>
Spring Aop实现方式总结的更多相关文章
- Spring AOP配置方式
AOP 面向切面编程,允许在 java 应用中的方法调用的前后做一些处理. 本文通过实例介绍两种主要的Spring AOP 配置方式:xml 方式配置,注解方式配置 XML 方式配置 1. 项目包类结 ...
- spring aop注解方式与xml方式配置
注解方式 applicationContext.xml 加入下面配置 <!--Spring Aop 启用自动代理注解 --> <aop:aspectj-autoproxy proxy ...
- (转)Spring AOP实现方式(转)
我们可以通过三种方式来使用Spring AOP,它们分别是:@Aspect-based(Annotation),Schema-based(XML),以及底层的Spring AOP API 底层的Spr ...
- Spring AOP实现方式四之注入式AspectJ切面【附源码】
现在我们要讲的是第四种AOP实现之注入式AspectJ切面 通过简单的配置就可以实现AOP了. 源码结构: 1.首先我们新建一个接口,love 谈恋爱接口. package com.spring.ao ...
- Spring AOP实现方式三之自动扫描注入【附源码】
注解AOP实现 这里唯一不同的就是application 里面 不需要配置每个bean都需要配置了,直接自动扫描 注册,主要知识点是怎么通过配置文件得到bean, 注意类前面的@注解. 源码结构: ...
- Spring AOP实现方式三【附源码】
注解AOP实现 源码结构: 1.首先我们新建一个接口,love 谈恋爱接口. package com.spring.aop; /** * 谈恋爱接口 * * @author Administrator ...
- Spring AOP实现方式二【附源码】
自动代理模式[和我们说的方式一 配置 和 测试调用不一样哦~~~] 纯POJO切面 源码结构: 1.首先我们新建一个接口,love 谈恋爱接口. package com.spring.aop; /* ...
- java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总
若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...
- 转:Spring AOP 注解方式实现的一些“坑”
使用过Spring AOP的注解方式实现,也入过不少坑,现在做一下记录,希望有同样需求的朋友可以少走弯路 使用之前还是先过一下官方文档吧,至少可以少走弯路,不用担心英文读不懂,其实只看代码例子就能理解 ...
随机推荐
- node.js操作mongoDB数据库
链接数据库: var mongo=require("mongodb"); var host="localhost"; var port=mongo.Connec ...
- 如何解决PHP中文乱码问题
如何解决PHP中文乱码问题 一.解决HTML中中文乱码问题方法 1.在head标签里面加入UTF8编码(国际化编码):UTF-8是没有国家的编码,也就是独立于任何一种语言,任何语言都可以使用的. ...
- PHP文章关键词相似短尾长尾内链替换方法介绍
对于互联网程序来说,对文字正文内容做关键词内链优化是常态的工作之一.一方面有人手动来处理关键词内链,这个效率太低:一方面通过程序自动添加内链,这样子也省事而且便于管理: 今天我们探讨的就是给自动给文章 ...
- oracle安装,配置,启动
因为主要不是讲oracle这些,所以就略写. 注意安装的时候:确保以前安装过的卸载干净了.安装的路径不能包含中文.安装的时候需要创建两层数据库.因为在选择的安装目录的平行目录会产生文件. 确认卸载完可 ...
- 关于 jquery.showLoading 中 出现的 图标不在页面中间的问题
很多人喜欢 showLoading 因为 这个实在是太简单了直接 showLoading() hideLoading() 就可以解决这个问题. 今天我们就来看一下 这个插件里面的一个错误 或者说 ...
- HTML -- 元素和属性
HTML -- 元素 HTML元素是从开始标签到结束标签之间的代码,如: <!-- 加粗标签 --> <b>一些元素</b> <!-- 换行 --> & ...
- Jquery IE 缓存问题
jQuery IE缓存问题 解决方法: 1.在AJAX请求的页面后加个随机函数,我们可以使用随机时间函数 在javascript发送的URL后加上t=Math.random() 例如这样:URL+”& ...
- 使用php-emoji类让网页显示emoji表情
需要的材料: php-emoji类库的下载地址:https://github.com/iamcal/php-emoji 代码示例:(该代码来自官网) <?php include('emoji.p ...
- MFC程序的启动过程——先全局对象theApp(第一入口),后WinMain(真正入口),会引爆pApp->InitInstance从而创建窗口(程序员入口)
原文出自:http://blog.csdn.net/yuvmen/article/details/5877271 了解MFC程序的启动过程,对于初学者来讲,了学习MFC很有帮助:对于不常用VC的人来说 ...
- [OJ] Permutation Index
LintCode 197. Permutation Index (Easy) LintCode 198. Permutation Index II (Medium) 感觉这两道题主要考察计算排列组合的 ...