代理模式:为另一个对象提供一个替身或占位符控制对这个对象的访问。
使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。
mybatis 就是利用了动态代理,调用接口是 其实生成了一个代理类,通过调用接口的方法名称早配置文件里选择要执行的sql 语句。
日志管理:为重要的接口方法统一加日志记录。
代理模式主要是控制对象的行为,装饰者是增加对象的额外行为,适配器是同一接口,他们虽然相似,但是意图不一样。
静态代理:
public class Student {
public void havaLesson() {
System.out.println("我找人替我上课 ,我先去吃饭了");
}
}
public class StudentProxy {
private Student student;
public StudentProxy(Student student) {
super();
this.student = student;
}
public void havaLesson() {
System.out.println("我替他上课了");
student.havaLesson();
}
public static void main(String[] args) {
StudentProxy s = new StudentProxy(new Student());
s.havaLesson();
}
}
动态代理 : 实际的代理类在运行时创建出来的。
public interface Lesson {
String a = "aa";
void havaLesson();
}
public class Student implements Lesson{
public void havaLesson() {
System.out.println("我找人替我上课 ,我先去吃饭了");
}
}
public class DynnamicStudentProxy implements InvocationHandler{
public DynnamicStudentProxy(Object object) {
super();
this.object = object;
}
private Object object;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Lesson s = (Lesson) proxy;
System.out.println(s.a);
Object result = method.invoke(object, args);
return result;
}
public static void main(String[] args) {
DynnamicStudentProxy sd = new DynnamicStudentProxy(new Student());
Lesson s = (Lesson) Proxy.newProxyInstance(DynnamicStudentProxy.class.getClassLoader(),new Class[] {Lesson.class}, sd);
Class<?>[] csc = s.getClass().getInterfaces();
System.out.println(s.getClass().getName());
for(Class c : csc) {
System.out.println(c.getName());
}
s.havaLesson();
while(true);
}
}