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功能的封装与配置的小框架实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!