package cn.itcast.spring3;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; /**
* JDK的动态代理的机制
* @author zhongzh
*
*/
public class JDKProxy implements InvocationHandler{//写了一个代理对象
private UserDao userDao;//持有被代理对象的引用 public JDKProxy(UserDao userDao) {//在构造的时候传入被代理对象
super();
this.userDao = userDao;
}
public UserDao createProxy(){//对接口生成代理,返回被代理接口的代理
UserDao proxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), this);//InvocationHandler这里也可以使用匿名内部类 return proxy; }
//调用目标对象的任何一个方法都相当于调用invoke();这个方法都会执行.
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
if("add".equals(method.getName())){//增强add()方法
//记录日志
System.out.println("日志记录=============================================");//如果方法名是add(),记录日志
Object result = method.invoke(userDao, args);//记录日志之后执行添加用户的代码
//如果是add()方法那么在add()方法之前做了一个事情然后才执行add()方法.
return result;
}
return method.invoke(userDao, args);
}
}
package cn.itcast.spring3;
/**
* DAO的接口
* @author zhongzh
*
*/
public interface UserDao {
public void add();
public void update(); }
package cn.itcast.spring3;

public class UserDaoImpl implements UserDao {

    public void add() {
// TODO Auto-generated method stub
System.out.println("添加用户....");
} public void update() {
// TODO Auto-generated method stub
System.out.println("修改用户.....");
} }
package cn.itcast.spring3;

import org.junit.Test;

public class SpringTest1 {
@Test
public void demo1(){
UserDao userDao = new UserDaoImpl();
userDao.add();
userDao.update();
}
@Test
public void demo2(){
UserDao userDao = new UserDaoImpl();
UserDao proxy = new JDKProxy(userDao).createProxy();
proxy.add();
proxy.update();
}
}

day39-Spring 03-JDK的动态代理的更多相关文章

  1. Spring的两种动态代理:Jdk和Cglib 的区别和实现

    这是有意义的一天!自己研究一路畅通的感觉真爽 原理是参考大神的,代码手敲 一.原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处 ...

  2. Spring事务Transactional和动态代理(一)-JDK代理实现

    系列文章索引: Spring事务Transactional和动态代理(一)-JDK代理实现 Spring事务Transactional和动态代理(二)-cglib动态代理 Spring事务Transa ...

  3. Spring中的cglib动态代理

    Spring中的cglib动态代理 cglib:Code Generation library, 基于ASM(java字节码操作码)的高性能代码生成包 被许多AOP框架使用 区别于JDK动态代理,cg ...

  4. Spring AOP中的动态代理

    0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  Spring AOP中的动态代理机制 2.1  ...

  5. 浅谈Spring的AOP实现-动态代理

    说起Spring的AOP(Aspect-Oriented Programming)面向切面编程大家都很熟悉(Spring不是这次博文的重点),但是我先提出几个问题,看看同学们是否了解,如果了解的话可以 ...

  6. 基于 JDK 的动态代理机制

    『动态代理』其实源于设计模式中的代理模式,而代理模式就是使用代理对象完成用户请求,屏蔽用户对真实对象的访问. 举个最简单的例子,比如我们想要「FQ」访问国外网站,因为我们并没有墙掉所有国外的 IP,所 ...

  7. 转:Spring AOP中的动态代理

    原文链接:Spring AOP中的动态代理 0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  S ...

  8. spring---aop(4)---Spring AOP的CGLIB动态代理

    写在前面 前面介绍了Spring AOP的JDK动态代理的过程,这一篇文章就要介绍下Spring AOP的Cglib代理过程. CGLib全称为Code Generation Library,是一个强 ...

  9. Spring Boot实践——Spring AOP实现之动态代理

    Spring AOP 介绍 AOP的介绍可以查看 Spring Boot实践——AOP实现 与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改 ...

  10. spring(二)-反射、动态代理

    主要是对上一篇文章中涉及到的点做补充,欢迎指正! 1.  java反射知识-Spring IOC 依赖注入 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个 ...

随机推荐

  1. PAT甲级——A1020 Tree Traversals

    Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and i ...

  2. MySQL数据库 数据库的引擎,模式,数据类型(更新中...)

    数据库的引擎:驱动数据的方式-数据库优化 前提:引擎是建表的时候规定的,提供给表使用的,不是数据库 mysql> show engines #展示所有引擎 #几种比较常见的引擎 # innodb ...

  3. 2019.10.26 csp-s模拟测试88 反思总结

    今天的主人公是什么? 60.1K!!!! 先扔代码再更新防止我等会儿一上头不打算写完题解 T1: #include<iostream> #include<cstdio> #in ...

  4. 如何处理HTML5新标签的浏览器兼容问题?

    方法一 : 1.使用静态资源的html5shiv包 <!--[if lt IE9]> <script src="http://cdn.static.runoob.com/l ...

  5. Echarts 的简单使用

    http://echarts.baidu.com/index.html 直接用script引入从官网下载的echarts.js文件 官网的文件有几种版本的,按需下载即可,注意精简版的只显示折线.圆柱等 ...

  6. SPSS正交设计的操作

    SPSS正交设计的操作 设要做二因素的正交设计,A因素有三个水平,B因素有两个水平.则选择Data-->Orthogonal Design-->generate,弹出的就是正交设计窗口: ...

  7. re模块元字符

    #元字符在re模块中有特殊意义的字符,有:^ $. * + {} [] () | \ ^$ #表示开头结尾,注意:[^]表示取反 . #点,表示任意一个字符,包括空格(一个空白字符),\t(换行符). ...

  8. python 基础(while 循环、格式化输出、运算符、编码初识)

    while循环 break 终止当前循环 count = 1 while count < 3: print(count) count += 1 break # while循环中一旦代码执行到br ...

  9. 日志lombok插件安装及配置

    安装lombok插件 下载Lombok.jar http://projectlombok.googlecode.com/files/lombok.jar 运行Lombok.jar java -jar ...

  10. 2019-8-31-Developing-Universal-Windows-Apps-开发UWA应用-问答

    title author date CreateTime categories Developing Universal Windows Apps 开发UWA应用 问答 lindexi 2019-08 ...