第一:定义通知规范,即接口
package com.itcast.proxy;
import java.lang.reflect.Method;
/**
* 模拟通知
* @author Administrator
*
*/
public interface Advice {
/**
* 前置通知
* @param method
*/
public void beforeAdvice(Method method);
/**
* 后置通知
* @param method
*/
public void afterAdvice(Method method);
}
第二步:实现通知
package com.itcast.proxy;
import java.lang.reflect.Method;
/**
* 实现通知接口
* @author Administrator
*
*/
public class AdviceImpl implements Advice {
private long beginTime;
private long endTime;
@Override
public void beforeAdvice(Method method) {
beginTime=System.currentTimeMillis();
}
@Override
public void afterAdvice(Method method) {
endTime=System.currentTimeMillis();
}
}
第三步:定义Bean工厂
package com.itcast.proxy;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* 模拟Spring工厂
* @author Administrator
*
*/
public class BeanFactory {
private Properties properties=new Properties();
public BeanFactory(InputStream ips) {//初始化加载配置文件
try {
properties.load(ips);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("资源加载完成.");
}
public Object getBean(String name){
Object bean=null;
try {
//实例化类
bean=Class.forName(properties.getProperty(name)).newInstance();
if(bean instanceof ProxyBeanFactory){//创建代理类
ProxyBeanFactory proxyBeanFactory=(ProxyBeanFactory)bean;
Object target=Class.forName(properties.getProperty(name+".target")).newInstance();
Advice advice=(Advice) Class.forName(properties.getProperty(name+".advice")).newInstance();
bean=proxyBeanFactory.getProxy(target,advice);
}
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
}
第四步:自定义动态代理类
package com.itcast.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 自定义代理类
* @author Administrator
*
*/
public class ProxyBeanFactory {
/**
* 获得代理类
* @param target 目标对象
* @param advice 通知对象
* @return
*/
public Object getProxy(final Object target, final Advice advice) {
Object proxy=Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
/**
* proxy:调用方法对象
* method:调用的方法
* args:方法调用时设置参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
advice.beforeAdvice(method);
Object retVal=method.invoke(target, args);
advice.afterAdvice(method);
return retVal;
}
});
return proxy;
}
}
第五步:创建配置文件proxy.properties,内容如下
#xxx=com.itcast.proxy.ProxyBeanFactory
xxx=java.util.ArrayList
xxx.advice=com.itcast.proxy.AdviceImpl
xxx.target=java.util.ArrayList
第六步:测试
package com.itcast.proxy;
import java.io.InputStream;
public class ProxyTest {
public static void main(String[] args) {
InputStream ips=ProxyTest.class.getResourceAsStream("proxy.properties");
Object bean=new BeanFactory(ips).getBean("xxx");
System.out.println(bean.getClass().getName());
}
}
测试1:使用配置文件中的xxx=java.util.ArrayList,即不创建代理类使用原类型
结果:资源加载完成.
java.util.ArrayList
测试2、使用xxx=com.itcast.proxy.ProxyBeanFactory,创建代理类
结果:资源加载完成.
com.sun.proxy.$Proxy0