Spring框架的AOP的底层实现之JDK的动态代理(代码了解,理解原理)
1.创建接口UserDao:
package com.huida.demo1;
public interface UserDao {
public void save();
public void update();
}
2.创建实现接口的类UserDaoImpl:
package com.huida.demo1;
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("保存用户...");
}
@Override
public void update() {
System.out.println("修改用户...");
}
}
3.编写代理对象类:
package com.huida.demo1; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; /*
* 传一个对象返回一个代理对象
*/
public class MyProxyUtils { public static UserDao getProxy(UserDao dao){//这里传的参数为最大的接口,所以凡是它的子类均可传入,范围更大
//使用proxy类生成代理对象
/*
* 参数:
* loader:类加载器 dao.getClass().getClassLoader
* interfaces:接口 子类对象获取它所实现的接口
* h:回调函数
*/
UserDao proxy=(UserDao) Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(),new InvocationHandler() { //回调函数:代理对象一执行,invoke方法就会执行
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//System.out.println("aaaaaaaaaa");
//对功能进行增强
if("save".equals(method.getName())){
System.out.println("记录日志...");
}
return method.invoke(dao, args);
}
});
//返回代理对象
return proxy;
}
}
4.编写测试代码:
package com.huida.demo1;
import org.junit.Test;
public class demo1 {
@Test
public void run1(){
UserDao dao=new UserDaoImpl();
dao.save();
dao.update();
System.out.println("-------------------");
//使用工具类获取代理对象
UserDao proxy=MyProxyUtils.getProxy(dao);//MyProxyUtils是UserDao的一个子类
//每调用一次接口里面的方法,就会一次回调代理对象中的方法
proxy.save();
proxy.update();
}
}
5.单元测试run1方法,运行结果为:

通过回调函数对函数功能进行了增强,在保存用户之前输出了“记录日志”。
Spring框架的AOP的底层实现之JDK的动态代理(代码了解,理解原理)的更多相关文章
- Spring框架的AOP的底层实现
1. Srping框架的AOP技术底层也是采用的代理技术,代理的方式提供了两种 1. 基于JDK的动态代理 * 必须是面向接口的,只有实现了具体接口的类才能生成代理对象 2. 基于CGLIB动态代理 ...
- 使用spring框架进行aop编程实现方法调用前日志输出
aop编程 之使用spring框架实现方法调用前日志输出 使用spring框架实现AOP编程首先需要搭建spring框架环境: 使用Spring框架实现AOP工程编程之后,不需要我们去写代理工厂了,工 ...
- Spring框架之AOP源码完全解析
Spring框架之AOP源码完全解析 Spring可以说是Java企业开发里最重要的技术.Spring两大核心IOC(Inversion of Control控制反转)和AOP(Aspect Orie ...
- Spring框架的AOP技术(注解方式)
1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * sp ...
- 10.Spring——框架的AOP
1.Spring 框架的 AOP 2.Spring 中基于 AOP 的 XML架构 3.Spring 中基于 AOP 的 @AspectJ 1.Spring 框架的 AOP Spring 框架的一个关 ...
- Spring 框架的 AOP 简介
Spring 框架的 AOP Spring 框架的一个关键组件是面向方面的编程(AOP)(也称为面向切面编程)框架. 面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点. 跨一个应用程序的多 ...
- Spring框架的AOP编程,最通俗的语言解释,易懂易学
第七章:AOP技术 前言: AOP技术是根据动态代理设计模式进行的技术.动态代理技术分jdk动态代理和cglib动态代理 jdk动态代理特点: (1)继承java.lang.reflect.proxy ...
- 十 Spring的AOP的底层实现:JDK动态代理和Cglib动态代理
SpringAOP底层的实现原理: JDK动态代理:只能对实现了接口的类产生代理.(实现接口默认JDK动态代理,底层自动切换) Cglib动态代理(类似Javassist第三方的代理技术):对没有实现 ...
- AOP的底层实现:JDK动态代理与Cglib动态代理
转载自 https://www.cnblogs.com/ltfxy/p/9872870.html SpringAOP底层的实现原理: JDK动态代理:只能对实现了接口的类产生代理.(实现接口默认JDK ...
随机推荐
- Java笔试基础01
单例模式主要作用是保证在Java应用程序内,一个类只有一个实例存在. 手写单例 1.较为安全的写法 public class Singleton01{ private static Singleton ...
- [Python] numpy.random.rand
numpy.random.rand numpy.random.rand(d0, d1, ..., dn) Random values in a given shape. Create an array ...
- mysql 分片
MySQL Fabric(分片) 是一个用于管理 MySQL 服务器群的可扩展框架.该框架实现了两个特性 — 高可用性 (HA ) 以及使用数据分片的横向扩展.这两个特性既可以单独使用,也可以结合使 ...
- UVA350-水题
#include<iostream> using namespace std; int main() { int c = 0; int Z, L, I, M; while (cin > ...
- lb集群lvs的3种模式
Cluster原理 集群的总类: 1.负载均衡集群(LB:Load Banlancing):实现将一个访问量或者任务量特别大的应用,给他 平均分配到不同的服务器上面,以提供高容量.大并发. 2.高可用 ...
- sql 随机取数
Sql server: select top 10 * from 表 order by newid()Access: SELECT top 10 * FROM 表 ORDER BY ...
- SqlServer——触发器
一:触发器基本知识 1.首先必须明确以下几点: 触发器是一种特殊的存储过程,但没有接口(输入输出参数),在用户执行Inserted.Update.Deleted 等操作时被自动触发: 当触发的SQL ...
- JS获取最终样式
在使用jqery时,操作什么都很方便,比如获取CSS样式,直接.css加样式名就可以获取你要的,但是JS,就麻烦点,因为有兼容问题,要做兼容,而jqery都是做好了的, 下面就是使用JS获取CSS样式 ...
- 简单的socket_server 和 socket_client(实现文件的上传功能)
socket_server 客户端程序 import socket, os, json class Ftcplient(object): def __init__(self): "" ...
- UI5-文档-4.15-Nested Views
我们的面板内容变得越来越复杂,现在是时候将面板内容移动到一个单独的视图中了.使用这种方法,应用程序结构更容易理解,应用程序的各个部分可以重用. Preview The panel content is ...