代码模块 private static String postTitle = "Collection框架之ConcurrentHashMap"; private static String urlTitle = "jdk-ConcurrentHashMap"; private static String categories = "[Collection]"; private static String tags = "[Java, collection]"; private static String folder = "java" + File.separator + "collection"+ File.separator + "content"; private static String number = "01";
JDK 动态代理有一个最致命的问题是其只能代理实现了接口的类,CGLIB 动态代理机制就可以避免这个限制。 CGLIB(Code Generation Library)是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。CGLIB 通过继承方式实现代理。 很多知名的开源框架都使用到了CGLIB, 例如 Spring 中的 AOP 模块中:如果目标对象实现了接口, 则默认采用 JDK 动态代理,否则采用 CGLIB 动态代理。
在静态代理中我们需要对哪个接口和哪个被代理类创建代理类,所以我们在编译前就需要代理类实现与被代理类相同的接口, 并且直接在实现的方法中调用被代理类相应的方法;但是动态代理则不同,我们不知道要针对哪个接口、 哪个被代理类创建代理类,因为它是在运行时被创建的。也就是:JDK静态代理是通过直接编码创建的, 而JDK动态代理是利用反射机制在运行时创建代理类的。
如果搭建了maven私服,那么需要将项目基础脚手架,或者依赖项目上传到私服,供其他人下载使用, 备份一下配置,后续快速复用~
MQ如何选型
在传统的Java应用中,bean的生命周期很简单。使用Java关键字new进行bean实例化,然后该bean就可以使用了。 一旦该bean不再被使用,则由Java自动进行垃圾回收。
微服务体系相关文章目录汇总
Spring
简简单单一个循环依赖问题,其实蕴含的是Spring 最核心的两个点: Bean的生命周期 与 AOP原理。
ThreadLocal 提供了线程本地的实例。它与普通变量的区别在于,每个使用该变量的线程都会初始化一个 完全独立的实例副本。ThreadLocal 变量通常被private static修饰。当一个线程结束时,它所使用的 所有 ThreadLocal 相对的实例副本都可被回收。总的来说,ThreadLocal 适用于每个线程需要自己独立 的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景。