SpringAOP实现(原理)
动态代理:在程序运行时,运用反射机制动态创建而成。
UserService :
*
* @Description 目标接口
* @author huyuangui@aliyun.com
* @time 2015年1月9日 下午2:28:00
* @version 1.0.0
*/
public interface UserService {
/**
* 根据ID删除用户
* @param id
* @return
*/
public String deleteUser(String id);
}
UserService实现类 :
/**
* @Description UserService实现类
* @author huyuangui@aliyun.com
* @time 2015年1月9日 下午2:28:31
* @version 1.0.0
*/
public class UserServiceImpl implements UserService {
public String deleteUser(String id) {
System.out.println("实现类修改ID前"+id);
System.out.println("实现类修改ID为1111");
id="1111";
return id;
}
}
JDK动态代理实现:
测试类:
Cglib动态代理 :
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
package com.gillion.aop.cglib;
/**
* @Description BOOK 普通java
* @author huyuangui@aliyun.com
* @time 2015年1月9日 下午2:51:40
* @version 1.0.0
*/
public class Book {
public String test(String id)
{
System.out.println("Book更改id前id:"+id);
id="123456";
System.out.println("Book更改id=123456");
return id;
}
}
代理类:BookCglib
package com.gillion.aop.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* @Description Cglib代理Book(普通java)
* @author huyuangui@aliyun.com
* @time 2015年1月9日 下午3:17:03
* @version 1.0.0
*/
public class BookCglib implements MethodInterceptor {
private Object target;
/**
* 创建代理对象
*
* @param target
* @return
*/
public Object getInstance(Object target) {
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target.getClass());
// 回调方法
enhancer.setCallback(this);
// 创建代理对象
return enhancer.create();
}
// 回调方法
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("Cglib事物开始");
System.out.println("Cglib设置第一个参数为1");
if(args!=null)
args[0]="1";
Object result=proxy.invokeSuper(obj, args);
System.out.println("Cglib调用后---返回结果:"+result);
System.out.println("Cglib改变返回结果:654321");
result="654321";
System.out.println("Cglib事物结束");
return result;
}
}
测试类:
最新文章
- 使用t-sql从身份证号中提取生日
- 管理员 修改MySQL 5.7.9 新版本的root密码方法以及一些新变化整理
- 【转】MyBatis学习总结(一)——MyBatis快速入门
- Xcode7设置生成DSYM出现大量警告
- Common Lisp第三方库介绍 | (R "think-of-lisper" 'Albertlee)
- linux 命令实现原理
- MD5加盐 Java加密算法
- media query 单位
- 在ubuntu上搭建交叉编译环境---arm-none-eabi-gcc
- spark按某几列删除dataframe重复行
- 将JPA出参Iterable转为List
- 菜鸟教程之学习Shell script笔记(下)
- linux上如何设置网络,出现connect: network is unreachable 的问题。
- Power Network POJ - 1459 [网络流模板]
- 大型Vuex应用程序的目录结构
- Pitch detection algorithm(基音搜索算法)PDA相关链接
- MySQL表中的数据类型
- List集合中的对象按照某个字段去重实现
- 2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6(8/13)
- android bundle 对象 序列化
热门文章
- mysql实战之 批量update
- iOS 如何在一个已经存在多个project的workspace中引入cocoapods管理第三方类库
- Mifare系列3-卡的能源和数据传递(转)
- Best 3D Modeling software under Ubuntu
- Qt5 installation and path configuration
- Java知识积累2-StringReverse实现文字(单词)倒叙输出
- sublime-text3 3059基本配置
- Asp.Net_<;%%>;模式常用语法
- C# 基础知识总结
- php: 不能嵌套try-catch-fnally,否则执行时间过长