快速学会Spring动态代理原理

  

  本文主要是讲述快速学会Spring动态代理原理,更多Java技术知识,请登陆疯狂软件教育官网。

  一、为什么要使用动态代理

  当一个对象或多个对象实现了N中方法的时候,由于业务需求需要把这个对象和多个对象的N个方法加入一个共同的方法,比如把所有对象的所有方法加入事务这个时候有三种方法:

  方法一:一个一个对象一个一个方法去加,很显然这个方法是一个比较笨的方法。

  方法二:加一个静态代理对象将这个静态代理对象实现要加事务对象的接口。然后在静态代理对象里面每个方法里面加上事务。

  方法三:使用动态代理对象,进行动态的加载事务。

  使用动态代理是为了让对象实现了开闭原则,对扩展开放,而对修改关闭。Spring的AOP其实就是用了动态代理+IoC容器实现的

  二、代码实现。

  UserManger.java接口

  package com.tgb.spring;

  public interface UserManager {

  public void addUser(String username,String password);

  public void delUser(int userId);

  public String findUserById(int userId);

  public void modifyUser(int userId,String username,String password);

  }

  方法一 常规的做法:

  UserMangerImpl.Java

  package com.tgb.spring;

  public class UserManagerImpl implements UserManager {

  public void addUser(String username, String password) {

  checkSecurity();

  System.out.println("UserManager.addUser");

  }

  public void delUser(int userId) {

  checkSecurity();

  System.out.println("UserManager.delUser");

  }

  public String findUserById(int userId) {

  checkSecurity();

  System.out.println("UserManager.findUserById");

  return "张三";

  }

  public void modifyUser(int userId, String username, String password) {

  checkSecurity();

  System.out.println("UserManager.modifyUser");

  }

  private void checkSecurity(){

  System.out.println("checkSecurity");

  }

  }

  Client.java

  package com.tgb.spring;

  public class Client {

  /**

  * @param args

  */

  public static void main(String[] args) {

  UserManager userManager=new UserManagerImpl();

  userManager.addUser("11", "1231");

  }

  }

  方法三:动态代理

  UserManagerImpl.java与方法二的UserManagerImpl.java一样把UserManagerImplProxy.java删除

  新添一个类:

  SecurityHandler.java

  package com.tgb.spring;

  import java.lang.reflect.InvocationHandler;

  import java.lang.reflect.Method;

  import java.lang.reflect.Proxy;

  public class SecurityHandler implements InvocationHandler {

  private Object targetObject;

  public Object createProxyInstance(Object targetObject){

  this.targetObject=targetObject;

  return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),

  targetObject.getClass().getInterfaces(),

  this);

  }

  public Object invoke(Object proxy, Method method, Object[] args)

  throws Throwable {

  // TODO Auto-generated method stub

  checkSecurity();

  //调用目标方法

  Object ret=method.invoke(targetObject, args);

  return ret;

  }

  private void checkSecurity(){

  System.out.println("checkSecurity");

  }

  }

  Client.java

  package com.tgb.spring;

  public class Client {

  public static void main(String[] args) {

  SecurityHandler handler=new SecurityHandler();

  UserManager userManager=(UserManager)handler.createProxyInstance(new

  UserManagerImpl());

  userManager.addUser("zha", "123");

  }

  }

  三种方法的效果是一样的:

  三、总结。

  动态代理的利用给我们编码带来了很大的便利,解决了动态为对象提供服务的方案。动态代理+IoC容器的结合让我们对系统提供服务更加的方便了这样我们也就实现了开闭原则。这样也就能实现了对象想要的时候就有不用的时候就撤出全心全意为开发者服务。

  疯狂软件Java培训紧跟最新的Java潮流技术,国内首家讲解Java 8新特征,根据企业工作中需要的开发技术,让学员学习的课程是企业最需要的实用技术,而且也保障学员能把这些技能点学会、学好,并且疯狂软件教育的课程实时更新,在信息技术快速发展的情况下,可以保证学员学到更新更主流的技术。师资雄厚,教师均拥有8年以上的项目实践经验,疯狂软件Java课程是理论与实践相结合,这样保障了学员很好的掌握理论知识同时,也能根据理论的指导做好实际的工作。为了培养学生的实践能力,设置了很多项目实战课程,在这些课程中,学生可以体验真正的项目实战过程,从而更深刻地掌握知识。如需了解更多,请咨询QQ:544627560抢座热线:020-28309358 咨询QQ:707552864可登陆疯狂软件教育官网查询。微信搜索微信号:疯狂软件,参加2015年优惠活动,有机会获得优惠劵和代金劵。

时间: 2024-10-19 01:49:34

快速学会Spring动态代理原理的相关文章

Java动态代理原理

关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式    代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务.简单的说就是

设计模式 - 动态代理原理及模仿JDK Proxy 写一个属于自己的动态代理

本篇文章代码内容较多,讲的可能会有些粗糙,大家可以选择性阅读. 本篇文章的目的是简单的分析动态代理的原理及模仿JDK Proxy手写一个动态代理以及对几种代理做一个总结. 对于代理模式的介绍和讲解,网上已经有很多优质的文章,我这里就不会再过多的介绍了,这里推荐几篇优质的文章作为参考: 给女朋友讲解什么是代理模式 轻松学,Java 中的代理模式及动态代理 另外,我的 github 仓库对应目录中也有相关的基础示例代码:https://github.com/eamonzzz/java-advance

Spring 动态代理 之 but was actually of type 'com.sun.proxy.$Proxy14 Exception

今天在写Spring的引介代理的时候,报了一个错: Exception in thread "main" org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'inter1' is expected to be of type 'com.dengchengchao.springtest.intertest.Inter1Impl' but was actually of type 'co

spring动态代理的cglib方法

1.被代理类Person.java 1 package com.xiaostudy; 2 3 /** 4 * @desc 被代理类 5 * 6 * @author xiaostudy 7 * 8 */ 9 public class Person { 10 11 public void add() { 12 System.out.println("add()>>>>>>>>"); 13 } 14 15 public void update(

java动态代理原理及解析

代理:设计模式 代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 通过代理层这一中间层,有效的控制对于真实委托类对象的直接访问,同时可以实现自定义的控制策略(Spring的AOP机制),设计上获得更大的灵活性. java动态代理的类和接口(jdk1.6源码) 1,java.lang.reflect.Proxy:动态代理机制的主类,提供一组静态方法为一组接口动态的生成对

CGLib动态代理原理及实现

JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了.CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑.JDK动态代理与CGLib动态代理均是实现Spring AOP的基础. 简单的实现举例: 这是一个需要被代理的类,也就是父类,通过字节码技术创建这个类的子类,实现动态代理. [java] view plain copy public clas

【转】JDK动态代理原理

之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的,直到前几个星期才把这些问题全部搞明白了.     废话不多说了,先来看一下JDK的动态是怎么用的. Java代码   package dynamic.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.

JDK和cglib动态代理原理

本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Spring源码解析 https://blog.csdn.net/column/details/21851.html 部分代码会放在我的的Github:https://github.com/h2pl/ AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理. 转自https://www.jia

Java反射机制剖析(四)-深度剖析动态代理原理及总结

动态代理类原理(示例代码参见java反射机制剖析(三)) a)  理解上面的动态代理示例流程 a)  理解上面的动态代理示例流程 b)  代理接口实现类源代码剖析 咱们一起来剖析一下代理实现类($Proxy0)的源代码和整个动态代理的流程. $Proxy0生成的代码如下: import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; impo