个人笔记分享:代理模式

结构型模式包括:代理模式、桥接模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式。

代理模式的好处?

可以增强原类的功能,在函数执行前后做一些额外的操作。

代理模式的种类?

动态代理和静态代理。

静态代理和动态代理的区别?

静态代理需要我们自己写一个代理类。

动态代理系统自动帮我们生成一个代理类。

静态代理是在编译期间就需要完成的,相当于每个类都要创建一个代理类,这样的代码冗余量很大。

JDK提供的动态代理要求类实现invokationHandler接口,然后在运行时才去创建代理类,解决了静态代理代码冗余的问题。

静态代理的例子?

写一个接口,然后被代理类实现接口,代理类也实现接口。

// 定义一个名为Person的接口,其中包含一个名为doWork()的方法声明
interface Person {
    void doWork();
}

// 实现Person接口的Student类
class Student implements Person {
    // 重写doWork()方法以提供其实现
    public void doWork() {
        System.out.println("学习");  // 当方法被调用时打印"学习"
    }
}

// 同样实现Person接口的StartWorkingBoy类,该类有一个Person类型的成员变量
class StartWorkingBoy implements Person {
    private Person person;  // 类型为Person的成员变量,用于引用

    // 构造函数,初始化person成员变量
    public StartWorkingBoy(Person person) { this.person = person; }

    // 重写doWork()方法以提供其实现
    @Override 
    public void doWork() {
        System.out.println("找到一份工作");  // 当方法被调用时打印"找到一份工作"
        person.doWork();  // 调用person对象的doWork()方法
        System.out.println("开始挣钱养家------");  // 在调用doWork()后打印额外的信息
     }
}

动态代理有几种?

jdk动态代理和spring动态代理。

jdk动态代理的例子

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        List<String> proxyInstance = (List<String>) Proxy.newProxyInstance(list.getClass().getClassLoader(), list.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("开始执行" + method.getName());
                if (method.getName().equals("toString")) {
                    System.out.println("特殊方法");
                }
                // 必须是原对象
                Object invoke = method.invoke(list, args);
                System.out.println("结束执行" + method.getName());
                return invoke;
            }
        });
        proxyInstance.add("xxx");
        System.out.println(proxyInstance);
    }

spring底层是如何抉择使用哪种动态代理的?

由于反射已经被优化了,jdk动态代理速度也很快了,所以实现了接口的话,使用jdk动态代理,不然使用cglib。

全部评论

相关推荐

神哥不得了:神哥来啦~日常实习投递时间,个人建议是在4-5月进行投递,6月应该面试会比较多,更HR稍微商量一下完全可以到放暑假的时间。专业技能先把和Java强相关的加上,比如JVM、JUC、MySQL、Redis等,然后再写计算机基础等。项目先写项目描述,然后技术栈,最后是亮点,记得写上项目的时间
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务