Java-JDK动态代理(AOP)使用及实现原理分析


AOP不是动态代理的缩写,而是Aspect Oriented Programming,面向切面编程,类似于servlet中的filter,这里的动态代理也是一个“过滤器”,或者叫“切面”,凡是从这里经过的方法都要被这个代理的InvocationHandler增强一下,不管是个什么方法。
DynamicProxy动态代理模式,这套视频里只讲了JDK中利用java反射机制的方式完成的动态代理。因为底层机制的缘故,被代理的目标类必须实现至少一个接口才行。
自己编写的InvocationHandler的子类就相当于方法的过滤器,当你用这个handler作为参数去创建被代理的目标对象的代理对象时,调用代理对象的方法的时候就会通过这个方法过滤器进行增强。所以如果不用条件控制一下的话,确实所有的方法执行过程都会被这个handler处理。
说到这里就要说回“切面”了,AOP使得这部分代理功能变成了一种过滤器一样的可插拔组件,所以当你需要增强的时候就用动态代理将这个handler的切面引入,当你不需要的时候就不引。要实现别的功能的话就引入别的handler。如果我所猜测的没错的话,这个动态代理机制复杂时也会像过滤器链(FilterChain)一样可以实现多层“嵌套”代理吧。通过这样的AOP技术,将方法的增强也独立出一层可插拔的组件,达到低耦合的效果,妙哉。 


 上面有不少基础错误哦, 本身一个普通接口和一个实现类,对其进行代理加强,那么Proxy生成的代理类是包含了原方法和对该方法的增强内容的,比如一个 interface People{public String work();}
老师实现了接口重写方法
public class Teacher implements People{

@Override
public String work() {
System.out.println("老师教书育人...");
return "教书";
}
}

那这时候需要一个代理类实现 InvocationHandler接口, 实现invoke方法
Object invoke = method.invoke(obj, args); 这里就是原teacher实现类方法被调用 在其前后添加自定义操作, 那么在main方法中,对teacher ,WorkHandler(people)实例化 就可以拿到 创建代理类的参数 直接生成代理类 Proxy proxy=Proxy.newProxyInstance(handler.getClass().getClassLoader(), teacher.getClass().getInterfaces(), handler); 调用一下? proxy.work(); 没有任何问题

 

第一章:代理的介绍

介绍:我们需要掌握的程度

动态代理(理解) 基于反射机制

掌握的程度:

1.什么是动态代理?

2.动态代理能够做什么?

后面我们在用Spirng和Mybatis的时候,要理解怎么使用的.

1.什么是代理?

代理,在我们日常生活之中就有体现,代购,中介,换ip,商家等等.

比如有一家美国的大学,可以对全世界招生.留学中介(代理 )

留学中介(代理):帮助这家美国的学校招生,中介是学校的代理中介是代替学校完成招生功能
代理特点

  1. 中介和代理他们要做的事情是一致的:招生
  2. 中介是学校代理,学校是目标
  3. 家长-------->中介(学校介绍,办理入学手续)---------->美国学校
  4. 中介是代理,收取费用

2.为什么要找中介

为什么要找中介?
1.中介是专业的,方便.
2.家长现在不能自己去找学校。家长没有能力访问学校.或者美国学校不接收个人来访

买东西都是商家卖, 商家是某个商品的代理, 你个人买东西,肯定不会让你接触到厂家的.

第二章:静态代理

2.1 使用代理模式的作用

  1. 功能增强:在你原有的功能上,增加了额外的功能.新增加的功能,叫做功能增强
  2. 控制访问:代理类不让你访问目标,例如商家不让用户访问厂家

2.2 实现代理的方式

1.静态代理:

1)代理类是自己手工实现的,自己创建一个java类,表示代理类

2)同时你所要代理的目标

特点:1)实现简单2)容易理解。
模拟一个用户购买u盘的行为。
用户是客户端类
商家:代理,代理某个品牌的u盘。
厂家:目标类。
三者的关系:用户(客户端)-—-商家(代理)-—-厂家(目标)
商家和厂家都是卖u盘的,他们完成的功能是一致的,都是卖u盘。

实现步骤:

实现步骤
1.创建一个接口,定义卖u盘的方法,表示你的厂家和商家做的事情
2.创建厂家类,实现1步骤的接口
3.创建商家,就是代理,也需要实现1步骤中的接口
4.创建客户端类,调用商家的方法买一个u盘

2.3 具体实现

实现步骤
1.创建一个接口,定义卖u盘的方法,表示你的厂家和商家做的事情

package com.rango.service;
public interface usbSell {
    /**
     * 定义一个方法 参数 amount:表示一次购买的数量,暂时不用
     * 返回值表示一个u盘的价格
     * @param amount
     * @return
     */
    float sell(int amount);
}

2.创建厂家类,实现1步骤的接口

package com.rango.factory;

import com.rango.service.usbSell;
//目标类:金士顿厂家,不接受用户的单独购买
public class UsbKingFactory implements usbSell {
    /**
     * 定义一个方法 参数 amount:表示一次购买的数量,暂时不用
     * 返回值表示一个u盘的价格
     *
     * @param amount
     * @return
     */
    @Override
//一个128G的U盘是85元.
//    后期根据amount,可以实现不同的价格,例如10000个,单击是80,50000个75
    public float sell(int amount) {
        return 85.0f*amount;
    }
}

3.创建商家,就是代理,也需要实现1步骤中的接口

package com.rango.business;

import com.rango.factory.UsbKingFactory;
import com.rango.service.usbSell;


//淘宝是一个商家,代理金士顿U盘的销售
public class TaoBao implements usbSell {
//      声明 商家代理的厂家具体是谁
    private UsbKingFactory factory =new UsbKingFactory();

    @Override
//    实现销售U盘功能
    public float sell(int amount) {
//        向厂家发送订单,告诉厂家,我买了U盘,厂家发货
//        发送给工厂,我需要的订单,返回报价
        float price = factory.sell(amount);
//        商家需要加价也就是代理要增加价格
        price = price + 25;
//在目标类的方法调用后,你做的其他功能,都是增强的意思
        System.out.println("淘宝再给你返回一个优惠券,或者红包");
//        增加的价格
        return price;
    }
}

4.创建客户端类,调用商家的方法买一个u盘

import com.rango.business.TaoBao;

public class shopMain {
    public static void main(String[] args){
//             创建代理的商家淘宝对象
        TaoBao taoBao = new TaoBao();
//        我只向淘宝买一件产品,得到报价
        float price = taoBao.sell(2);
        System.out.println("购买一件产品.淘宝的报价为: "+price);
    }
}

所以我们再次总结代理类完成的功能:

  1. 目标类中方法的调用
  2. 功能增强

所属我们只有一个代理商,我们实际上可以写多个代理商,

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kjshuan

点个赞就好啦!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值