search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

被評為最沒價值的程序猿居然能實現AOP功能的封裝與配置的小框架?

內容

java基礎鞏固筆記 - 實現AOP功能的封裝與配置的小框架

設計(目錄):

XXX = java.util.ArrayList中

代碼

Advice介面

MyAdvice類

BeanFactory類

ProxyFactoryBean類

AopFrameWorkTest類

輸出

本文通過是動態代理實現的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介面

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);

}

MyAdvice類

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));

}

}

BeanFactory類

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;

}

}

ProxyFactoryBean類

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;

}

}

AopFrameWorkTest類

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;

}

}

輸出

  • 配置

xxx=com.iot.proxy.aopframework.ProxyFactoryBean

輸出為:

com.sun.proxy.$Proxy0clear before at 0clear cost total 0

  • 配置

xxx=java.util.ArrayList

輸出為:

java.util.ArrayList

可以看出,只改變配置文件,就可改變代碼的運行結果,從而達到靈活的效果



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦