ASP.Net+Android+IOS开发.Net培训期待与您交流!
工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换。其getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符串在配置文件中对象的类名不是ProxyFactoryBean,则直接返回该类的实例对象,否则,返回该实例对象的getProxy方法返回的对象。
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import SuperJava.Advice;
public class BeanFactory {
Properties pro = new Properties();
Object bean;
public BeanFactory(InputStream ips) {
try {
pro.load(ips);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Object getBean(String name){
String className = pro.getProperty(name);
Class clazz;
try {
clazz = Class.forName(className);
bean = clazz.newInstance();
if(bean instanceof ProxyFactoryBean){
ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;
Advice advice = (Advice)Class.forName(pro.getProperty(name+".advice")).newInstance();
Object target = Class.forName(pro.getProperty(name+".target")).newInstance();
proxyFactoryBean.setAdvice(advice);
proxyFactoryBean.setTarget(target);
Object proxy = proxyFactoryBean.getProperty();
return proxy;
}
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
}
BeanFactory的构造方法接收代表配置文件的输入流对象,配置文件格式如下:
#xxx= java.util.ArrayList//如果是普通类的话直接传入
xxx=报名.ProxyFactoryBean//如果是非普通类则传入代理类,并提供目标,通知信息。
xxx.target=java.util.ArrayList
xxx.advice= 报名.MyAdvice
xxx=java.util.ArrayList
xxx=aopframework.ProxyFactoryBean
xxx.advice=SuperJava.MyAdvice
xxx.target=java.util.ArrayList
ProxyFactoryBean充当封装生成动态代理的工厂,需要为工厂提供目标,通知参数信息
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import SuperJava.Advice;
public class ProxyFactoryBean {
private Object target;
private Advice advice;
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;
}
public Object getProperty() {
Object colInvoHand3 = 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.afterMethod(method);
return retVal;
}
}
);
return colInvoHand3;
}
}
编写客户端应用
编写实现Advice接口的类和在配置文件中进行配置
import java.lang.reflect.Method;
public class MyAdvice implements Advice {
long startTime ;
long eldTime ;
@Override
public void beforeMethod(Method method) {
// TODO Auto-generated method stub
startTime = System.currentTimeMillis();
System.out.println("从黑马开始学习了");
}
@Override
public void afterMethod(Method method) {
// TODO Auto-generated method stub
eldTime = System.currentTimeMillis();
System.out.println(method.getName()+"runing time is"+(eldTime-startTime));
System.out.println("从黑马毕业上班了");
}
}
调用BeanFactory获取对象
import java.io.InputStream;
import java.util.Collection;
public class AopFrameWorkTest {
/**
* @param args
*/
public static void main(String[] args) {
InputStream ips = AopFrameWorkTest.class.getResourceAsStream("config.properties");
Object bean = new BeanFactory(ips).getBean("xxx");
System.out.println(bean.getClass().getName());
((Collection)bean).clear();
}
}
运行结果
$Proxy0
从黑马开始学习了
clearruning time is0
从黑马毕业上班了