博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring4面向切面AOP
阅读量:6268 次
发布时间:2019-06-22

本文共 3445 字,大约阅读时间需要 11 分钟。

AOP(Aspect Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的横向多模块统一控制的一种技术。AOP是OOP的补充,是框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP可以分为静态织入与动态织入,静态织入即在编译前将需织入内容写入目标模块中,这样成本非常高。动态织入则不需要改变目标模块。Spring框架实现了AOP,使用注解配置完成AOP比使用XML配置要更加方便与直观。

 

AOP基本概念:

切面(aspect):横切关注点被模块化的特殊对象。
通知(advice):切面必须要完成的工作。切面中的每个方向称之为通知。通知是在切面对象中的。  (前置通知、后置通知、返回通知、异常通知、环绕通知)
目标(target):被通知的对象。
代理(proxy):向目标对象应用通知后创建的对象。
连接点(joinpoint):目标对象的程序执行的某个特定位置。如某个方向调用前,调用后的位置。包括两个信息:1.目标程序的哪个方法?2.方法执行前还是执行后?
切点(pointcut):每个类会有多个连接点,AOP通过切点定位到特定的边接点。

需要用到的包:spring的包  和一个aspectjweaver.jar

在spring配置文件中加入aop命名空间:

 

  一种是通过注解的方式,在代码中加入注解,一种是基于xml配置的方式

  1、使用注解的方式:

    (1)做一个类,做切面类和切面方法。把这个类放在IOC容器中(自动扫描) 为这个类加上@Compoent注解

package com.itnba.entities;import org.springframework.stereotype.Component;@Componentpublic class Chinese implements IHuman {    @Override    public void eat() {        System.out.println("中国人正在吃饭");    }    @Override    public void sleep() {                System.out.println("中国人正在睡觉");    }}

 

  2、声明某个类为切面,为该类加上@Aspect注解,

    在这个类中的方法上,声明方法的前置、后置通知、返回通知、异常通知、环绕通知

 

package com.itnba.aop;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.stereotype.Component;@Aspect@Componentpublic class HumanAOP {        @Before("execution(* com.itnba.entities..*.eat(..))")    public void beforeEat(){                System.out.println("吃饭前洗手吧");            }        @AfterReturning("execution(* com.itnba.entities..*.eat(..))")    public void afterEat(){        System.out.println("吃完饭漱口");    }    @AfterThrowing(value="execution(* com.itnba.entities..*.eat(..))",throwing="ex")    public void except( JoinPoint point,  Exception ex ){        System.out.println(point.getSignature().getName());        System.out.println(ex.getMessage());        System.out.println("吃饭噎死了,快去抢救");    }                @Before("execution(* com.itnba.entities..*.sleep(..))")    public void beforeSleep(){                System.out.println("洗澡后再睡觉");            }}

 

 

通知分类:

通知分类:前置通知(@Before) -- 在目标方法执行前执行的通知。后置通知(@After) -- 在目标方法执行后执行的通知。无论是否发生异常。后置通知中,无法读取目标方法返回的结果。返回通知(@AfterReturnning) --在目标方法执行成功后执行的通知。在返回通知中可以访问目标返回结果的。     @AfterReturnning(value="execution(* com.itnba..*(..))",returning="result")    public void afterRun(Object result){        System.out.println(result);    }异常通知(@AfterThrowing) -- 在目标方法执行出错后执行的通知。    @AfterThrowing(value="execution(* com.itnba..*(..))",throwing="ex")    public void afterThrowing(Exception ex){        System.out.println(ex.getMessage());    }    环绕通知(@Around) -- 需要切面方法携带ProceedingJoinPoion参数,类似于一个完整的动态代理,环绕通知必须要有一个返回值,是目标方法的返回值。    @Around("execution(* com.itnba..*(..))")    public object aroundAdvice( ProceedingJoinPoint pjp){                object obj = null;        try{            //做前置通知            obj = pjp.proceed();            //做返回通知        }        catch(Exception ex){            //做异常通知        }        //做后置通知        return obj;    }

 

  2、通过xml配置的方式

 

转载于:https://www.cnblogs.com/zhaotiancheng/p/6637556.html

你可能感兴趣的文章
Spring 之 AOP
查看>>
软件项目管理|期末复习(二)
查看>>
直接调用VS.net2005中的配置界面
查看>>
程序员的自我修养五Windows PE/COFF
查看>>
关于字符集,编码格式,大小端的简单总结
查看>>
js string 转 int Number()
查看>>
课堂练习:ex 4-20
查看>>
20155328 2016-2017-2 《Java程序设计》 第8周学习总结
查看>>
python操作redis--string
查看>>
echarts图表初始大小问题及echarts随窗口变化自适应
查看>>
Inherits、CodeFile、CodeBehind的区别
查看>>
创建一个SimpleDlg
查看>>
使用XML生成菜单
查看>>
udp,tcp对于socket的写法
查看>>
第二周个人赛
查看>>
推断Windows版本号新方法
查看>>
2017-4-18 ADO.NET
查看>>
RSuite 一个基于 React.js 的 Web 组件库
查看>>
技术博客网址收藏
查看>>
python 金融分析学习
查看>>