本文通过是动态代理实现的AOP功能的封装与配置的小框架.加深对动态代理和AOP编程的理解
根据配置文件的键xxx对应的值(类全名)创建相应类的对象。
当且仅当xxx对应的值为com.iot.proxy.aopframework.ProxyFactoryBean时,则生成相应的动态代理类对象。代理对象的目标类和通知实现类分别由xxx.target和xxx.advice配置
config.propertiest位于aopframework包下
#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,有如下几个类/接口:
package com.iot.proxy.aopframework;import java.lang.reflect.Method;/** * Created by brian on 2016/2/2. */public interface Advice { void beforeMethod(Method method); void aftereMethod(Method method);}package com.iot.proxy.aopframework;import java.lang.reflect.Method;/** * Created by brian on 2016/2/2. */public class MyAdvice implements Advice{long beginTime = 0 ;@Override public void beforeMethod(Method method) {System.out.println(method.getName()+" before at "+beginTime);beginTime = System.currentTimeMillis();}@Override public void aftereMethod(Method method) {long endTime = System.currentTimeMillis();System.out.println(method.getName()+" cost total "+ (endTime-beginTime));}}package com.iot.proxy.aopframework;import java.io.IOException;import java.io.InputStream;import java.util.Properties;/** * Created by brian on 2016/2/2. */public class BeanFactory {Properties properties = new Properties();public BeanFactory(InputStream inputStream){try {properties.load(inputStream);}catch (IOException e) {e.printStackTrace();}}public Object getBean(String name){String className = properties.getProperty(name);Object bean = null;try {Class clazz = Class.forName(className);bean = clazz.newInstance();}catch (ClassNotFoundException e) {e.printStackTrace();}catch (InstantiationException e) {e.printStackTrace();}catch (IllegalAccessException e) {e.printStackTrace();}if (bean instanceof ProxyFactoryBean){ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;Advice advice = null;Object target = null;try {advice = (Advice) Class.forName(properties.getProperty(name+".advice")).newInstance();target = Class.forName(properties.getProperty(name+".target")).newInstance();}catch (InstantiationException e) {e.printStackTrace();}catch (IllegalAccessException e) {e.printStackTrace();}catch (ClassNotFoundException e) {e.printStackTrace();}proxyFactoryBean.setAdvice(advice);proxyFactoryBean.setTarget(target);Object proxy = ((ProxyFactoryBean) bean).getProxy();return proxy;}return bean;}}package com.iot.proxy.aopframework;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * Created by brian on 2016/2/3. */public class ProxyFactoryBean {private Object target;private Advice advice;public Object getProxy(){Object proxy = Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {advice.beforeMethod(method);Object retVal = method.invoke(target,args);advice.aftereMethod(method);return retVal;}});return proxy;}public Object getTarget() {return target;}public void setTarget(Object target) {this.target = target;}public Advice getAdvice() {return advice;}public void setAdvice(Advice advice) {this.advice = advice;}}package com.iot.proxy.aopframework;import java.io.InputStream;import java.util.Collection;/** * Created by brian on 2016/2/3. */public class AopFrameWorkTest {public static void main(String[] args) {InputStream inputStream = AopFrameWorkTest.class.getResourceAsStream("config.properties");Object bean = new BeanFactory(inputStream).getBean("xxx");System.out.println(bean.getClass().getName());((Collection) bean).clear();}}输出为:
com.sun.proxy.$Proxy0
clear before at 0
clear cost total 0
输出为:
java.util.ArrayList
可以看出,只改变配置文件,就可改变代码的运行结果,从而达到灵活的效果
以上就是本文关于Java实现AOP功能的封装与配置的小框架实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!