方法可以获取当前类所在的系统路径(getResource("")),以及classpath的路径(getResource("/")),利用这个功能我们可以获取操作系统上所知的任何资源。...在使用的时候我们并不需要了解他们的具体实现,只要知道不同的协议对应的资源路径即可。...Resource[] resList = ctx.getResources("classpath:hybrid/**/*.xml"); Spring官网将这种资源匹配规则称为“Ant-style匹配”,虽然并不知道源自什么地方...一般情况下我们使用Class::getResource都是获取首选classpath路径下的资源,而使用ClassLoader::getResources(classPath)可以获取所有classpath...().getResource(classPath)); //ClassLoader::getResources获取所有资源 Enumeration e = ResourceApp.class.getClassLoader
JVM加载配置资源文件有两种方式: 1、ClassLoader#getResource 2、Class#getResource 两者之间的区别: ClassLoader并不关心当前类的包名路径,它永远以...需要注意的是在用ClassLoader加载资源时,路径不要以"/"开头,所有以"/"开头的路径都返回null; Class.getResource如果资源名是绝对路径(以"/"开头),那么会以classpath...,多加了一步resolveName,其实还是使用了Classloader#getResource方法 其中resolveName() name不以'/'开头时,默认是从此类所在的包下取资源; name以...ClassLoader并不关心当前类的包名路径,它永远以classpath为基点来定位资源。...需要注意的是在用ClassLoader加载资源时,路径不要以"/"开头,所有以"/"开头的路径都返回null; Class.getResource如果资源名是绝对路径(以"/"开头),那么会以classpath
所有ApplicationContext实例都实现了这个接口方法 ? 从继承体系中可议看出,实现还是非常多的。...但是本文先从另外一个角度出发,看看实现了Resource getResource(String location);方法的实现类: ? 很清晰的可以看到,真正实现了这个方法的只有三个类而已。...从名字中可以看出,它支持Pattern,支持正则的模式匹配,非常的强大~~~ 用于解析资源文件的策略接口,其特殊的地方在于,它应该提供带有*号这种通配符的资源路径。...(String location) { return getResourceLoader().getResource(location); } // 这个是核心方法~~~~~~~ @Override...可能路径处理方面是比较复杂也是最容易出错的地方 ServletContextResourcePatternResolver 显然它是web下,用于获取资源的。
Redis实现分布式锁相关注意事项 查看了不少关于redis实现分布式锁的文章,无疑要设计一个靠谱的分布式并不太容易,总会出现各种鬼畜的问题;现在就来小述一下,在设计一个分布式锁的过程中,会遇到一些什么问题...(); if (now - oldTime < OUT_TIME) { // 没有超时 continue; } // 强制使所有的线程都可以到这一步...一个常见的方式就是加锁了,思路如下:(不详细展开了) 在判断超时之后,加锁 再次获取对应的值,判断是否超时,是则执行上面的操作 否则退出逻辑,继续循环 这种实现方式,会有以下的问题: getset 这个方法执行...,可能导致写入脏数据 基于服务器时钟进行超时判断,要求所有服务器始终一致,否则有坑 3. expire实现方式 相比于前面一种直接将value设置为时间戳,然后来比对的方法,这里则直接借助redis本身的...小结说明 想基于redis实现一个相对靠谱的分布式锁,需要考虑的东西还是比较多的,而且这种锁并不太适用于业务要求特别严格的地方,如 一个线程持有锁时,如果发生gc,导致锁超时失效,但是自己又不知道,此时就会出现多个业务方同时持有锁的场景
为了保护事故现场,先 dump了问题进程所有堆内存,然后debug模式重启测试环境应用,打算问题再出现时直接远程debug问题机器。...自己随意找了一个接口,断点在接口入口地方,悲剧开始,什么也没有发生!API等待服务响应,没进断点。...这时候有点懵逼,冷静了一会,在入口之前的aop地方下了个断点,再debug一次,这次进了断点,f8 N次后发现在执行redis命令的时候卡主了。...borrowMaxWaitMillis<0会一直执行,然后一直循环了 开始怀疑这个值没有配置 找到redis pool配置,发现确实没有配置MaxWaitMillis,配置后else代码也是一个Exception 并不能解决问题...《java面试宝典5.0》(初中级)《350道Java面试题:整理自100+公司》(中高级)《资深java面试宝典-视频版》(资深)《Java[BAT]面试必备》(资深)分别适用于初中级,中高级,资深级工程师的面试复习
test", null, new Locale("en"));//System.out.println(message);Resource resource = applicationContext.getResource...test", null, new Locale("en"));//System.out.println(message);Resource resource = applicationContext.getResource...如果想要监听所有事件,直接去掉泛型即可。Spring的事件也可以监听到,因此在监听部分需要自己判断是什么事件。...虽然在工作中我们也会用到排序,但单独写一篇文章可能并不必要,因此在这里简单提一下。...stream().sorted(AnnotationAwareOrderComparator.INSTANCE).forEach(System.out::println);注意,OrderComparator只适用于实现了
Java 的懒惰特性影响了类加载器的工作方式——所有事情都应该在最后一刻完成。类只有在以某种方式被引用时才会被加载-通过调用构造函数、静态方法或字段。...颠倒本地查找和委托查找之间的顺序的原因是,应用程序容器附带了许多具有自己的发布周期的库,这些库可能不适用于应用程序开发人员。...URLClassLoader 技巧可能不适用于所有应用服务器。另一种方法是使用jconsole 实用程序附加到容器JVM进程,以检查类路径。...最简单的方法是向 JVM 添加 '-verbose:class' 命令行参数,但是如果您可以快速更改代码,那么您可以使用 getResource 搜索与 loadClass 相同的类路径。...IllegalAccessError 其实,不仅类由其全限定名和类加载器标识,而且该规则也适用于包。
程序使用jedis的地方是j2Cache,红薯开源的一个2阶缓存框架,很可能是红薯的锅。...可以看到RedisCacheProvider初始化连接池后,提供了一个静态方法getResource()用于获取连接,很可能是业务层面通过这个入口,拿到RedisCacheProvider里的连接了。...代码修改也非常简单,在finally中判断下jeids对象是否为null,不为null则调用其close方法,将资源回收即可。...上文所述场景中有个地方埋了一个小彩蛋,感兴趣的小伙伴可以找下,在下方留言交流。...也就是说即使编辑器给这个地方加上了资源释放的代码,在订阅不出问题的情况下,也跑不到资源释放的地方。所以这里也会长期占用一个连接。
前言碎语 dubbo支持zookeeper,reids,multicast等注册中心注册服务信息,使用redis作为注册中心时,因为reids作为注册中心使用并不广泛,早期reids由于定位内网访问...设置indexdb的reids 2.5.6以及以前的会有这个问题,最新的版本已经解决了这个问题了,但是还是存在一个坑,就是必须得设置用户名(大家都知道redis验证不需要用户名),如URL的构造方法有如下判断...解决方法: 1.打开RedisRegistry.java,设置jedispool时判断下,如果设置密码,使用带密码,indexdb入参的构造方法,具体如下: if(StringUtils.isEmpty...其实网上的说法都正确,原因是jedis内一段代码导致的,dubbo默认设置了连接池的test.on.borrow为true,所有在拿连接前都会验证一遍,验证的逻辑如下: 如上图,前面两个判断100%...博主这边是以为jedis.isConnected()报错了,但是jedis是个坑,虽然返回了false,但是具体的异常信息并没有抛出来,其实这个地方,具体的异常:redis.clients.jedis.exceptions.JedisDataException
【读码JDK】java.lang包目录 几种类加载器 Bootstrap ClassLoader 负责加载JDK自带的rt.jar包中的类文件,它是所有类加载器的父加载器,Bootstrap...classLoader.getParent(); System.out.println(parentClassLoader.getName()); //返回null,BootStrapClassLoader并不是...classLoader.getDefinedPackage("lang"); System.out.println(pk.getName()); } /** * 返回此类加载器定义的所有软件包...* * 如果多个包默认值适用于给定的类,则与特定包最相关的包默认优先于其他包。...此方法通过系统类加载器定位资源(请参阅getSystemClassLoader() )。
---- 资源访问接口 主要方法 ?...7.0提供)、文件系统资源,它四用户能够访问任何可以通过URL、Path、系统文件路径标识的资源,如文件系统的资源,HTTP资源,FTP资源 有了这个抽象的资源类后,就可以将Spring配置文件放在任何地方...我们可以使用 classpath*:com/xgj/module*.xml加载所有模块的配置文件。...ResourceLoader中的方法Resource getResource(String location); 可以根据一个资源地址加载文件资源, 不过ResourceLoader这个接口方法中的资源地址仅支持带资源类型前缀的表达式...ResourcePatternResolver 的getResource方法支持带资源类型前缀以及Ant风格的资源路径表达式。
对于所有常规资源实现,返回false,但是InputStreamResource除外。getDescription(): 返回资源的描述,用来输出错误的日志。...无论它是在文件系统上扩展还是直接从JAR或其他地方(如数据库)访问,实际上都依赖于Servlet容器。...在ResourceLoader接口里有如下方法:(1)Resource getResource(String location) : 该接口仅有这个方法,用于返回一个Resource实例。...Resource实现类,而是调用ResourceLoader实例的getResource()方法来获得资源,ReosurceLoader将会负责选择Reosurce实现类,也就是确定具体的资源访问策略,...实际情况是,创建ApplicationContext时,分别访问多个配置文件(通过ClassLoader的getResource方法实现)。因此,classpath :前缀不可用于Resource。
资源可以任何形式存在,如以二进制对象形式存在、以字节流形式存在、以文件形式存在等;而且,资源也可以存在于任何场所,如存在于文件系统、存在于Java应用的Classpath中,甚至存在于URL可以定位的地方...-------------------------------------------------------------------"); 尤其注意fakeFileResource资源的类型,并不是我们所预期的...如果最终没有找到符合条件的相应资源,getResourceByPath(String)方法就会构造一个实际上并不存在的资源并返回。...,我们就可以看到ApplicationContext与ResourceLoader之间的所有关系。...容器实例化并启动后,作为ResourceLoader来加载资源,如果不是每个地方都使用classpath:前缀,强制FileSystemXmlApplicationContext从 Classpath
1.2、SPRING中工厂模式的应用 Spring中在各种BeanFactory以及ApplicationContext创建中都用到了典型的工厂方法模式。...3、单例类必须给所有其他对象提供这一实例 2.2 SPRING中单例模式的使用 在Spring中,所有的bean默认都是单例创建的。在创建bean的代码中我们经常看到Singleton这个单词。...当 Spring 应用需要进行资源访问时,它并不需要直接使用 Resource 实现类,而是调用 ApplicationContext 实例的 getResource() 方法来获得资源,ApplicationContext...1ApplicationContext ctx = new Class PathXmlApplicationContext("bean.xml"); 2Resource res = ctx.getResource...装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口。
为了保护事故现场 先 dump了问题进程所有堆内存,然后debug模式重启测试环境应用,打算问题再显时直接远程debug问题机器。...自己随意找了一个接口,断点在接口入口地方,悲剧开始,什么也没有发生!API等待服务响应,没进断点。...这时候有点懵逼,冷静了一会,在入口之前的aop地方下了个断点,再debug一次,这次进了断点,f8 N次后发现在执行redis命令的时候卡主了。...找到redis pool配置,发现确实没有配置MaxWaitMillis,配置后else代码也是一个Exception 并不能解决问题。...找到源头第一次出现500地方,发现以下代码: .......
strategy0.strategyInter(); strategy1.strategyInter(); 假设一下这个接口的实现类有很多,而且每个实现类都在不同地方被多次实现...strategy.strategyInter(); } } 这样改动之后,在后续即使StrategyImpO有了更高级的类去代替,我们也仅仅需要修改一下这个Context类,并不会影响客户端的调用...[] resources = getResources();//获取到包下所有的class文件 Class calPriceClazz = null;...ClassNotFoundException e) { e.printStackTrace(); } } } //获取扫描的包下面所有的...[] resources = getResources();//获取到包下所有的class文件 Class calPriceClazz = null;
数值 分值 1 a 0 2 ab 0 3 abcd 0 4 abef 0 5 hjk 0 6 dbfgll 0 7 efhuo 0 8 iop 0 9 lkj 0 10 ghu 0 当所有的数值分值为...: 1.分页获取前100条数据,如果Redis中不存该联系人在就放入redis中 2.放入前使用 unicode编码,位于coding方法中,取出相关的数据后记得使用decoding方法解码 3.获得相关数据后删除放入的前缀和后缀...,这里都加了UUID,防止有相同的查询带有前后缀的数据被误删(如查找 ab ,数据中本身就含有 ab{ 等) 4.获得前5条或者前10条相关匹配的数据给前台(这里自定义即可,查看注释地方) 相关类详情...if (StringUtils.isBlank(name)) { return null; } Jedis jedis = jedisPool.getResource...; } finally { jedis.unwatch(); } return list; } // 这个方法仅仅适用于匹配英文字符
Java中的getResource等资源加载方法也遵循双亲委派模型,首先会委托给父类加载器加载资源。...当执行该方法时,会扫描指定的目录下的所有JAR文件,将这些JAR文件中的元数据信息读取到内存中,以便在后续的类加载和资源查找中使用。...MetaIndex.getJarMap()方法返回一个包含所有元索引记录的Map对象,其中的键是JAR文件名,值是该JAR文件的元数据记录。...URLClassPath的getResource方法完成class资源文件的定位。...---- FileLoader的getResource方法 Loader不管是用findResource还是getResource获取资源,最终都是调用getResource,这里以较为简单的FileLoader
自己随意找了一个接口,断点在接口入口地方,悲剧开始,什么也没有发生!API等待服务响应,没进断点。...这时候有点懵逼,冷静了一会,在入口之前的aop地方下了个断点,再debug一次,这次进了断点,f8 N次后发现在执行redis命令的时候卡主了。...= null) { return pool.getResource(); } Jedis jedis = new Jedis(getShardInfo());...borrowMaxWaitMillis<0会一直执行,然后一直循环了 开始怀疑这个值没有配置 找到redis pool配置,发现确实没有配置MaxWaitMillis,配置后else代码也是一个Exception 并不能解决问题...这是能确认就是api一直转圈的问题,就是这个redis获取连接的代码导致的, 解读这段内存代码 所有线程都在等 @53e5504e这个对象释放锁。