本文通過是動態代理實現的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功能的封裝與配置的小框架實例代碼的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!