`
jsycjacky
  • 浏览: 11446 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Spring-AOP-1静态代理和动态代理

 
阅读更多

代理模式分为静态代理和动态代理。静态代理就是我们自己定义的代理类,动态代理是程序在运行时生成的代理类。

静态代理示例

Service.java

Java代码  收藏代码
  1. <span style="font-size: medium;">package com.javacrazyer.dao;  
  2.   
  3. public interface Service {  
  4.     public void outPut();  
  5.     public void putOut();  
  6. }</span><span style="font-size: medium;">  
  7. </span>  

ServiceImpl.java

Java代码  收藏代码
  1. <span style="font-size: medium;">package com.javacrazyer.dao;  
  2.   
  3. public class ServiceImpl implements Service {  
  4.   
  5.     @Override  
  6.     public void outPut() {  
  7.         System.out.println("I am method outPut");  
  8.     }  
  9.   
  10.     @Override  
  11.     public void putOut() {  
  12.         System.out.println("I am method putOut.");  
  13.     }  
  14.   
  15. }</span><span style="font-size: medium;">  
  16. </span>  

 至于上面两个类大家随便举例子,无论是增删改还是什么都可以的

测试类TestProxy.java

Java代码  收藏代码
  1. <span style="font-size: medium;">package com.javacrazyer.dao;  
  2.   
  3. public class TestProxy {  
  4.     public static void main(String[] args) {  
  5.           Service serviceImp = new ServiceImpl();  
  6.           serviceImp.outPut();  
  7.           serviceImp.putOut();  
  8.     }  
  9.   
  10. }  
  11. </span>  

 如我们所想,理所当然的输出了

I am method outPut
I am method putOut

下面我们需要加入安全性检查,就是调用方法前我们需要进行验证,比较常见的就是权限验证,验证用户是否拥有权限,

比较常见的做法就是在ServiceManagerImplProxy类中定义一个检查安全性的方法:

好了,这样一说,又得出现一个ServiceManagerImplProxy.java

Java代码  收藏代码
  1. <span style="font-size: medium;">package com.javacrazyer.dao;  
  2.   
  3.   
  4. public class ServiceManagerImplProxy implements Service {  
  5.   
  6.     private Service service;  
  7.     public ServiceManagerImplProxy(Service service){  
  8.         this.service=service;  
  9.     }  
  10.       
  11.     @Override  
  12.     public void outPut() {  
  13.         //在调用方法前调用验证方法  
  14.        this.checkSecurity();  
  15.        this.service.outPut();  
  16.     }  
  17.   
  18.     @Override  
  19.     public void putOut() {  
  20.         //在调用方法前调用验证方法  
  21.         this.checkSecurity();  
  22.         this.service.putOut();  
  23.     }  
  24.     public void checkSecurity()     
  25.     {     
  26.         System.out.println("--------ServiceManagerImpl.checkSecurity()----------");     
  27.     }   
  28.   
  29. }  
  30. </span>  

 修改下测试代码

Java代码  收藏代码
  1. <span style="font-size: medium;">package com.javacrazyer.dao;  
  2.   
  3. public class TestProxy {  
  4.     public static void main(String[] args) {  
  5.           ServiceManagerImplProxy serviceImp = new ServiceManagerImplProxy(new ServiceImpl());  
  6.           serviceImp.outPut();  
  7.           serviceImp.putOut();  
  8.     }  
  9.   
  10. }  
  11. </span>  

 

输出结果

--------ServiceManagerImpl.checkSecurity()----------
I am method outPut
--------ServiceManagerImpl.checkSecurity()----------
I am method putOut

这样总的来说比较灵活。这个依赖关系是我们自己做的,我们完全可以交给spring处理。

按照上面的这种做法有一个缺点,如果接口中方法很多,那么我们实现每一个方法都要添加检查方法checkSecurity(),影响了我们的业务处理。采用静态代理模式我们是没法解决的,这时我们需要使用AOP思想。【AOP底层原理就是动态代理和反射机制】

 

动态代理示例

     使用动态代理我们需要声明一个类SecurityHandler,那么之前的ServiceManagerImplProxy类就不需要了,这个类要实现InvocationHandler接口。在类中定义一个产生动态代理的方法newProxy();同时把我们验证的代码放到这个类中。通过SecurityHandler,当我们调用方法时默认会调用SecurityHandler类invoke方法,我们在这个方法中进行安全性检查,检查通过后在调用真实的方法。需要注意的是目标对象接口中的部分方法是存在返回值的。

SecurityHandler.java

Java代码  收藏代码
  1. <span style="font-size: medium;">package com.javacrazyer.dao;  
  2.   
  3. import java.lang.reflect.InvocationHandler;  
  4. import java.lang.reflect.Method;  
  5. import java.lang.reflect.Proxy;  
  6. /** 
  7.  * 动态代理的处理类: 只针对实现了接口的类才能创建出它的代理对象 
  8.  * @author cheneywu 
  9.  * 
  10.  */  
  11. public class SecurityHandler implements InvocationHandler {  
  12.   
  13.     private Object originalObject;  
  14.   
  15.     // 将欲代理的对象传入,返回一个代理对象  
  16.     public Object newProxy(Object obj) {  
  17.         this.originalObject = obj;  
  18.   
  19.         // 三个参数,第一个是欲代理对象的类加载器,第二个是得到这个类的接口集合,第三个参数是一个handler  
  20.         return (Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj  
  21.                 .getClass().getInterfaces(), this));  
  22.     }  
  23.   
  24.     // 对欲代理对象的方法的调用将会调用这个代理对象的invoke方法  
  25.     // 第一个参数是这个代理对象,第二个参数是欲代理对象实现方法,第三个是方法的参数集合  
  26.     public Object invoke(Object proxy, Method method, Object[] args)  
  27.             throws Throwable {  
  28.         checkSecurity();  
  29.         // 若方法名以out开头则调用下面逻辑  
  30.         if (method.getName().startsWith("out")) {  
  31.             System.out.println("This is a method invoking before the method that was intercepted.");  
  32.             // 调用欲代理对象的相应方法  
  33.             method.invoke(originalObject, args);  
  34.               
  35.             System.out.println("This is a method invoking after the method that was intercepted.");  
  36.         } else {  
  37.             // 若不是需要拦截的方法则正常执行方法  
  38.             method.invoke(originalObject, args);  
  39.         }  
  40.         return null;  
  41.     }  
  42.   
  43.     public void checkSecurity()     
  44.     {     
  45.         System.out.println("--------ServiceManagerImpl.checkSecurity()----------");     
  46.     }   
  47.   
  48. }  
  49. </span>  

 输出结果

--------ServiceManagerImpl.checkSecurity()----------
This is a method invoking before the method that was intercepted.
I am method outPut
This is a method invoking after the method that was intercepted.
--------ServiceManagerImpl.checkSecurity()----------
I am method putOut

跟预期效果一致,

 

使用这种方式维护起来相对比较好,我想进行安全性检查就进行,不想就不进行,很方便。

分享到:
评论

相关推荐

    spring-boot aop

    1. **引入依赖**:在`pom.xml`或`build.gradle`文件中添加Spring AOP和AspectJ的依赖。对于Maven,添加以下依赖: ```xml &lt;groupId&gt;org.springframework.boot &lt;artifactId&gt;spring-boot-starter-aop ``` 2. ...

    spring-aop-review-tcf.zip

    本示例代码实现了Spring AOP的基础概念,并以静态代理和动态代理两种方式来展示其工作原理。 首先,我们要理解什么是代理设计模式。代理模式提供了一个接口,使得客户端可以通过这个接口与目标对象进行交互,而代理...

    2023版全新SSM框架实战精讲 视频教程 下载下载 因为太大存百度云盘1.zip

    042-spring-aop-代理模式和静态代理.mp4 043-spring-aop-动态代理模式.mp4 044-spring-aop-面向切面编程思想.mp4 045-spring-aop-aop8个核心名词理解.mp4 046-spring-aop-aop思维以及aop框架和代理技术的关系....

    spring-nested-aop.zip_aop_spring aop

    Spring AOP可以在运行时动态织入,也可以在编译时静态织入。 **2. 嵌套事务处理** - **事务传播行为(Transaction Propagation)**: 在Spring中,当一个事务方法调用另一个事务方法时,需要明确指定事务如何传播。...

    2023版全新SSM框架实战精讲 视频教程 下载下载 因为太大存百度云盘3.zip

    042-spring-aop-代理模式和静态代理.mp4 043-spring-aop-动态代理模式.mp4 044-spring-aop-面向切面编程思想.mp4 045-spring-aop-aop8个核心名词理解.mp4 046-spring-aop-aop思维以及aop框架和代理技术的关系....

    2023版全新SSM框架实战精讲 视频教程 下载下载 因为太大存百度云盘4.zip

    042-spring-aop-代理模式和静态代理.mp4 043-spring-aop-动态代理模式.mp4 044-spring-aop-面向切面编程思想.mp4 045-spring-aop-aop8个核心名词理解.mp4 046-spring-aop-aop思维以及aop框架和代理技术的关系....

    2023版全新SSM框架实战精讲 视频教程 下载下载 因为太大存百度云盘2.zip

    042-spring-aop-代理模式和静态代理.mp4 043-spring-aop-动态代理模式.mp4 044-spring-aop-面向切面编程思想.mp4 045-spring-aop-aop8个核心名词理解.mp4 046-spring-aop-aop思维以及aop框架和代理技术的关系....

    Spring_AOP

    在Spring AOP中,有两种代理方式:静态代理和动态代理。 1.1. 静态代理 在静态代理中,我们创建一个代理类,该代理类实现了与目标对象相同的接口,并在代理类的方法中添加额外的逻辑,如记录日志。这种方式的缺点...

    spring-cglib-repack-3.2.5.jar和spring-objenesis-repack-2.6.jar

    标题中的"spring-cglib-repack-3.2.5.jar"和"spring-objenesis-repack-2.6.jar"是两个与Spring框架相关的库文件,它们主要用于Spring框架的内部实现,尤其是针对Java对象的创建和代理机制。下面将详细解释这两个库的...

    Spring aop 之 静态代理 动态代理 Aspectj aop-config 等实现方式

    主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...

    代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)与SpringAOP的3种配置方式案例工程代码

    本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...

    Spring模拟aop静态代理案例

    通过阅读和分析这些代码,开发者可以直观地了解Spring AOP静态代理的工作原理,并将其应用到自己的项目中。 总结起来,这个案例旨在通过Spring AOP的静态代理模式,帮助开发者掌握如何在不改变原有业务逻辑的情况下...

    spring aop_aopalliance.jar_aspectjweaver.jar

    Spring AOP的实现主要分为两种方式:代理模式和织入。代理模式包括JDK动态代理和CGLIB代理,它们主要用于处理基于接口的类。如果目标对象实现了接口,Spring会使用JDK动态代理;如果没有,它会使用CGLIB生成一个代理...

    spring 4.* 缺少jar spring-cglib-repack-3.2.5.jar_spring-objenesis-repack-2.6.jar

    这两个文件是Spring框架运行时的重要依赖,它们涉及到Spring的动态代理和对象创建机制。 首先,让我们来详细了解一下这两个jar文件的具体作用: 1. **spring-cglib-repack-3.2.5.jar**:CGLIB(Code Generation ...

    Spring AOP的静态代理和动态代理,转移到调用处理器一个集中的方法中处理.docx

    【Spring AOP的静态代理和动态代理】 在软件开发中,代理模式是一种常见的设计模式,它允许我们在不修改原有对象的基础上,对对象的行为进行增强。代理模式的核心思想是通过代理对象来控制对原始对象(也称为委托...

    Spring AOP里的静态代理和动态代理用法详解

    Spring AOP里的静态代理和动态代理用法详解 Spring AOP里的静态代理和动态代理用法详解是关于 Spring AOP里的静态代理和动态代理的详细介绍。代理是一种设计模式,通过创建一个代理对象来控制对委托类对象的直接...

    springAop默认代理方式.zip

    1. **静态代理**:Spring AOP 提供了两种代理方式,一种是静态代理,另一种是动态代理。静态代理是在编译时就确定了代理类,这种代理方式通常通过实现相同接口的方式创建。然而,Spring AOP默认并不使用静态代理,...

    Spring3.0AOP所需jar包

    描述中的“额外jar包”可能指的是如AspectJ的库,AspectJ是一个强大的静态和动态AOP框架,可以与Spring AOP集成。AspectJ的编译器(aspectjrt.jar和aspectjweaver.jar)用于在编译时或运行时织入切面,而...

    Spring框架AOP静态代理.pdf

    Spring框架AOP静态代理 AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在通过将横切关注点(如日志记录、事务管理等)从主业务逻辑中分离出来,提高代码的模块化和可维护性。 静态代理是在...

    Spring的静态代理和动态代理

    总结来说,Spring的静态代理和动态代理都用于实现AOP,静态代理适用于简单场景,但需要手动编写代理类,而动态代理则更加灵活,可以在运行时动态创建代理对象,适用于接口众多的情况。了解和掌握这两种代理模式对于...

Global site tag (gtag.js) - Google Analytics