String Aop 动态代理例子

动态代理原理:spring AOP采用动态代理来实现

(1)定义一个接口Boy

package aop001;

public interface Boy {
    public void beat(String time);

    public void play(String time);
}

(2)定义两个类实现Boy接口:

Boy_1

package aop001;

public class Boy_1 implements Boy {

    @Override
    public void beat(String time) {
        System.out.println("我是boy1");
        System.out.println(time+"敲代码");
    }

    @Override
    public void play(String time) {
        System.out.println("我是boy1");
        System.out.println(time+"玩游戏");
    }

}

Boy_2

package aop001;

public class Boy_2 implements Boy{

    @Override
    public void beat(String time) {
        System.out.println("我是boy2");
        System.out.println(time+"敲代码");
    }

    @Override
    public void play(String time) {
        System.out.println("我是boy2");
        System.out.println(time+"玩游戏");
    }

}

(3)定义一个动态代理类并实现InvocationHandler接口

package aop001;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class BoyInvocationHandler implements InvocationHandler {
    //定义一个Object对象,保存目标
    private Object targer;// 目标是不固定

    //添加构造方法,可以通过构造方法给target赋值
    public BoyInvocationHandler(Object targer) {
        this.targer = targer;
    }

    //非核心业务的代码由动态代理来管理
    //定义一个前置任务的方法
    private void before(){
        // 前置任务
        System.out.println("[代理执行前置]起床");
        System.out.println("[代理执行前置]刷牙洗脸");
        System.out.println("[代理执行前置]吃饭");
        System.out.println("*****************");
    }

    //定义一个后置任务的方法
    private void after(){
        // 后置任务
        System.out.println("*****************");
        System.out.println("[代理执行后置]洗澡");
        System.out.println("[代理执行后置]睡觉");
        System.out.println("");
    }

    //调用invoke方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //调用前置任务的方法
        before();
        //获取类里面的方法的返回值
        Object returnValue=method.invoke(targer, args);
        //调用后置任务的方法
        after();

        return returnValue;
    }

}

(4)新建一个Test测试类

package aop001;

import java.lang.reflect.Proxy;

public class Test {

    public static void main(String[] args) {
        //第一步:创建目标实现类的实例
        Boy b1=new Boy_1();
        Boy b2=new Boy_2();

        //第二步:创建一个动态代理类(CEO 首席执行官)
        BoyInvocationHandler handler1 = new BoyInvocationHandler(b1);
        BoyInvocationHandler handler2 = new BoyInvocationHandler(b2);

        //第三步:创建动态代理(跟静态代理一样,申明的变量仍然是目标的接口)
        Boy girlProxy1 = (Boy) Proxy.newProxyInstance(
                                    b1.getClass().getClassLoader(),
                                    b1.getClass().getInterfaces(),
                                    handler1);
        //调用方法
        girlProxy1.beat("周六");
        girlProxy1.play("周日");

        Boy girlProxy2 = (Boy) Proxy.newProxyInstance(
                                    b2.getClass().getClassLoader(),
                                    b2.getClass().getInterfaces(),
                                    handler2);
        girlProxy2.beat("周六");
        girlProxy2.play("周日");

    }

}

(5)运行结果:

[代理执行前置]起床
[代理执行前置]刷牙洗脸
[代理执行前置]吃饭
*****************
我是boy1
周六敲代码
*****************
[代理执行后置]洗澡
[代理执行后置]睡觉

[代理执行前置]起床
[代理执行前置]刷牙洗脸
[代理执行前置]吃饭
*****************
我是boy1
周日玩游戏
*****************
[代理执行后置]洗澡
[代理执行后置]睡觉

[代理执行前置]起床
[代理执行前置]刷牙洗脸
[代理执行前置]吃饭
*****************
我是boy2
周六敲代码
*****************
[代理执行后置]洗澡
[代理执行后置]睡觉

[代理执行前置]起床
[代理执行前置]刷牙洗脸
[代理执行前置]吃饭
*****************
我是boy2
周日玩游戏
*****************
[代理执行后置]洗澡
[代理执行后置]睡觉

(6)当我们需要更改非核心代码时,我们只要更改一处就可以了。

谢谢!

时间: 2024-08-25 17:31:38

String Aop 动态代理例子的相关文章

详解 spring AOP 动态代理

通过例子查看,首先建立一个实现动态代理的接口Interface1.java,代码如下: package my.spring.fuck.aoptest; public interface Interface1 { public void say_hello(); } 很简单的一个接口,然后定义一个这个接口的实现类MyImple.java,代码: package my.spring.fuck.aoptest; public class MyImple implements Interface1{ @

动态代理 例子

package xinhuiji_day09 **********************************定义代理类**********************************************import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;//动态代理public class MyInvocationHandl

spring aop 动态代理批量调用方法实例

今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常.因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候要批量调用这些同名方法,我觉得这里可以发展成有潜力的代码. 推送比较好做数据,队友们都写好代码,但是有个问题,方法要的值都大致相同,封装的方式不一致,多人开发,有的封装对象里面,有的直接使用 Map.get(),唉,一千个人一千个哈姆雷特嘛,只好利用反射和动态代理节省自己的代码量,而且这种方式练练手

JDK动态代理例子

JDK动态代理的代理类必须实现于接口.如果要代理类,则使用CGLIB代理. 先定义一个接口: public interface Character { public void show(); } 接着定义一个类: public class A implements Character{ @Override public void show() { // TODO Auto-generated method stub System.out.println("this is A"); }

.Net 框架实现AOP(动态代理实现AOP,本文为翻译)

在上一节,我们将静态实现AOP,但是对于一个大型项目,要想为每个类,每个方法都去实现AOP ,进行日志记录和权限验证似乎是不可能的. 即使可能对于成百上千个类维护,也是很难维护.所以今天的主题就是如标题所述. (Real Proxy)真正代理和(Dynamic Proxy)动态代理 Real Proxy 类是个抽象类,定义在 System.Runtime.Remoting.Proxies,定义了代理的一些公共的基本的功能方法. Dynamic Proxy 类必须继承Real Proxy,通过重写

AOP动态代理

Aspect Oriented Programming  面向切面编程.解耦是程序员编码开发过程中一直追求的.AOP也是为了解耦所诞生. 具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流. AOP 在Spring框架中被作为核心组成部分之一,的确Spring将AOP发挥到很强大的功能.最常见的就是事务控制.工作之余,对于使用的工具,不免需要了解其所以然.学习了一下,写了些程序帮助理解. AOP 主要是利用代理模式的技术来实现的. 1.静态代理:就是设计模式中的pr

Spring AOP动态代理

出现org.springframework.aop.framework.ProxyFactoryBean cannot be cast to 错误 在类型转换的时候, 调用getObject()方法,再对ProxyFactoryBean进行转换 xml文件 <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy><!--使用cglib动态代理--> <be

Spring总结七:AOP动态代理的实现

Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类. 首先我们来用代码简单演示jdk动态代理: 现在有一个商品的增删改查的操作 /** * 商品操作接口 */ public interface ProductService { public void add(); public void edit(); public void delte(); public void select(); } /** * 实现类 */ public class Pr

Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理. JDK动态代理 JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只能为接口创建代理实例. 如果被代理目标没有接口那么Spring也无能为力,Spring通过Java的反射机制生成被代理接口的新的匿名实现类. JDK动态代理具体实现原理: 通过实现InvocationHandlet接口创建自己的调用处理器: 通过为Proxy类指定ClassLoader对象和一组in