spring 模拟之 aop

书接上回,上一次我们介绍了spring的ioc,并对它进行了简单的模拟工作,这一次我们模拟一下aop,原理其实很简单,就是利用代理类。下面我们进行代理类的讲解

首先定义一个Handler实现InvocationHandler

package com.dingjianlei.aop;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

/**

* @auth dingjialei 模拟aop 切面

*/

public class MyinvocationHandler implements InvocationHandler {

private Object target;

/**

* @param o

*/

public void setTarget(Object o) {

this.target = o;

}

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

// TODO Auto-generated method stub

Extend.beforeExtend();

Object result = method.invoke(target, args);

Extend.afterExtend();

return result;

}

}

接着定义一个代理工厂MyProxyFactory,并设置增强来模拟aop

package com.dingjianlei.aop;

import java.lang.reflect.Proxy;

/**

* @author dingjianlei 代理工厂类获取代理对象static 方法

*/

public class MyProxyFactory {

public static Object getObject(Object target) {

MyinvocationHandler MyinvocationHandler = new MyinvocationHandler();

MyinvocationHandler.setTarget(target);

Object o = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),

MyinvocationHandler);

return o;

}

}

package com.dingjianlei.aop;

public class Extend {

public static void beforeExtend(){

System.out.println("前置增强");

}

public static void afterExtend(){

System.out.println("后置增强");

}

}

下面我们开始运用代理来解耦实现aop

我们定义一个接口Car,给出它的实现类Aodi,

package com.dingjianlei.aop;

public class Aodi implements Car {

private String name;

public Aodi(String name) {

this.name = name;

}

public String getCarName() {

// TODO Auto-generated method stub

System.out.println("car---name");

return name;

}

}

package com.dingjianlei.aop;

public interface Car {

public String getCarName();

}

最后测试一下

package com.dingjianlei.aop;

public class AopTest {

public static void main(String[] args) {

Car car=new Aodi("222");

Car proxyCar = (Car) MyProxyFactory.getObject(car);

proxyCar.getCarName();

}

}

以上就是我们模拟的spring的aop,原理就是我们对一个类进行代理,用它的代理类进行增强,这样我们不需要对原有的类进行拓展。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值