创建通知
Spring中通知的类型:前置通知Before、后置通知After、环绕通知Around、异常通知Throws、引入通知
Before:接口是org.springframework.aop.BeforeAdvice,在目标方法被调用之前调用
After:接口是org.springframework.aop.AfterReturningAdvice,在目标方法被调用之后调用
Around:接口是org.aopalliance.intercept.MethodInterceptor,拦截对目标对象方法的调用
Throws:接口是:org.springframework.aop.ThrowsAdvice,在目标方法抛出异常时调用
引入通知:给目标对象添加新的方法(以及属性),而其他通知是在目标对象的方法被调用的时候织入。
切入点
定义切入点
Spring根据需要织入通知的类和方法来定义切入点,通知是根据其特性织入目标类和方法。Spring的切入点框架的核心接口是Pointcut。
接口MethodMatcher有三个方法,用在代理对象生命周期的特定时期。
1、 matches(Method,class)方法根据目标类和方法决定一个方法是否被通知,在Aop代理被创建时调用一次,其结果决定通知是否被织入;
2、 若matches(Method,class)返回true,isRuntime()被调用来决定MethodMatcher的类型:静态和动态。静态切入点通知总被执行,如果一个切入点是静态的,isRuntime()方法应返回false;动态切入点根据运行时方法的参数值来决定通知是否执行,若一个切入点是动态的IsRuntime()方法返回true,在代理类创建时调用一次。
3、 如果一个切点是静态的额,matches(Method,Class,Object[])方法永远不会被调用。对于动态切入点,目标对象方法每次被调用时,matches(Method.Class,Object[])方法被调用。
理解Advisor
Advisor是把通知和切入点组合到一个对象中,接口为PointcutAdvisor。
静态切入点
如创建自制的静态切入点继承类StaticMethodMatcherPointcut
常用的静态切入点:NameMatchMethodPointcut和JdkPegexpMethodPointcut
动态切入点
内置ControlFlowPointcut
切入点实施
为了在应用系统中重复使用切入点,进行合并与交叉操作,Spring提供了如下两个类:
1、 ComposablePointcut:通过将已有的ComposablePointcut、切入点、MethodMatcher及classFilter对象进行合并与交叉,组装成一个新的ComposablePointcut对象,调用其实例的intersection()或union方法实现
2、 Pointcuts:可对两个pointcut对象进行合并
综合案例:
创建一个EmpService的接口:
public interface EmpService {
void work(String name);
void sleep(Integer hours);
}
创建一个实现EmpService接口的类EmpserviceImpl
public class EmpServiceImpl implements EmpService {
private String time;
@Override
public void work(String name) {
System.out.println(name+"的工作时间是:" + time);
}
@Override
public void sleep(Integer hours) {
System.out.println("工作时间是:"+ time+"---休息时间是:" + hours);
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}
创建一个ModifyDate的接口
public interface ModifyDate {
public void setMDate(Date MDate);
public Date getMDate();
}
创建一个实现ModifyDate接口的类ModifyDateImpl
public class ModifyDateImpl extends DelegatingIntroductionInterceptor implements ModifyDate {
/**
* 引入通知
*/
private Date MDate;
@Override
public Date getMDate() {
return MDate;
}
@Override
public void setMDate(Date MDate) {
}
}
/**前置通知*/
public class MyBeforeAdvice implements MethodBeforeAdvice{
/**第一个参数是:方法、第二个参数是:方法的参数、第三个参数是:目标对象*/
@Override
public void before(Method arg0, Object[] arg1, Object arg2)
throws Throwable {
System.out.println("方法的名称是:"+arg0);
System.out.println("方法的参数"+arg1.length+arg1[0]);
System.out.println("目标对象"+arg2);
}
}
/**环绕通知(方法执行前后)*/
public class MyAroundAdvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("around start。。。。。");
Object obj = invocation.proceed();// 让它去执行目标方法
//注:proceed()方法会调用目标方法
System.out.println("around end。。。。。");
return obj;
}
}
/**后置通知(方法执行之后)*/
public class MyAfterAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object arg0, Method arg1, Object[] arg2,
Object arg3) throws Throwable {
System.out.println("方法的返回类型:"+arg0);
System.out.println("方法的名称"+arg1+"方法的参数:"+arg2.length+
"目标对象:"+arg3.getClass().getName());
}
}
/**异常通知(方法产生bug)*/
public class MyException implements ThrowsAdvice{
/**写方法的时候一定参考API中的方法样式 不能够随意写*/
public void afterThrowing(Method method, Object[] args, Object target, Exception ex){
System.out.println("方法的名称:"+method+"方法的参数"+args.length+"目标对象:"+target.getClass().getName()+"异常"+ex.getMessage());
}
}
Xml文件
<!-- 前置通知(方法操作之前进行处理) -->
<bean id="myBeforeAdvice" class="cn.csdn.aop.advice.MyBeforeAdvice" scope="singleton" />
<!-- 后置通知(方法的操作之后进行处理) -->
<bean id="myAfterAdvice" class="cn.csdn.aop.advice.MyAfterAdvice" scope="singleton"/>
<!-- 环绕通知(方法执行前后处理) -->
<bean id="myAroundAdvice" class="cn.csdn.aop.advice.MyAroundAdvice" scope="singleton"/>
<!-- 异常通知(方法执行期间出现bug的时候) -->
<bean id="myException" class="cn.csdn.aop.advice.MyException" scope="singleton"/>
<!-- 引入通知 -->
<bean id="modifyDateImpl" class="cn.csdn.service.ModifyDateImpl"></bean</
分享到:
相关推荐
Spring AOP四种创建通知(拦截器)类型
Spring_AOP四种创建通知(拦截器)类型,介绍的比较详细,有实例
LocalNotifications是在Android和iOS上利用Flutter创建通知的简便方法
2020年度小学关于开展文明校园创建活动的文件通知.pdf
主要给大家介绍了关于如何使用Spring AOP的通知类型及创建通知的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring AOP具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
///// 第一步:获取NotificationManager NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); ///// 第二步:定义Notification Intent intent = new Intent...
它实现了以安全地创建通知和重复报告。 目标是定义一个简单的 API,以便能够向多个用户发送通知和邮件。 用户可以将设置定义为每天仅接收一封邮件作为报告。 这一切都在排队解决方案中完成。 因此它具有可扩展性和...
LocalNotification Flutter插件插件已不再积极开发我目前没有计划继续积极开发此插件。 如果无法正常工作或缺少...简介LocalNotifications是在Android和iOS上创建通知的简便方法。 平台当前支持以下平台所有Android版本
创建通知Mobila应用程序开发-创建通知
当在OBS上直播时,它将创建通知声音,并切换到“警告”场景,如果在计时器用尽之前未更改场景,则直播将自动停止。 要使用此文件: 将文件解压缩到OBS的scripts文件夹中。 将“ TOOBIN SWITCH”,“ ...
交互式通知:使用自定义动作创建通知流,这些动作收集用户的快速反馈
gnibappointmentfinder:尝试为可用的gnib约会创建通知程序
hapi-发布机器人 已弃用:改用。 为 npm 发布事件创建通知的 Slack 机器人
django-heythere 该应用程序可为用户在现场和电子邮件中创建通知。 支持Django 1.5至1.7和Python 2.6、2.7和3.3。
简单介绍SAP QM模块后台配置: 一 . 基本设置 1 1. 维护工厂等级设置 1 二....1. 基本数据—目录 4 2. 基本数据—检验特性,检验方法 7 3. 基本数据—采样,SPC 11 4. 检验计划—一般 14 ...3. 创建通知—合作伙伴 30
SmallPop轻巧的小弹出窗口小部件,没有任何依赖关系,可使用此javascript插件轻松创建通知。Codepen中的Playground。 基本在页面中包含spop.js和spop.css。 <link href =“ spop.c SmallPop一个轻巧的小弹出窗口...
自定义通知栏和个推透传结合 关于个推配置详细见个推官网
archeage-服务器-状态简单的 Android 应用程序,用于显示 Archeage 服务器和服务状态,并在选定的服务器启动或关闭时创建通知。
运行效果:示例代码:创建通知Push.create('Hello World!') define(['pushjs'], function (Push) { Push.create('Hello World!'); }); Push.count();关闭通知Push.create('Hello World!', { tag...