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的注解方式实现,也入过不少坑,现在做一下记录,希望有同样需求的朋友可以少走弯路 使用之前还是先过一下官方文档吧,至少可以少走弯路,不用担心英文读不懂,其实只看代码例子就能理解 ...
随机推荐
- div+css3实现漂亮的多彩标签云,鼠标移动会有动画
div+css3实现漂亮的多彩标签云,鼠标移动会有动画 点击运行效果 <style> .dict { margin: 20px 0;clear:both ;text-align:left; ...
- django查询常用操作符及models和admin的写法
以Publisher.Author.Book的model为例子 #coding=utf-8 from django.db import models # Create your models here ...
- C++库编译
C++库编译 1. POCO编译 进入源文件目录,选择相应的VS版本进行编译(build_vs140). 设置系统环境变量: POCO_BASE 2. Boost编译 ####简单编译 在 ...
- redis的安装-windows和linux
windows 下载地址:http://code.google.com/p/servicestack/wiki/RedisWindowsDownload 下载解压到D盘下: 进到该目录下,有下列文件: ...
- 7 -- Spring的基本用法 -- 8...
7.8 深入理解容器中的Bean 7.8.1 抽象Bean与子Bean 把多个<bean.../>配置中相同的信息提取出来,集中成配置模版------这个配置模版并不是真正的Bean,因此 ...
- 预处理命令#define #undef #if #endif 的基本用法
C#的预处理命令其实还是蛮有用的,但是真正使用过得人不多,这个介绍一下平时用的比较多的预处理命令中的几个:#define,#undef ,#if,#endif.除此之外还有一些预处理命令#warnin ...
- [Leetcode] Validate BST
给一个Binary Tree,检查是不是Binary Search Tree. 即是否满足对每个节点,左子树的中的所有节点的值 < 当前节点的值 < 右子树所有节点的值. Solution ...
- JavaScript clearInterval定时器失效原因
检查下是不是setInterval重复执行(两次以上<!-- 文件上传板块 --> <div id="adUploadWindow" class="ea ...
- POJ_2446_Chessboard
题目意思就是一个M*N的有洞棋盘棋盘上,用1*2的板子去覆盖没有洞的地方,要求板子不能重叠,最终能否将棋盘完整覆盖. 代码: #include<stdio.h> #include<s ...
- CTO的眼界到底有多宽?
CTO的眼界到底有多宽? [CSDN独家报道]在各大企业中,CTO (Chief Technology Officer,首席技术官)有着雄厚的技术实力,掌握着企业核心技术,是软件开发项目中最重要的人 ...