MySpring-AOP动态代理实现简易Spring框架

今天心情好,就分享一个用AOP动态代理技术搭建简易的spring框架吧
首先,说说思路吧,
AOP动态代理:目的是 将一个类 在不修改源码的情况下,通过产生它的代理类实现在原有方法上添加自己的功能。

java的动态代理类是 java.lang.reflect.Proxy,他有一个静态方法 newProxyInstance()返回一个代理类,
需要传三个参数,代理类的类加载器,代理类实现的接口们,和 调用处理器。
代理类和目标类的类加载器一致,并且实现同一接口,调用处理器用匿名内部类实现。

OK,我们要封装一个方法,当用户调用这个方法时,我们返回他想要的代理类。
那么,需要的参数有 目标类 和 用户想要添加的功能(因为java不能传方法所以我们用接口代替)

OK,照着上面的思路来写代码:
ProxyFactoryBean.java

public Object getProxy(Object target,Advice advice){
Object obj = Proxy.newProxyInstance(
target.getClass().getClassLoader();
target.getClass().getInterfaces();
new InvocationHandler() {
public Object invoke(Object proxy,Method method,Object[] args) throws Exception{
advice.before(method);
Object result = method.invoke(target,args);
advice.after(method);
return result;
}
}
);
return obj;
}

OK,框架的核心函数算是实现了。
接下来创建一个 Advice接口,用来供 用户自定义 要添加的功能
public interface Advice {
void before(Method method)throws Exception;
void after(Method method)throws Exception;
}
OK,接下来还需要上面呢? 
当用户使用我们的框架的时候,他只需通过更改配置文件就可以达到使用代理类或者不使用代理类,
配置文件是什么样呢?
config.properties 当用户想用ArrayList类时注释掉第二行;想用ArrayList代理类时注释掉第一行。
#xxx=java.util.ArrayList
xxx=gc.aop.bean.ProxyFactoryBean
xxx.advice=gc.aop.advice.MyAdvice
xxx.target=java.util.ArrayList

所以我们还要一个用户加载配置文件的类:
public class FactoryBean {
//用于 读取用户配置文件信息
Properties prop = new Properties();
public FactoryBean(InputStream ips) throws Exception{
prop.load(ips);
}
// 传入用户想要 得到的 目标类对应的key (.properties文件中 key=value)
public Object getBean(String name) {
String className = prop.getProperty(name);
Object bean = null;
try {
Class clazz = Class.forName(className);
bean = clazz.newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//如果 是ProxyFactoryBean就意味着用户 配置的是代理类
if(bean instanceof ProxyFactoryBean) {
Object proxy = null;
ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;
try {
Advice advice =(Advice) Class.forName(prop.getProperty(name+".advice")).newInstance();
Object target = Class.forName(prop.getProperty(name+".target")).newInstance();
proxyFactoryBean.setAdvice(advice);
proxyFactoryBean.setTarget(target);
proxy = ProxyFactoryBean.getProxy(target, advice);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return proxy;
}
//返回 原 目标类
return bean;
}

}


ps.关于AOP动态代理详解,链接:https://blog.csdn.net/qq_26295547/article/details/79774976


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值