Spring(四)(aop概念原理及springaop的实现)

来源:互联网 发布:复旦金融系 知乎 编辑:程序博客网 时间:2024/06/05 05:33

1、spring概念和原理:

AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充。

1.1、什么是Aop

AOP是Aspect-oriented programming 面向切面(方面)的编程的简写。
AOP的实现可以把业务逻辑和系统级的服务进行隔离,使业务逻辑跟各个系统级服务的耦合度降低,从而提高程序的重用性和开发效率。

名词解释:

业务逻辑: 某个类的某个方法本身要实现的功能。

系统级的服务: 系统的日志、事务、权限验证。




1.2、怎样实现Aop


AOP的底层实现的原理都是动态代理。

 

每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。我们来看看InvocationHandler这个接口的唯一一个方法 invoke 方法。

 

案例:JDKProxyTest

public interface UserDao {public void addUser();public void searchUser();}

public class UserDaoImpl implements UserDao {@Overridepublic void addUser() {/** * 系统级功能 *///System.out.println("判断用户操作添加用户的权限"); /** * 业务逻辑 */System.out.println("添加用户 ...");int i = 1/0 ;/** * 系统级功能 *///System.out.println("写入添加用户的日志 ");}@Overridepublic void searchUser() {System.out.println("判断用户操作查询用户的权限");int i = 1/0 ;System.out.println("查询用户 ...");//System.out.println("写入查询用户的日志 ");}}


@Testpublic void testJDKProxy(){//实例化目标对像final UserDao target = new UserDaoImpl();UserDao proxy = (UserDao)Proxy.newProxyInstance(//目标类ClassLoader,定义了由哪个ClassLoader对象来生成代理对象进行加载 target.getClass().getClassLoader(), //目标类的接口,一个Iterface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口//给它,那这代理对象就宣称实现该接口(多态),这样我就能够调用这组接口中的方法target.getClass().getInterfaces(), //实现Invocation接口,一个invocationHandler对象,当动态代理调用方法的时候//会关联到一个invocationHandler对象上new InvocationHandler(){/** * proxy : 指我们所代理的那个真实的对象 * method : 指我们所要调用真实对象的某个方法的Method对象 * params : 指调用真实对象某个方法时接受的参数 */@Overridepublic Object invoke(Object proxy, Method method, Object[] params) throws Throwable {System.out.println("判断用户操作添加用户的权限"); System.out.println("-" + method.getName());Object result = method.invoke(target, params);  //目标方法System.out.println("写入添加用户的日志 ");return result;}});proxy.addUser();}



注意:动态代理有两种方式:jdk动态代理 /cglib动态代理

jdk的动态代理机制只能代理实现了接口的类

cglib的动态代理既可以代理实现了接口的类,也可以代理没有实现接口的类

cglib的动态代理的例子略。


1.3、Aop相关专业术语

* 切面(Aspect) : 横切关注点。就是交叉在各个业务逻辑中的系统服务(被模块化),类似于安全验证、事务处理、日志记录都可以理解为切面。

 

* 织入(weaving) : 就是将切面代码插入到目标对象某个方法的过程,相当于我们在jdk动态代理里面的 invocationHandler接口方法的内容 。

 

* 连接点(JointPoint) :  理论上可能被切面织入的所有方法 ,比如addUser(), searchUser()的方法前、方法后或抛异常后等等。通常所有方法都可以被称为连接点。

 

* 切入点(PointCut) : 就是实际上被切面织入的方法。

 

* 目标对象(target) : 就是切入点和连接点所属的类 UserDaoImpl,被通知的对象。

 

* 通知(Advice) : 就是切面的实现,切面必须要完成的工作。

 

* 代理(Proxy) : 向目标对象应用通知之后创建的对象。

 

* 顾问(Advisor) : 其实就是通知的一个封装和延伸,可以将通知以更为复杂的方式织入到某些方法中

将切面织入到目标对象的连接点方法,使连接点成为切入点

 



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 盯盯拍开不了机怎么办 向私人借钱不还怎么办 微信好友借钱不还怎么办 支付宝借不了钱怎么办 支付宝借条关了怎么办 qq群不小心解散了怎么办 qq群解散了照片怎么办 出租屋没窗户很闷怎么办 二手房交税后房主不卖怎么办 二房东收不到租拖欠房租怎么办 房东不给换门锁怎么办 租房到期房东联系不到租客怎么办 廉租房名下有车怎么办 路边停车收忘记交费怎么办 考编忘记交费了怎么办 深圳公租房入库了接下来怎么办 公租房5年以后怎么办 教务系统密码忘记了怎么办 林科大教务处密码忘记了怎么办 智学号密码忘了怎么办 正方教务管理系统忘记密码怎么办 正方教务系统忘记密码怎么办 教务网密码忘了怎么办 电动车解除限速报警器不响怎么办 公租房住满5年怎么办 广州公租房收入超标怎么办 深圳法院拍卖房子不肯搬走怎么办 上海奉贤公租房的期满怎么办 公租房人口少了怎么办 公租房太远了怎么办 商品房没有门厅业主该怎么办 公帐付款备注错了怎么办 我是农村户口在外省交社保怎么办 北京租房遇到黑中介怎么办 上海租房子不让带孩子怎么办 租的房子没窗户怎么办 北京安河桥安河家园租房被骗怎么办 领完失业金后怎么办 北京公租房太小怎么办 申请公租房太小怎么办 房东电费收贵了怎么办