今天是学习Spring的第二天,看到了AOP,即AspectOrientedProgramming 面向切面编程,

JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例。下面我就用一个实例演示面向切面编程中动态代理的过程。

首先把需要的类引入进来

User类:

package com.spring.model;
public class User {private String userName;private String password;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

接口UserDao:

package com.spring.dao;
import com.spring.model.User;
public interface UserDao {public void save(User u);public void delete();
}

UserDaoImpl:

package com.spring.dao.impl;
import com.spring.dao.UserDao;
import com.spring.model.User;
public class UserDaoImpl implements UserDao{public void save(User u) {System.out.println("user saved !");}public void delete(){System.out.println("delete ok !");}
}

好了,下面我们要做的事就是写出一个UserDaoImpl类的动态代理类,这个代理类实现的功能是在调用UserDaoImpl类方法的时候提示该方法已经开始执行的语句。代理类LogInterceptor,他实现了InvocationHandler接口

package com.spring.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class LogInterceptor implements InvocationHandler {private Object target; //接收被代理类的对象public Object getTarget() {return target;}public void setTarget(Object target) {this.target = target;}public void beforeMethod(Method m){System.out.println(m.getName()+" start !");}public Object invoke(Object proxy, Method method, Object[] args)  throws Throwable {beforeMethod(method);method.invoke(target, args);return null;}
}

在接口方法invoke(Object proxy, Methodmethod, Object[] args)里,将目标类实例传给method.invoke()方法,通过反射调用目标类方法。最后就是生成代理类对象并初始化,调用方法查看结果,完成切面编程的过程。以junit进行单元测试,代码如下

@Test
public void taestProxy(){UserDao userDao = new UserDaoImpl();LogInterceptor li = new LogInterceptor();li.setTarget(userDao);//为编织了目标业务类逻辑和横切逻辑的LogInterceptor创建代理类UserDao proxy = (UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), li);proxy.save(new User());proxy.delete();
}

上面的代码完成了业务类代码和横切代码编织和接口代理实例生成的工作,其中在li.setTarget(userDao)处,我们将LogInterceptor实例编织为一个包含业务逻辑和横切逻辑实例,然后在newProxyInstance处,通过Proxy的静态方法newProxyInstance()为融合了业务类逻辑和横切逻辑的LogInterceptor创建一个UserDao接口的代理实例,该方法的第一个入参为类加载器,第二个入参为创建的代理实例所要实现的一组接口,第三个参数是整合了业务逻辑和横切逻辑的编织器对象。简言之这三个参数分别是UserDaoImpl的类加载器、UserDao接口、实现了代理的类LogInterceptor对象,此时UserDaoImpl是被代理的对象

运行结果如下


Spring动态代理实现相关推荐

  1. 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)

    AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...

  2. 【Spring源码三千问】Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy?

    Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy? 前言 版本约定 正文 例子测试 结论分析 proxyTargetClass 标识的校正 哪些接口不是 Reas ...

  3. 从一个Spring动态代理Bug聊到循环依赖

    文章目录 Bug复现 结论 @PostConstruct的在Bean的生命周期的哪一步 一般代理类的生成时机在生命周期的哪一步 解决办法 两个思路 1.不生成代理类 2.在生成代理类之后再进行数据的初 ...

  4. spring动态代理实现计算器

    2019独角兽企业重金招聘Python工程师标准>>> 1.ArithmeticCalculator.java package com.huanlgiusong.spring.aop ...

  5. spring 动态代理_分析动态代理给 Spring 事务埋下的坑

    前言 Spring的声明式事务让我们不在编写获得连接.关闭连接.开启事务.提交事务.回滚事务等代码,通过一个简单的@Transactional注解,就让我们轻松进行事务处理.我们知道Spring事务基 ...

  6. Spring动态代理机制理解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  7. Spring动态代理原理是什么?

    动态代理的两种模式 jdk动态代理    //基于实现接口 Cglib动态代理   //基于方法的继承 ????????啥东西 这就不得不提到 静态代理了: 说得高大上,其实就是写一个增强类继承被增强 ...

  8. spring动态代理

    学习spring中的动态代理首先你要了解什么是动态代理,例子: 假设我们现在在外工作,要租房子,因为房东不在家里,但是房东找了中介管理房间,只要给我钱就行了,看图,租房是一个接口  ,房东和中介都要实 ...

  9. Spring动态代理使用

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-// ...

  10. spring 动态代理 原理

    动态代理可以在不修改被代理对象源码的情况下,为代理对象添加其他的逻辑功能,可以使用继承和组合两种方式实现,但是那样如果被代理对象很多的情况下实现是不太可能的. 首先,新建一个类,实现Invocatio ...

最新文章

  1. 深度神经网络(DNN)的正则化
  2. 微软职位内部推荐-Principal Software Developer
  3. 岗位内推 | 字节跳动招聘NLP、计算机视觉、推荐算法实习生
  4. TensorFlow2-高层API接口Keras
  5. 【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式
  6. Linux: 传参数给alias
  7. UI界面排版搞不定 ?看看这些优秀的实例模板,可临摹学习!
  8. python 安装容易吗,Python安装的步骤操作其实是件很容易的事
  9. Django实战1-权限管理功能实现-10:用户管理
  10. Vue-Access-Control:前端用户权限控制解决方案
  11. [py]py常用模块小结
  12. weblogic下载安装
  13. 知乎热议20年科研怪状:为何论文创新性越强越难发表,跟风修修补补反而更容易发?
  14. python编写登录脚本_python实现的登录和操作开心网脚本分享
  15. 开源美狐美颜SDK功能代码分析
  16. [Geek Challenge 2022]Web部分 writeup by q1jun
  17. 计算机网络 四、五层协议体系结构-----数据链路层
  18. 产业经济学-习题汇总
  19. 数据库八(数据库恢复技术)
  20. 控制系统仿真技术(二)-连续系统的数字仿真二

热门文章

  1. 广东大学计算机基础教材,21世纪高等学校计算机公共基础课规划教材:大学计算机基础(第2版)...
  2. Spring Cloud Alibaba 基础教程:支持的几种服务消费方式(RestTemplate、WebClient、Feign)
  3. 软件开发成本估算方法
  4. 保护电路:简单的限流保护电路图
  5. java 机器学习资源整理
  6. codeBook背景建模
  7. opencv codebook背景减除
  8. 湖州南浔张静江:“满堂花醉三千客,一剑霜寒四十州”
  9. unity3d 游戏模型中世纪场景素材
  10. 数据库----如何将oracle语句转换成mysql语句