`
yinghuayu1324117
  • 浏览: 69534 次
  • 性别: Icon_minigender_2
  • 来自: 保定
文章分类
社区版块
存档分类

创建通知

阅读更多

创建通知

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、  matchesMethodclass)方法根据目标类和方法决定一个方法是否被通知,在Aop代理被创建时调用一次,其结果决定通知是否被织入;

2、  matchesMethodclass)返回trueisRuntime()被调用来决定MethodMatcher的类型:静态和动态。静态切入点通知总被执行,如果一个切入点是静态的,isRuntime()方法应返回false;动态切入点根据运行时方法的参数值来决定通知是否执行,若一个切入点是动态的IsRuntime()方法返回true,在代理类创建时调用一次。

3、  如果一个切点是静态的额,matchesMethodClassObject[])方法永远不会被调用。对于动态切入点,目标对象方法每次被调用时,matches(Method.Class,Object[])方法被调用。

理解Advisor

Advisor是把通知和切入点组合到一个对象中,接口为PointcutAdvisor

静态切入点

如创建自制的静态切入点继承类StaticMethodMatcherPointcut

常用的静态切入点:NameMatchMethodPointcutJdkPegexpMethodPointcut

动态切入点

内置ControlFlowPointcut

切入点实施

为了在应用系统中重复使用切入点,进行合并与交叉操作,Spring提供了如下两个类:

1、  ComposablePointcut:通过将已有的ComposablePointcut、切入点、MethodMatcherclassFilter对象进行合并与交叉,组装成一个新的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 四种创建通知(拦截器)类型详解 Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要模块,它提供了在应用代码中添加横切关注点的能力,如日志记录、事务管理、权限...

    Spring3_AOP四种创建通知(拦截器)类型

    Spring_AOP四种创建通知(拦截器)类型,介绍的比较详细,有实例

    LocalNotifications是在Android和iOS上利用Flutter创建通知的简便方法

    LocalNotifications是Flutter框架中用于在Android和iOS平台上创建本地通知的一个强大工具。本地通知是应用程序在后台或前台运行时向用户显示的一种交互方式,即使应用没有在屏幕上显示,也能提醒用户有新的活动或...

    Android通知栏消息、点亮屏幕、震动、声音、显示样式

    1. **创建通知** 创建一个Android通知,我们需要使用`NotificationCompat.Builder`类。首先,实例化一个Builder对象,设置通知的基本属性,如标题、内容、图标等。例如: ```java NotificationCompat.Builder ...

    Python-Zroya是围绕win32API的一个python封装用于创建Windows通知

    使用Zroya,开发者可以方便地创建通知,设置标题、内容、图标,以及定义通知的交互行为,如点击后的回调函数。 首先,我们需要安装Zroya库。这通常可以通过Python的包管理器pip来完成,命令如下: ```bash pip ...

    android中创建通知栏Notification代码实例

    在Android开发中,创建通知栏通知是向用户传达应用信息的一种常见方式。`Notification`类是Android系统提供用于构建和管理这些通知的核心组件。本文将详细介绍如何在Android中创建一个通知栏通知,并通过代码实例来...

    Flutter 通知栏通知 - android 版

    在Android端,你需要使用`NotificationCompat`类来创建通知。以下是一个基本的示例: ```java private void sendNotification(String title, String message, Result result) { Intent intent = new Intent(this...

    android通知栏提示下载进度源码

    - 使用`NotificationCompat.Builder`类创建通知,它提供了一种向后兼容的方式来构建通知,适用于不同的Android版本。 2. **创建通知** - 首先,你需要实例化`NotificationCompat.Builder`,并传入上下文(Context)...

    2020年度小学关于开展文明校园创建活动的文件通知.pdf

    2020年度小学关于开展文明校园创建活动的文件通知.pdf

    androidN通知栏以及快捷通知栏通知栏

    开发者可以在创建通知渠道时指定`IMPORTANCE_HIGH`, `IMPORTANCE_DEFAULT`, `IMPORTANCE_LOW`, `IMPORTANCE_MIN`或`IMPORTANCE_NONE`,用户可以根据这些选项调整接收通知的方式。 三、堆叠通知(Notification ...

    android 通知栏跳转

    创建通知主要通过`NotificationCompat.Builder`类,这个类提供了设置标题、内容、图标、优先级等属性的方法。构建完通知后,使用`NotificationManager`发送通知,通常通过`notify()`方法指定一个唯一ID来更新或显示...

    iOS10通知及通知拓展Extension使用

    但在iOS10中,苹果引入了UNUserNotificationCenter,这个新框架提供了对本地和远程通知的统一管理,包括请求权限、创建通知、调度通知等操作。例如,你可以通过`UNUserNotificationCenter.current()....

    CreatingNotifications:Mobila应用程序开发-创建通知

    在 Mobila 应用程序开发中,创建通知是一项至关重要的任务,它能让用户即使在不直接与应用交互的情况下也能接收到重要信息。本教程将详细讲解如何使用 Java 语言在 Android 平台上创建通知,以及涉及到的相关知识点...

    startForeground去除通知栏

    - 使用`NotificationCompat.Builder`可以简化创建通知的过程。例如: ```java NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_...

    SimpleNotifier:用于创建通知的简约应用

    本文将以“SimpleNotifier”为例,探讨如何利用JavaScript语言构建一个用于创建通知的简约应用,帮助用户轻松设置和管理各种提醒。 “SimpleNotifier”是一个轻量级的解决方案,旨在为用户提供自定义通知的功能。...

    Android 通知(notification)简单实用Demo,包含点击功能

    二、创建通知 在Android中,使用`NotificationCompat.Builder`类来构建通知。首先,需要初始化Builder对象,然后设置各个属性,如: ```java NotificationCompat.Builder builder = new NotificationCompat....

    易语言win10弹窗通知模块

    1. `创建通知`:这个函数用于创建一个新的通知对象,需要指定通知的标题、内容、图标等信息。创建后,通知尚未显示,需要调用其他函数来触发显示。 2. `显示通知`:此函数将创建的通知推送到用户界面上,用户可以在...

    swift-一行代码实现通知

    1. **创建通知**: 通过一行代码快速创建一个包含标题、副标题、消息内容的通知。 2. **动画效果**: 提供了一些预设的进入和退出动画,使得通知的显示更加吸引用户的注意力。 3. **自定义行为**: 可能允许开发者...

    通知栏显示本地通知

    3. **通知构建器(Notification Builder)**:在Android系统中,开发者使用`NotificationCompat.Builder`或`Notification.Builder`来创建通知实例,设置触发器、内容以及其他特性,如声音、震动、优先级等。...

    状态栏通知小图标,notification通知

    1. **创建`NotificationCompat.Builder`对象**:这是创建通知的主入口点,可以设置各种属性,如图标、标题、文本等。 2. **设置通知内容**:使用`setContentTitle()`和`setContentText()`方法设定标题和正文。 3. **...

Global site tag (gtag.js) - Google Analytics