代理模式(网上找的资料注释学习)

代理模式分为三种:

1.静态代理

静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类(代理类实现接口).

//接口类

public interface IUserDao {
    void save();

}

//被代理类

public class UserDao implements IUserDao{

    @Override

    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("数据已经保存!");
    }
 

}

0b6a6c53-88bc-499c-90ab-4ae551ee74e9

 

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("已经保存事务");
    }

}

//生成代理类

b9533e53-aaa4-4110-a4ce-fba7c5012cf6

e1a56d45-a255-428c-b3c2-b02f151426c7

//测试类

public class App {
    public static void main(String[] args) {
        //目标对象
        UserDao target =new UserDao();
        //代理对象
        UserDao p= (UserDao) new ProxyFactory(target).getProxyInstance();
        //执行代理对象的方法
        p.save();
    }

}

实现了MethodInterceptor接口,会将被代理类的方法进行拦截,然后再织入逻辑织入.

 

 

转载于:https://my.oschina.net/u/3744319/blog/1595079

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值