老师讲得Spring框架还是挺简单易懂的。
对于Spring,我自己的理解是,在面向AOP编程的时候,我们需要用代理来完成。代码也不难。项目总共有四个Java文件,一个properties文件。篇幅有限。我这里只贴出来2个主要Java文件。一个是有main函数的Java文件,一个是代理的Java文件。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
/**
* Spring框架
* @author Administrator
*
*/
public class Spring {
public static void main(String args[])throws IOException {
InputStream in = null;
//in = new FileInputStream("F:\\workspace\\JavaWorkSpace\\workspace\\text\\src\\Spring.property");
in = Spring.class.getClassLoader().getResourceAsStream("pro.properties");
JavaBeanFactory factory = new JavaBeanFactory(in);
Collection al = (Collection)factory.receive("XXX");
al.add("sfdsf");
System.out.println(al);
in.close();
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyJavaBean {
private Advice advice;
private Object target;
public Advice getAdvice() {
return advice;
}
public void setAdvice(Advice advice) {
this.advice = advice;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public Object getProxy() {
Proxy proxy = null;
proxy = (Proxy)Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object arg0, Method method, Object[] arg2)
throws Throwable {
// TODO Auto-generated method stub
advice.beforeMethod(method);
Object reval = method.invoke(target, arg2);
advice.afterMethod(method);
return reval;
}
});
return proxy;
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyJavaBean {
private Advice advice;
private Object target;
public Advice getAdvice() {
return advice;
}
public void setAdvice(Advice advice) {
this.advice = advice;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public Object getProxy() {
Proxy proxy = null;
proxy = (Proxy)Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object arg0, Method method, Object[] arg2)
throws Throwable {
// TODO Auto-generated method stub
advice.beforeMethod(method);
Object reval = method.invoke(target, arg2);
advice.afterMethod(method);
return reval;
}
});
return proxy;
}
}
思考与感悟:我看老师视频的时候,感觉很容易。当我自己写的时候还是有点磕磕碰碰的。不过还好。主要的知识点就是熟悉Proxy代理类。因为前面有很大篇幅的反射,所以理解起来还是比较容易的。但是老师的代码中的目标类是ArrayList,是一个实现了接口的类,代理类只要取跟他相同的接口就可以了。但是老师没有实现当目标类没有实现接口的情况。