springaop术语概述及aop中常见通知的实现(10级学员 庞丽课堂总结)
来源:互联网 发布:ue软件算法 编辑:程序博客网 时间:2024/05/21 09:43
一、 Spring AOP术语概述
1、 切面(aspect):要实现的交叉功能,是系统模块化的一个切面或领域。如日志记录。
2、 连接点:应用程序执行过程中插入切面的地点,可以是方法调用,异常抛出,或者要修改的字段。
3、 通知:切面的实际实现,他通知系统新的行为。如在日志通知包含了实现日志功能的代码,如向日志文件写日志。通知在连接点插入到应用系统中。
4、 切入点:定义了通知应该应用在哪些连接点,通知可以应用到AOP框架支持的任何连接点。
5、 引入:为类添加新方法和属性。
6、 目标对象:被通知的对象。既可以是你编写的类也可以是第三方类。
7、 代理:将通知应用到目标对象后创建的对象,应用系统的其他部分不用为了支持代理对象而改变。
8、 织入:将切面应用到目标对象从而创建一个新代理对象的过程。织入发生在目标对象生命周期的多个点上:
编译期:切面在目标对象编译时织入.这需要一个特殊的编译器.
类装载期:切面在目标对象被载入JVM时织入.这需要一个特殊的类载入器.
运行期:切面在应用系统运行时织入.
二、 Spring的AOP实现:用Java编写Spring通知
创建通知
通知类型
接口
描述
Around
Org.springframework.aop.
MethodInterceptor
拦截对目标方法调用
Before
Org.springframework.aop.
BeforeAdvice
在目标方法调用前调用
After
Org.springframework.aop.
AfterReturningAdvice
在目标方法调用后调用
Throws
Org.springframework.aop.
ThrowsAdvice
当目标方法抛出异常时调用
三、下面是用一个实例来演示其五个通知的用法:
需要的jar:如下如所示:
在写通知之前,我们要写一个PersonService.java接口,在其中实现一个方法,代码如下:
import java.util.Date;publicinterface PersonService { //学习课程及开始日期 publicvoid study(String name,Date startTime);}
在写一个实现其接口的实现类:PersonServiceBean.java,代码如下:
import java.util.Date;publicclass PersonServiceBean implements PersonService{ @Override publicvoid study(String name, Date startTime) { System.out.println("学习的科目是:"+name+" 学习的开始时间是:"+startTime); //(实现异常通知使用时) /* try{ int i=1/0; }catch(Exception e){ // }*/ System.out.println("============="); }}
(一)环绕通知:
如果想要实现环绕通知,就要实现Org.springframework.aop.MethodInterceptor。
1) 下面我们要自己定义一个环绕通知MyAroundAdvice。代码如下:
publicclassMyAroundAdvice implements MethodInterceptor { @Override publicObject invoke(MethodInvocation methodInvocation) throws Throwable { System.out.println("执行方法之前执行操作"); Object obj = methodInvocation.proceed();//执行目标方法 System.out.println("执行方法之后执行操作"); return obj; }}
2) 下面我们要对环绕通知进行配置,在beans.xml文件中进行配置。如下代码:
<!-- 环绕通知 --> <bean id="myAroundAdvice"class="cn.csdn.hr.advice.MyAroundAdvice"/><!-- 业务bean --><bean id="personServiceBean"class="cn.csdn.hr.service.PersonServiceBean"/><bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"><!-- 代理的接口 --> <propertyname="proxyInterfaces"> <list> <value>cn.csdn.hr.service.PersonService</value> </list> </property><!-- 通知名称--> <propertyname="interceptorNames"> <list> <value>myAroundAdvice</value> </list> </property> <!--通知的对象 --> <propertyname="target"> <refbean="personServiceBean"/> </property>
(二)前置通知:
1)下面我们要自己定义一个环绕通知MyBeforeAdvice.java。代码如下:
publicclass MyBeforeAdviceimplements MethodBeforeAdvice{ @Override publicvoid before(Method method, Object[] args, Object target) throws Throwable { //第一个参数方法对象 //第二个参数:方法参数 //第三个对象:目标对象 Object obj =null; if(args.length>0){ obj= args[0]; } System.out.println("before-----------方法的名称:::"+method.getName()+" 方法的第一个参数值"+obj.toString()+" 目标对象是:"+target.getClass()); //可以再执行目标方法之前执行此操作 }}
2)下面我们要对环绕通知进行配置,在beans.xml文件中进行配置。如下代码:
<!-- 配置前置通知 --><beanid="myBeforeAdvice"class="cn.csdn.hr.advice.MyBeforeAdvice"/><!-- 业务bean --> <beanid="personServiceBean"class="cn.csdn.hr.service.PersonServiceBean"/> <beanid="proxyFactoryBean"class="org.springframework.aop.framework.ProxyFactoryBean"><!-- 代理的接口 --> <propertyname="proxyInterfaces"> <list> <value>cn.csdn.hr.service.PersonService</value> <value>cn.csdn.hr.service.Auditable</value> </list> </property> <!-- 通知名称--> <propertyname="interceptorNames"> <list> <value>myBeforeAdvice</value> </list> </property> <!--通知的对象 --> <propertyname="target"> <refbean="personServiceBean"/> </property>
(三)后置通知:
1)下面我们要自己定义一个环绕通知MyAfterAdivce.java。代码如下:
publicclass MyAfterAdivce implements AfterReturningAdvice{ @Override publicvoid afterReturning(Object returnValue, Method method, Object[] args, Object target)throws Throwable { //执行目标方法之后执行此操作 System.out.println("after---------------------方法的返回值是:"+returnValue); }}
2)下面我们要对后置通知进行配置,在beans.xml文件中进行配置。如下代码:
<!-- 配置后置通知 --><beanid="myAfterAdivce"class="cn.csdn.hr.advice.MyAfterAdivce"/><!-- 业务bean --> <beanid="personServiceBean"class="cn.csdn.hr.service.PersonServiceBean"/> <beanid="proxyFactoryBean"class="org.springframework.aop.framework.ProxyFactoryBean"> <!--代理的接口 --> <propertyname="proxyInterfaces"> <list> <value>cn.csdn.hr.service.PersonService</value> <value>cn.csdn.hr.service.Auditable</value> </list> </property> <!-- 通知名称--> <propertyname="interceptorNames"> <value>myAfterAdivce</value> </list> </property> <!--通知的对象 --> <propertyname="target"> <refbean="personServiceBean"/> </property>
(四)异常通知:
1)下面我们要自己定义一个异常通知MyThrowsAdivce.java。代码如下:
import java.lang.reflect.Method; import org.springframework.aop.ThrowsAdvice; public class MyThrowsAdivce implements ThrowsAdvice { /*public void afterThrowing(Throwable throwable){ }*/ //异常处理操作 public void afterThrowing(Method method,Object[] args, Object target,Throwable throwable){ System.out.println("exception----------------------------"+throwable.getMessage()); }}
2)下面我们要对环绕通知进行配置,在beans.xml文件中进行配置。如下代码:
<!-- 配置异常通知 --><beanid="myThrowsAdivce"class="cn.csdn.hr.advice.MyThrowsAdivce"/><!-- 业务bean --> <beanid="personServiceBean"class="cn.csdn.hr.service.PersonServiceBean"/> <beanid="proxyFactoryBean"class="org.springframework.aop.framework.ProxyFactoryBean"> <!--代理的接口 --> <propertyname="proxyInterfaces"> <list> <value>cn.csdn.hr.service.PersonService</value> <value>cn.csdn.hr.service.Auditable</value> </list> </property> <!-- 通知名称--> <propertyname="interceptorNames"> <list><value>myThrowsAdivce</value> </list> </property> <!--通知的对象 --> <propertyname="target"> <refbean="personServiceBean"/> </property>
(五)引入通知:
1)下面我们要自己定义一个引入通知的接口的声明。代码如下:
import java.util.Date;//添加一个属性 记录最后一次修改的时间的操作publicinterface Auditable { void setLastModifiedDate(Date lastModifiedDate); Date getLastModifiedDate();}
2)下面我们要自己定义一个引入通知AuditableAdvice.java继承DelegatingIntroductionInterceptor这个类并且要实现自己定义的接口Auditable。代码如下:
import java.util.Date; import org.springframework.aop.support.DelegatingIntroductionInterceptor;/** * * 引入通知(引入的拦截器) * */public class AuditableAdvice extends DelegatingIntroductionInterceptor implements Auditable{ private Date lastModifiedDate; @Override public void setLastModifiedDate(Date lastModifiedDate) { this.lastModifiedDate=lastModifiedDate; } @Override public Date getLastModifiedDate() { return lastModifiedDate; }}
3)下面我们要对引入通知进行配置,在beans.xml文件中进行配置。如下代码:
<!-- 引入通知 --><bean id="auditableAdvice" class="cn.csdn.hr.advice.AuditableAdvice"/><!-- 业务bean --> <bean id="personServiceBean" class="cn.csdn.hr.service.PersonServiceBean"/> <bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"><!-- 代理的接口 --> <property name="proxyInterfaces"> <list> <value>cn.csdn.hr.service.PersonService</value> <value>cn.csdn.hr.advice.Auditable</value> </list> </property><!-- 通知名称--> <property name="interceptorNames"> <list> <value>auditableAdvice</value> </list> </property> <!-- 通知的对象 --> <property name="target"> <ref bean="personServiceBean"/> </property>
- springaop术语概述及aop中常见通知的实现(10级学员 庞丽课堂总结)
- springaop术语概述及aop中常见通知的实现(前置,后置,环绕,异常)
- aop的常见术语以及aop中常见通知的实现的总结
- WebService入门介绍及案例分析(10级学员 庞丽课堂总结)
- oracle 闪回的介绍(10级学员 庞丽课堂总结)
- Oracle存储过程(10 级学员 庞丽课堂总结)
- Oracl中PL/SQL编程(10级学员 张帅鹏课堂总结)
- Spring中自动装配(10级学员 郎志课堂总结)
- DML、DCL、DDL、DQL的介绍和区别(10级学员 姚荣旺课堂总结)
- JqueryUI插件---对话框的使用(10级学员 乔宇课堂总结)
- Spring第一个案例(10级学员 庞丽课堂总结)
- spring的注解使用和分散配置(10级 学员张帅鹏课堂总结)
- Spring(四)(aop概念原理及springaop的实现)
- jQueryUI中Datepicker(日历)插件的介绍和使用(10级学员 郞志课堂笔记)
- oracle其他数据对象 --- 视图(10级学员 韩晓爽课堂总结)
- oracle存储函数(10级学员 马林课堂总结)
- Spring中的依赖注入(10级学员 韩晓爽课堂总结)
- Spring bean生命周期UML图示(10级学员 林常禹课堂总结)
- javascript dom基础
- CTime类使用小结
- Exploring the /proc/net/ Directory
- Spring切入点
- 11级_Java_曹建波4.19 精通常用的Java类
- springaop术语概述及aop中常见通知的实现(10级学员 庞丽课堂总结)
- 采用链式存储实现,进栈、出栈操作
- 数据挖掘--挖掘频繁模式、关联和相关(1)
- MySQL 5.6 Replication - Enabling the Next Generation of Web & Cloud Services
- 秋天asp.net广告图片切换控件
- 学习Linux(创建、删除文件和文件夹命令)
- 用一个宏定义求结构体某个变量相对编移量
- java---序列化
- Windows 遍历文件夹下所有文件和文件夹