spring aop工作原理,springmvc aop原理

  spring aop工作原理,springmvc aop原理

  如何解决写爬虫IP受阻的问题?立即使用。

  spring aop原理:

  AOP(面向方面)是一种编程范式,它提供了另一种考虑程序结构的方式来改进面向对象编程(OOP)。

  AOP为开发者提供了一种描述横切关注点的机制,可以自动将横切关注点编织到面向对象的软件系统中,从而实现横切关注点的模块化。

  AOP可以封装与业务无关,但通常被业务模块调用的逻辑或职责,如事务处理、日志管理、权限控制等。便于减少系统的重复代码,降低模块间的耦合度,有利于以后的可操作性和可维护性。

  使用AOP的好处

  降低模块的耦合度。

  使系统易于扩展。

  提高代码可重用性

  AOP的基本概念

  连接点:横切关注点需要插入到程序中的点。连接点可能在类初始化、方法调用、字段调用或异常处理等中。Spring只支持方法执行连接点。

  切入点:一组相关的连接点。

  建议:在连接点执行的行为。增强提供了一种方法来扩展AOP中切入点所选择的连接点处的现有行为。包括建议前、建议后和建议前后。

  方面:通知和切入点的结合。

  编织:编织是一个过程,是将切面应用于目标对象来创建AOP代理对象的过程。

  代理:通过代理将切面应用于目标对象。AOP代理可以通过JDK动态代理或CGLIB代理来实现。

  目标:需要织入焦点的对象。也就是被表示的对象。

  实现AOP的主要设计模式是动态代理。

  Spring的动态代理有两种:一是JDK的动态代理;另一个是cglib动态代理。

  JDK动态智能体模拟

  JDK动态代理的两个核心接口(类)分别是InvocationHandler和Proxy。注意:您只能代理接口。

  公共类TimeHandler实现InvocationHandler {

  //目标对象

  私有对象targetObject

  public time handler(Object target Object){

  this . target object=target object;

  }

  @覆盖

  //调用时将执行此实现类的关联方法。

  /*调用handler接口的方法,proxy表示代理,method表示调用原始对象的方法,

  Args表示方法的参数*/

  公共对象调用(对象代理、方法方法、对象[]参数)

  可投掷的

  Object ret=null

  尝试{

  System.out.println(在 method: system . current time millis())之前);

  //调用目标方法

  ret=method.invoke(targetObject,args);

  System.out.println(在 method: system . current time millis())之后);

  }catch(异常e){

  e . printstacktrace();

  system . out . println( error );

  扔e;

  }

  返回ret

  }

  }TimeHandler类实现InvocationHandler接口。实现核心方法invoke,它有3个参数。第一个参数生成的代理类实例,第二个参数目标对象的方法,第三个参数方法的参数值数组。

  公共类ProxyUtil {

  @SuppressWarnings(未选中)

  public static T T proxy one(Class loader loader,Class?[] clz,InvocationHandler处理程序){

  return(T)proxy . newproxyinstance(loader,clz,handler);

  }

  }ProxyUtil类只是封装了Proxy.newProxyInstance()方法。这个方法也有3个参数。第一个参数生成代理对象的类加载器,第二个参数是目标对象的接口数组,第三个参数是实现InvocationHandler接口的类实例。

  公共接口UserManager {

  public void addUser(字符串userId,字符串用户名);

  }

  公共类UserManagerImpl实现UserManager {

  @覆盖

  public void addUser(字符串userId,字符串userName) {

  system . out . println( addUser(id: userId ,name: userName ));

  }

  }

  公共静态void main(String[] args) {

  用户管理器um=new UserManagerImpl();

  日志处理程序日志=新的log handler(um);

  um=代理实用程序。代理一(嗯。getclass().getClassLoader(),

  um.getClass().getInterfaces()、log);

  时间处理程序time=新时间处理程序(um);

  um=代理实用程序。代理一(嗯。getclass().getClassLoader(),

  um.getClass().getInterfaces()、time);

  um.addUser(1111 ,张三);

  }为了演示需要,这边又增加了一个LogHandler,跟时间处理器代码一样。

  字节码生成动态代理模拟

  字节码生成动态代理的两个核心接口(类)分别是环绕通知和增强剂。是不是跟爪哇岛开发工具包动态代理很相似,用法也差不多。但字节码生成可以代理类和接口。注意:不能代理最后的类。

  公共类时间拦截器实现MethodInterceptor {

  私有对象目标;

  公共时间拦截器(对象目标){

  目标=目标

  }

  @覆盖

  公共对象拦截(对象代理,方法方法,

  Object[]参数,MethodProxy调用)抛出可投掷的

  System.out.println(方法之前:系统。当前时间毫秒());

  对象ret=调用。invoke(target,args);

  System.out.println(方法之后:系统。当前时间毫秒());

  返回浸水使柔软

  }

  }拦截方法四个参数。1.生成的代理类实例。2.被代理对象的方法引用。3.方法参数值数组。4.代理类对方法的代理引用。

  公共类ProxyUtil

  @SuppressWarnings(未选中)

  公共静态测试代理人(类clz,MethodInterceptor拦截器){

  return (T)Enhancer.create(clz,interceptor);

  }

  }增强剂类是字节码生成中的字节码增强器。

  公共类用户管理{

  公共void addUser(字符串用户Id,字符串用户名){

  系统。出去。println( addUser(id: userId ,name: userName ));

  }

  }

  公共静态void main(String[] args) {

  用户管理um=新用户管理();

  时间拦截器时间=新时间拦截器(um);

  um=代理实用程序。代理一(嗯。获取类(),时间);

  um.addUser(111 ,老王);

  }以上就是面向方面编程原理是什么的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: