代理模式分为三种:ide
1.静态代理测试
静态代理在使用时,须要定义接口或者父类,被代理对象与代理对象一块儿实现相同的接口或者是继承相同父类(代理类实现接口).this
//接口类.net
public interface IUserDao {
void save();代理
}code
//被代理类对象
public class UserDao implements IUserDao{继承
public void save() {
System.out.println("数据已经保存!");
}事务
}
//代理类
public class UserDaoProxy implements IUserDao{
private IUserDao target;
public UserDaoProxy(IUserDao target){
this.target=target;
}
@Override
public void save() {
System.out.println("开启事务");
target.save();
System.out.println("提交事务");
}
}
//测试类
public class App {
public static void main(String[] args) {
UserDao target=new UserDao();
UserDaoProxy userDaoProxy=new UserDaoProxy(target);
userDaoProxy.save();
}
}
2.动态代理
1.代理对象,不须要实现接口
2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(须要咱们指定建立代理对象/目标对象实现的接口的类型)
3.动态代理也叫作:JDK代理,接口代理
(建立一个工厂类动态生成代理对象,将织入逻辑织入接口方法)
//接口类
public interface IUserDao {
void save();
}
public class UserDao implements IUserDao {
@Override
public void save() {
System.out.println("数据已经保存!");
}
}
public class App {
public static void main(String[] args) {
//目标对象
IUserDao target =new UserDao();
//给目标对象,建立代理对象
IUserDao proxy= (IUserDao) new ProxyFactory(target).getProxyInstance();
//执行方法
proxy.save();
}
}
总结:代理对象不用实现接口,可是目标对象必定要实现接口
3.Cglib代理
静态代理和动态代理模式都是要求目标对象是实现一个接口的目标对象,可是有时候目标对象只是一个单独的对象,并无实现任何的接口,这个时候就能够使用以目标对象子类的方式类实现代理,这种方法就叫作:Cglib代理
(将代理类视为被代理类的子类对象)
1.须要引入cglib的jar文件,可是Spring的核心包中已经包括了Cglib功能,因此直接引入pring-core-3.2.5.jar
便可.
2.引入功能包后,就能够在内存中动态构建子类
3.代理的类不能为final,不然报错
4.目标对象的方法若是为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法.
//被代理类
public class UserDao {
public void save(){
System.out.println("已经保存事务");
}
}
//生成代理类
//测试类
public class App {
public static void main(String[] args) {
//目标对象
UserDao target =new UserDao();
//代理对象
UserDao p= (UserDao) new ProxyFactory(target).getProxyInstance();
//执行代理对象的方法
p.save();
}
}
实现了MethodInterceptor接口,会将被代理类的方法进行拦截,而后再织入逻辑织入.