Java实现AOP功能的封装与配置的小框架实例代码
本文通过是动态代理实现的AOP功能的封装与配置的小框架.加深对动态代理和AOP编程的理解
设计
根据配置文件的键xxx对应的值(类全名)创建相应类的对象。
当且仅当xxx对应的值为com.iot.proxy.aopframework.ProxyFactoryBean时,则生成相应的动态代理类对象。代理对象的目标类和通知实现类分别由xxx.target和xxx.advice配置
配置文件
config.propertiest位于aopframework包下
- xxx代表要加载的类
- xxx.advice代表通知接口的某个实现类
- xxx.target代表委托类
#xxx=java.util.ArrayList
xxx=com.iot.proxy.aopframework.ProxyFactoryBean
xxx.advice=com.iot.proxy.MyAdvice
xxx.target=java.util.ArrayList
包:com.iot.proxy.aopframework,有如下几个类/接口:
- BeanFactory,用于读取配置文件,根据配置创建相应的对象
- ProxyFactoryBean,用于生成代理对象,含有两个私有属性:目标和通知
- Advice,通知接口,用于把切面的代码以对象的形式传递给InvocationHandler的的invoke方法
- MyAdvice,Advice接口的一个实现类,打印执行方法前的时间及执行耗时
- AopFrameWorkTest,测试效果
代码
Advice接口
packagecom.iot.proxy.aopframework; importjava.lang.reflect.Method; /** *Createdbybrianon2016/2/2. */ publicinterfaceAdvice{ voidbeforeMethod(Methodmethod); voidaftereMethod(Methodmethod); }
MyAdvice类
packagecom.iot.proxy.aopframework; importjava.lang.reflect.Method; /** *Createdbybrianon2016/2/2. */ publicclassMyAdviceimplementsAdvice{ longbeginTime=0; @Override publicvoidbeforeMethod(Methodmethod){ System.out.println(method.getName()+"beforeat"+beginTime); beginTime=System.currentTimeMillis(); } @Override publicvoidaftereMethod(Methodmethod){ longendTime=System.currentTimeMillis(); System.out.println(method.getName()+"costtotal"+(endTime-beginTime)); } }
BeanFactory类
packagecom.iot.proxy.aopframework; importjava.io.IOException; importjava.io.InputStream; importjava.util.Properties; /** *Createdbybrianon2016/2/2. */ publicclassBeanFactory{ Propertiesproperties=newProperties(); publicBeanFactory(InputStreaminputStream){ try{ properties.load(inputStream); } catch(IOExceptione){ e.printStackTrace(); } } publicObjectgetBean(Stringname){ StringclassName=properties.getProperty(name); Objectbean=null; try{ Classclazz=Class.forName(className); bean=clazz.newInstance(); } catch(ClassNotFoundExceptione){ e.printStackTrace(); } catch(InstantiationExceptione){ e.printStackTrace(); } catch(IllegalAccessExceptione){ e.printStackTrace(); } if(beaninstanceofProxyFactoryBean){ ProxyFactoryBeanproxyFactoryBean=(ProxyFactoryBean)bean; Adviceadvice=null; Objecttarget=null; try{ advice=(Advice)Class.forName(properties.getProperty(name+".advice")).newInstance(); target=Class.forName(properties.getProperty(name+".target")).newInstance(); } catch(InstantiationExceptione){ e.printStackTrace(); } catch(IllegalAccessExceptione){ e.printStackTrace(); } catch(ClassNotFoundExceptione){ e.printStackTrace(); } proxyFactoryBean.setAdvice(advice); proxyFactoryBean.setTarget(target); Objectproxy=((ProxyFactoryBean)bean).getProxy(); returnproxy; } returnbean; } }
ProxyFactoryBean类
packagecom.iot.proxy.aopframework; importjava.lang.reflect.InvocationHandler; importjava.lang.reflect.Method; importjava.lang.reflect.Proxy; /** *Createdbybrianon2016/2/3. */ publicclassProxyFactoryBean{ privateObjecttarget; privateAdviceadvice; publicObjectgetProxy(){ Objectproxy=Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), newInvocationHandler(){ @Override publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{ advice.beforeMethod(method); ObjectretVal=method.invoke(target,args); advice.aftereMethod(method); returnretVal; } } ); returnproxy; } publicObjectgetTarget(){ returntarget; } publicvoidsetTarget(Objecttarget){ this.target=target; } publicAdvicegetAdvice(){ returnadvice; } publicvoidsetAdvice(Adviceadvice){ this.advice=advice; } }
AopFrameWorkTest类
packagecom.iot.proxy.aopframework; importjava.io.InputStream; importjava.util.Collection; /** *Createdbybrianon2016/2/3. */ publicclassAopFrameWorkTest{ publicstaticvoidmain(String[]args){ InputStreaminputStream=AopFrameWorkTest.class.getResourceAsStream("config.properties"); Objectbean=newBeanFactory(inputStream).getBean("xxx"); System.out.println(bean.getClass().getName()); ((Collection)bean).clear(); } }
输出
- 配置xxx=com.iot.proxy.aopframework.ProxyFactoryBean
输出为:
com.sun.proxy.$Proxy0
clearbeforeat0
clearcosttotal0
- 配置xxx=java.util.ArrayList
输出为:
java.util.ArrayList
可以看出,只改变配置文件,就可改变代码的运行结果,从而达到灵活的效果
总结
以上就是本文关于Java实现AOP功能的封装与配置的小框架实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!