Spring Aop 代理
AOP 面向切面编程 底层就是 动态代理模式 代理模式是java中常用的设计模式。
特点为: 1 委托类和代理类有相同的接口,或共同的父类(保证使用一样的方法)
2 代理类为委托类负责处理消息,并将消息转发给委托类。
3 代理类并不是真正的实现者而是通过调用委托类的方法来实现功能。
代理 分为 静态代理和动态代理。
静态代理:
由程序员或者特定的工具自动生成了源代码,在程序运行之前 .class文件已经存在了。
静态代理实现时:需要一个接口和两个实现类(一个做目标对象,一个为代理对象)。
动态代理:在程序运行期间,通过反射的方法动态的创建出来的!
动态代理分为 GDK动态代理 和 Cglib动态代理。
GDK动态代理可以实现接口。
Cglib可以实现父类和接口。
静态代理
接口
public interface Subject {
public void request();
}
实现类(目标对象)
public class RealSubject implements Subject {
public void request() {
System.out.println("okokok");
}
}
实现类(代理对象)
public class ProxySubject implements Subject {
public ProxySubject() {
}
private RealSubject realSubject;//目标对象
public void request() {
System.out.println("write log");
realSubject.request();
}
public RealSubject getRealSubject(RealSubject realSubject) {
return this.realSubject;
}
public void setRealSubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
}
test
public class TestSubject {
@Test
public void t1(){
RealSubject realSubject=new RealSubject();//实例化目标对象
ProxySubject proxy=new ProxySubject();//实例化代理对象
proxy.setRealSubject(realSubject); //在代理对象中传入被 代理的目标对象
proxy.request();
}
}
GDK动态代理 (实现接口)
接口
public interface IUserDao {
public void addUser();
}
实现类
public class IUserDapimpl implements IUserDao {
public void addUser() {
System.out.println("添加成功111111111111111111111");
}
}
test测试类 (在测试的时候 建立的代理类)
jdk的动态代理时需要知道 一个类Proxy 一个接口InvocationHandler(java.lang.reflect)
接口下只有一个方法
public Object invoke(object proxy ,Method method ,Object【】args );
object proxy 代理类 Method method 被代理的方法 Object【】args 被代理的方法的参数列表
Proxy 类
public static Object newProxyInstance(ClassLoader loder ,Class<?> [ ] interfaces ,InvocationHandler h ){
ClassLoader loder 类加载器 Class<?> [ ] interfaces 代理类实现的所有接口 h 接口的一个实例 ,this 当前对象 因为我们想使用jdk动态代理 必须是代理类实现 InvocationHandler 他让我们传递的是父接口 我们也可以穿自身 this
}
01.我们不确定代理类的类型 使用 Object
02. 给一个委托类返回一个代理对象‘
03 实现系统级业务和主业务的交互
public class MyTest {
public static void main(String[] args) {
//jdk的动态代理
final IUserDapimpl dao=new IUserDapimpl();
//02. 给一个委托类返回一个代理对象‘
IUserDao log = (IUserDao) Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(), new InvocationHandler() / this {
//03 实现系统级业务和主业务的交互
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("write log");
Object result = method.invoke(dao, args);
return result;
}
});
//调用方法 log.addUser();
}
}
Cglib动态代理 (实现接口 /继承 父类)
接口
public interface Animal {
public void eat();
public void sleep();
}
委托类(dog 目标对象)
public class Dog implements Animal {
public void eat() {
System.out.println("狗狗吃饭");
}
public void sleep() {
System.out.println("狗狗睡觉");
}
}
代理类 (CglibProxy)
Cglib 有也有一个类和一个接口
接口 MethodInterceptor 方法拦截器
MethodInterceptor implements callback { callback为空
Object intercept(Object obj ,Method method ,Object [ ]args ,MethodProxy proxy);
}
Enhancer类
设置委托类和代理类的公共的父类
public void setSupperClass(Class supperclass){
}
代理类执行完毕通知 委托类
public void setCallback(final CallBack callback){
set Callbacks (new Callback [ ] { callback / this })
}
在 Enhander类的父类 AbstractClassGraderatior 中有一个方法
创建我们需要的代理类
Protected Object create (Object key)
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method;
/**
* Enhancer 一个类 :创建我们需要的代理类 关联 代理类和委托类
*
* MethodInterceptor:方法拦截器 是一个接口
* intercept 是所有拦截器的执行方法,类似于JDK动态代理的中的invoke
*/ public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer=new Enhancer();
//创建代理类对象
public Object createProxy(Class clazz){
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("主人叫你"); Object result = methodProxy.invokeSuper(o, objects);
System.out.println("主人离开"); return result;
}
}
test 测试类
public class Test {
public static void main(String[] args) {
CglibProxy cglibProxy=new CglibProxy();
Animal proxy = (Animal)cglibProxy.createProxy(new Dog().getClass());
proxy.eat();
proxy.sleep();
}
}
Spring Aop 代理的更多相关文章
- Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误)
Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误) 问题: 今天在用AfterReturningAdvice时,a ...
- jdk动态代理与cglib代理、spring aop代理实现原理
原创声明:本博客来源与本人另一博客[http://blog.csdn.net/liaohaojian/article/details/63683317]原创作品,绝非他处摘取 代理(proxy)的定义 ...
- jdk动态代理与cglib代理、spring aop代理实现原理解析
原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...
- 何为代理?jdk动态代理与cglib代理、spring Aop代理原理浅析
原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...
- jdk动态代理与cglib代理、spring Aop代理原理-代理使用浅析
原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...
- Spring AOP /代理模式/事务管理/读写分离/多数据源管理
参考文章: http://www.cnblogs.com/MOBIN/p/5597215.html http://www.cnblogs.com/fenglie/articles/4097759.ht ...
- java代理课程测试 spring AOP代理简单测试
jjava加强课程测试代码 反射. 代理 .泛型.beanUtils等 项目源码下载:http://download.csdn.net/detail/liangrui1988/6568169 热身运动 ...
- java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总
若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...
- Spring AOP 代理类,BeanNameAutoProxyCreator cglib
BeanNameAutoProxyCreator支持拦截接口和类,但不支持已经被jdk代理过的类$Proxy8.使用cglib才能代理,如下 <!-- 通过bean的名字来匹配选择要代理的bea ...
- spring AOP 代理机制、执行过程、四种实现方式及示例详解
1.加载过程 spring首先检测配置文件中的代理配置,然后去加载bean; 如果配置文件中没有配置代理,自然代理不会生效,如果配置了代理,但是代理还没有生效,那么有可能是加载顺序的问题,即在检测到代 ...
随机推荐
- Spark Mllib之分层抽样
Spark中组件Mllib的学习之基础概念篇 1.解释 分层抽样的概念就不讲了,具体的操作: RDD有个操作可以直接进行抽样:sampleByKey和sample等,这里主要介绍这两个 (1)将字符串 ...
- 创建vue项目的时候遇到:PhantomJS not found on PATH
1.提示找不到PhantomJS需要进行下载,如果网速允许的话可以直接 npm install -g phantomjs 如果网速不给力的话,那就先进行淘宝镜像安装 npm install -g cn ...
- 分词、词性标注POS等学习【转载】
转自:https://cloud.tencent.com/developer/article/1091815 1. 分词(Word Cut) 英文:单词组成句子,单词之间由空格隔开 中文:字.词.句. ...
- char varchar
对于字符类型的有:char:固定长度,存储ANSI字符,不足的补英文半角空格.nchar:固定长度,存储Unicode字符,不足的补英文半角空格varchar:可变长度,存储ANSI字符,根据数据长度 ...
- jenkins 邮箱配置---腾讯企业邮箱
一,简单设置 1.登陆jenkins--> 系统管理 ---> 系统设置 2.邮箱就是发送者的邮箱,密码是登陆邮箱的密码 3.设置完以后,可以点击‘test configuration’, ...
- 利用Tensorflow实现神经网络模型
首先看一下神经网络模型,一个比较简单的两层神经. 代码如下: # 定义参数 n_hidden_1 = 256 #第一层神经元 n_hidden_2 = 128 #第二层神经元 n_input = 78 ...
- python class 1
//test.py class Employee: 'all employee' empCount = 0 def __init__(self, name, salary): self.name = ...
- js中两个!!的理解
在js中经常有两个!!出现,经常让人难以理解 (function () { var a = 10; var b = 20; function add(num1, num2) { var num1 = ...
- JAVA编程思想学习笔记2-chap4-6-斗之气2段
1.foreach:只能用于数组与容器 2.this指针:内部有个指针指向自己 3.super指针:内部有个指针指向父类部分 4.方法存放于代码区:方法调用时,a.fun()可能会被转换为fun(a) ...
- sqli-labs(九)_COOKIE处注入
第二十关: 这关是一个Cookie处的注入,输入正确的账号密码后,会跳到index.php页面,如下图 这个时候再访问登陆页面的时候http://localhost/sqli-labs-master/ ...