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 代理的更多相关文章

  1. Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误)

    Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误) 问题: 今天在用AfterReturningAdvice时,a ...

  2. jdk动态代理与cglib代理、spring aop代理实现原理

    原创声明:本博客来源与本人另一博客[http://blog.csdn.net/liaohaojian/article/details/63683317]原创作品,绝非他处摘取 代理(proxy)的定义 ...

  3. jdk动态代理与cglib代理、spring aop代理实现原理解析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  4. 何为代理?jdk动态代理与cglib代理、spring Aop代理原理浅析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  5. jdk动态代理与cglib代理、spring Aop代理原理-代理使用浅析

    原创声明:本博客来源为本人原创作品,绝非他处摘取,转摘请联系博主 代理(proxy)的定义:为某对象提供代理服务,拥有操作代理对象的功能,在某些情况下,当客户不想或者不能直接引用另一个对象,而代理对象 ...

  6. Spring AOP /代理模式/事务管理/读写分离/多数据源管理

    参考文章: http://www.cnblogs.com/MOBIN/p/5597215.html http://www.cnblogs.com/fenglie/articles/4097759.ht ...

  7. java代理课程测试 spring AOP代理简单测试

    jjava加强课程测试代码 反射. 代理 .泛型.beanUtils等 项目源码下载:http://download.csdn.net/detail/liangrui1988/6568169 热身运动 ...

  8. java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总

    若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...

  9. Spring AOP 代理类,BeanNameAutoProxyCreator cglib

    BeanNameAutoProxyCreator支持拦截接口和类,但不支持已经被jdk代理过的类$Proxy8.使用cglib才能代理,如下 <!-- 通过bean的名字来匹配选择要代理的bea ...

  10. spring AOP 代理机制、执行过程、四种实现方式及示例详解

    1.加载过程 spring首先检测配置文件中的代理配置,然后去加载bean; 如果配置文件中没有配置代理,自然代理不会生效,如果配置了代理,但是代理还没有生效,那么有可能是加载顺序的问题,即在检测到代 ...

随机推荐

  1. linux中cmake语法的学习

    在linux 下进行开发很多人选择编写makefile 文件进行项目环境搭建,而makefile 文件依赖关系复杂,工作量很大,搞的人头很大.常常,写代码,效率才是王道.这里还有自动化的项目构建工具C ...

  2. 字符串类型 str-->转义符-->字符串格式化-->占位符-->综合案例

    # ###字符串类型 str """ 用引号起来的就是字符串 三种引号:单引号 双引号 三引号 """ """ ...

  3. [django]阅读笔记

    https://dwz.cn/FUcnVGi8 新建目录 django-admin.exe startproject myblog django-admin.exe startproject mybl ...

  4. openshift 配置ldap认证

    master主配置文件: ...... identityProviders: - challenge: true login: true mappingMethod: claim name: Ldap ...

  5. [转]Redis 数据结构简介

    Redis 数据结构简介 Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序集合 ...

  6. 6.C# 释放非托管资源2

    C# 释放非托管资源 C#中资源分为托管资源和非托管资源. 托管资源由垃圾回收器控制如何释放,不需要程序员过多的考虑(当然也程序员也可以自己释放). 非托管资源需要自己编写代码来释放.那么编写好的释放 ...

  7. 【cocos2d-js官方文档】事件分发监听机制(摘录)

    简介 游戏开发中一个很重要的功能就是交互,如果没有与用户的交互,那么游戏将变成动画,而处理用户交互就需要使用事件监听器了. 总概: 事件监听器(cc.EventListener) 封装用户的事件处理逻 ...

  8. cocos2dx 3.x(for 循环让精灵从中间往上下两边排列)

    最近很多游戏都喜欢房卡类的游戏,就是创建房间时(),选择玩法与规则,今天耗费2小时处理这个数学问题:例如选择规则两条,则背景框中间显示两条规则,若选择三条,则背景框中间显示三条规则与玩法,依次从中间往 ...

  9. java类的包装类

    包装类的基本用法 为什么需要包装类(Wrapper Class) java并不是纯面向对象的语言,java语言是一个面向对象的语言,但是java中的基本数据类型却不是面向对象的,但是我们在实际使用中经 ...

  10. RPC、RMI、SOAP、WSDL、HTTP、TCP/IP

    详情请参考 http://www.jb51.net/article/68971.htm