spring aop动态代理的两种方式,spring aop静态代理

  spring aop动态代理的两种方式,spring aop静态代理

  00-1010一、弹簧AOP1。传统问题:2。解决策略:3。AOP的优点:2。动态代理1。JDK动态特工2。CGLIB代理

  00-1010 Aspect Oriented Programming,AOP)是软件编程思想发展到一定阶段的产物。它是面向对象编程(OOP)的有益补充,目前已经成为一种比较成熟的编程方法。AOP适用于有横向逻辑的地方,如访问控制、事务管理、性能监控等。

  00-1010在传统的业务处理代码中,通常进行事务、日志等操作。虽然OOP可以通过组合或者继承的方式实现代码重用,比如实现日志时,代码还是会分散到不同的方法中。会有问题。如果要关闭或修改函数,必须修改所有相关的方法。这不仅增加了开发人员的工作量,也增加了代码的出错率。

  00-1010为了解决这个问题,AOP思想应运而生。AOP采用水平抽取机制,将分散在各种方法中的重复代码抽取出来,然后将这些抽取出来的代码应用到程序编译或运行时需要执行的地方。这种采用横向抽取机制的方式超出了传统的OOP思想,因为OOP只能实现父子关系的纵向复用。虽然AOP是一种新的编程思想,但它不是OOP的替代品,而是OOP的延伸和补充。

  

目录

AOP的使用,让开发人员在编写业务逻辑的同时专注于核心业务,而不必过多关注其他业务逻辑的实现,既提高了开发效率,又增强了代码的可维护性。

 

  在AOP思想中,类似于切面的关系如下图所示。我们可以看到,方面在Class1和Class2的方法中加入了事务、日志、权限和异常的功能。

  00-1010通过学习,我们知道AOP中的agent是AOP框架动态生成的对象,可以作为目标对象。对于面向方面编程,简单来说就是在不改变原程序的情况下,在代码段中增加新的功能,对代码段进行增强。其设计思想来源于agent设计模式。通常,调用对象的方法如下图所示。

  在代理模式下,可以为这个对象设置一个代理对象,代理对象为function()提供一个代理方法。当原对象的function()方法被代理对象的function()方法调用时,可以在代理方法中添加新的函数,即增强处理。增强的函数可以插在原对象的函数()之前或之后(如虚线)。

  

一. Spring AOP

JDK动态代理由java.lang.reflect.Proxy类实现。您可以调用proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,默认情况下,Spring框架将使用JDK动态代理来实现AOP。通过一个案例来论证。

 

  1.UserDao.java

  包刀;公共接口UserDao { public void addUserDao();public void deleteUser();}2.UserDaoImpl.java

  包刀;类userdao impl实现userdao { @ override public void adduserdao(){ system . out . println( add user );} @ override public void deleteUser(){ system . out . println( delete user );}}3.MyAspect.java

  包装方面;public my aspect { public void check _ permission(){ system . out . println(-模拟检查访问-);} public void log(){ system . out . println(-模拟日记-);}}4.JdkP

  roxy.java

  

package jdk; import aspect.MyAspect;import dao.UserDao; import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy; /** * Jdk代理类 */public class JdkProxy implements InvocationHandler { //声明目标类接口 private UserDao userdao;// 创建代理方法 public Object createProxy(UserDao userdao){ this.userdao=userdao; //类加载器 ClassLoader classLoader=JdkProxy.class.getClassLoader(); //被代理对象实现的所有接口 Class[] clazz=userdao.getClass().getInterfaces(); //使用代理类进行增强,返回的是代理后的对象 return Proxy.newProxyInstance(classLoader,clazz,this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //声明切面 MyAspect myAspect=new MyAspect(); //前增强 myAspect.check_permission(); //在目标上调用方法,并传入参数 Object obj=method.invoke(userdao,args); //后增强 myAspect.log(); return obj; }}

5. Test.java

 

  

 @Test public void shouldAnswerWithTrue() { JdkProxy jdkProxy=new JdkProxy(); UserDao userDao=new UserDaoImpl(); UserDao userDao1=(UserDao) jdkProxy.createProxy(userDao); userDao1.addUserDao(); System.out.println("n-----------------------------分割线------------------------------------n"); userDao1.deleteUser(); }

结果:

 

  

 

  

 

  

2. CGLIB代理

JDK动态代理的使用非常简单,但它具有一定的局限性(使用动态代理的对象必须实现一个或多个接口)如果要对没有实现接口的类进行代理,那么可以使用CGLIB代理。

 

   CGLIB(Code Generation Library)是一个高性能开源的代码生成包,它采用非常底层的字节码技术,对指定的目标类生成一个子类,并对子类进行增强。在Spring框架的核心包中已经集成了CGLIB所需要的包,所以开发中不需要另外导入jar包。

  1. BookDao.java

  

package dao; public class BookDao { public void addBook(){ System.out.println("添加书本"); } public void deleteBook(){ System.out.println("删除书本"); }}

2. CglibProxy.java

 

  

package jdk; import aspect.MyAspect;import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class CglibProxy implements MethodInterceptor { //代理方法 public Object createProxy(Object target){ Enhancer enhancer=new Enhancer(); enhancer.setSuperclass(target.getClass()); enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { MyAspect myAspect=new MyAspect(); myAspect.check_permission(); Object o1=methodProxy.invokeSuper(proxy,args); myAspect.log(); return o1; }}

结果:

 

  

 

  到此这篇关于深入浅出讲解Spring框架中AOP及动态代理的应用的文章就介绍到这了,更多相关Spring AOP及动态代理内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

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

相关文章阅读

  • spring编程式事务处理,spring编程事务
  • spring编程式事务处理,spring编程事务,详解Spring学习之编程式事务管理
  • spring的核心功能模块有几个,列举一些重要的spring模块
  • spring的核心功能模块有几个,列举一些重要的spring模块,七个Spring核心模块详解
  • spring注解和springmvc的注解,SpringMVC常用注解
  • spring注解和springmvc的注解,SpringMVC常用注解,详解springmvc常用5种注解
  • spring实现ioc的四种方法,spring的ioc的三种实现方式
  • spring实现ioc的四种方法,spring的ioc的三种实现方式,简单实现Spring的IOC原理详解
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况
  • spring事务失效问题分析及解决方案怎么做,spring 事务失效情况,Spring事务失效问题分析及解决方案
  • spring5.0新特性,spring4新特性
  • spring5.0新特性,spring4新特性,spring5新特性全面介绍
  • spring ioc以及aop原理,springmvc aop原理
  • spring ioc以及aop原理,springmvc aop原理,深入浅析Spring 的aop实现原理
  • Spring cloud网关,spring cloud zuul作用
  • 留言与评论(共有 条评论)
       
    验证码: