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的注解方式实现,也入过不少坑,现在做一下记录,希望有同样需求的朋友可以少走弯路 使用之前还是先过一下官方文档吧,至少可以少走弯路,不用担心英文读不懂,其实只看代码例子就能理解 ...
随机推荐
- mongodb3.2系统性学习——2、write concern mongodb 写安全机制
为了尊重作者原文章位置:http://kyfxbl.iteye.com/blog/1952941 首先讲一下mongodb 的写操作过程: mongodb有一个write concern的设置,作用是 ...
- art.dialog 与 ajax 异步请求
上周写了一些代码,涉及到jquery异步请求,这里归纳总结下,希望对刚接触编程的同学有帮助. 主要习惯使用 art.dialog 框架,非常好用,在异步请求上,它提供了很多简便的方法. 加载使用art ...
- linux下进度条的简单实现
在实现进度条之前,先学习一下makefile. 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中, makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编 ...
- iBatis系列一
XML iBatis可以使用xml来作为参数输入以及结果返回:这个功能的优势在于某些特定的场景:还有可以通过DOM方式来作为参数传递:但是这个方式应用的比较少,如果服务器是xml服务器可以采用这种方式 ...
- qt 5 小练习 简易画板
如何在窗口上画线?用一根根线来拼凑图案呢? 想必大家都知道点的集合是线,而线的集合就是很多线啦,用线的集合我们能拼凑出许许多多的图案.于是我就要记录自己跟着老师的学习之路啦: 既然有集合的话,势必要用 ...
- to disable the entity lazy load, The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
The ObjectContext instance has been disposed and can no longer be used for operations that require a ...
- 第 14 章 迭代器模式【Iterator Pattern】
以下内容出自:<<24种设计模式介绍与6大设计原则>> 周五下午,我正在看技术网站,第六感官发觉有人在身后,扭头一看,我C,老大站在背后,赶忙站起来, “王经理,你找我?” 我 ...
- the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header
the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header ...
- android中viewPager+fragment实现的屏幕左右切换(进阶篇)
Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等.可以看做是一个子Activity. 先看一下布局: 1 <LinearLayout xmlns:a ...
- String 类型的相关转换
题目: what is the result of the expression 5.4+"3.2"? 答案: 当一个运算数为原始数据类型,另外一个为字符串时,则基本数据类型会转化 ...