晋中路桥建设集团有限公司网站,无锡网站建设企业排名,学校网站建设风险分析,微信小程序外联网站1、为什么Spring和IDEA 都不推荐使用 Autowired 注解 大家在使用IDEA开发的时候有没有注意到过一个提示#xff0c;在字段上使用Spring的依赖注入注解Autowired后会出现如下警告Field injection is not recommended (字段注入是不被推荐的)#xff1b;但是使用Resource却不会…1、为什么Spring和IDEA 都不推荐使用 Autowired 注解 大家在使用IDEA开发的时候有没有注意到过一个提示在字段上使用Spring的依赖注入注解Autowired后会出现如下警告Field injection is not recommended (字段注入是不被推荐的)但是使用Resource却不会出现此提示那这是为什么呢 我们都知道Spring常见的DI方式
构造器注入利用构造方法的参数注入依赖Setter注入调用Setter的方法注入依赖字段注入在字段上使用Autowired/Resource注解 Autowired VS Resource 事实上他们的基本功能都是通过注解实现依赖注入只不过Autowired是Spring定义的而Resource是JSR-250定义的。大致功能基本相同但是还有一些细节不同
依赖识别方式Autowired默认是byType可以使用Qualifier指定NameResource默认ByName如果找不到则ByType适用对象Autowired可以对构造器、方法、参数、字段使用Resource只能对方法、字段使用提供方Autowired是Spring提供的Resource是JSR-250提供的 各种DI方式的优缺点 参考Spring官方文档建议了如下的使用场景
构造器注入强依赖性即必须使用此依赖不变性各依赖不会经常变动Setter注入可选没有此依赖也可以工作可变依赖会经常变动Field注入大多数情况下尽量少使用字段注入一定要使用的话Resource相对Autowired对IoC容器的耦合更低 Field注入的缺点
不能像构造器那样注入不可变的对象依赖对外部不可见外界可以看到构造器和setter但无法看到私有字段自然无法了解所需依赖会导致组件与IoC容器紧耦合这是最重要的原因离开了IoC容器去使用组件在注入依赖时就会十分困难导致单元测试也必须使用IoC容器原因同上依赖过多时不够明显比如我需要10个依赖用构造器注入就会显得庞大这时候应该考虑一下此组件是不是违反了单一职责原则 为什么IDEA只对Autowired警告 Field注入虽然有很多缺点但它的好处也不可忽略那就是太方便了。使用构造器或者setter注入需要写更多业务无关的代码十分麻烦而字段注入大幅简化了它们。并且绝大多数情况下业务代码和框架就是强绑定的完全松耦合只是一件理想上的事牺牲了敏捷度去过度追求松耦合反而得不偿失。 那么问题来了为什么IDEA只对Autowired警告却对Resource视而不见呢 Autowired是Spring提供的它是特定IoC提供的特定注解这就导致了应用与框架的强绑定一旦换用了其他的IoC框架是不能够支持注入的。而Resource是JSR-250提供的它是Java标准我们使用的IoC容器应当去兼容它这样即使更换容器也可以正常工作。
2、工作中常用Redis的十种场景
Redis是一种优秀的基于键值型的NoSql数据库非关系型
这里有两个关键字
其中键值型是指Redis中存储的数据都是以key、value对的形式存储而value的形式多种多样可以是字符串、数值、甚至json。 而NoSql则是相对于传统关系型数据库而言有很大差异的一种数据库。
Redis的优点
键值key-value型value支持多种不同数据结构功能丰富单线程每个命令具备原子性低延迟速度快基于内存、IO多路复用、良好的编码支持数据持久化支持主从集群、分片集群支持多语言客户端
Redis在工作中的应用列举
1、计数器
在很多网站首页会有一些统计首页访问次数的需求访问次数只有一个字段如果存到关系型数据库中最后做汇总会很麻烦。该业务场景可以使用Redis定义一个key例如WEBSITE_VISITS_NUM。
在Redis里有命令incr实现给value值加1操作
incr WEBSITE_VISITS_NUM
当然如果你想一次加的值大于1可以用incrby命令,例如
Incrby WEBSITE_VISITS_NUM 10 一次加10。
2、分布式锁单线程数据安全
最常见应用场景之一相对于例如Zookeeper分布式锁Redis的分布式锁有更好的性能。
代码奉上
Api(tags Redis)
RestController
RequestMapping(/testRedis)
Slf4j
public class TestRedisController {private static final ThreadFactory THREAD_FACTORY new ThreadFactoryBuilder().setNamePrefix(shouhu-).setDaemon(true).build();private static final ScheduledExecutorService daemonPool Executors.newScheduledThreadPool(5,THREAD_FACTORY);Resourceprivate RedisTemplateString ,Object redisTemplate;GetMapping(/testSetNX)ApiOperation(SETNX)public ResultVOObject testSetNX(RequestParam Long goodsId){String key lock_ goodsId;String value UUID.randomUUID().toString();ValueOperationsString, Object valueOperations redisTemplate.opsForValue();ScheduledFuture? scheduledFuture null;try {// 加锁Boolean ifAbsent valueOperations.setIfAbsent(key, value, 30, TimeUnit.SECONDS);log.info(加锁{}返回值{},key,ifAbsent);if ((nullifAbsent) || (!ifAbsent)){log.info(加锁失败请稍后重试);return ResultUtils.error(加锁失败请稍后重试);}// 模拟看门狗逻辑AtomicInteger count new AtomicInteger(1);scheduledFuture daemonPool.scheduleWithFixedDelay(() - {log.info(看门狗第{}次执行开始, count.get());Object cache redisTemplate.opsForValue().get(key);if (Objects.nonNull(cache) (value.equals(cache.toString()))) {// 重新设置有效时间为30秒redisTemplate.expire(key, 30, TimeUnit.SECONDS);log.info(看门狗第{}次执行结束有效时间为{}, count.get(), redisTemplate.getExpire(key));}else {log.info(看门狗执行第{}次异常key{} 期望值{} 实际值{},count.get(), key, value, cache);}count.incrementAndGet();}, 10, 10, TimeUnit.SECONDS);// 执行业务逻辑TimeUnit.SECONDS.sleep(5);log.info(业务逻辑执行结束);}catch (Exception e){log.error(testSetNX exception:,e);return ResultUtils.sysError();}finally {// 释放锁判断是否是当前线程加的锁String delVal valueOperations.get(key).toString();if (value.equals(delVal)){Boolean delete redisTemplate.delete(key);log.info(释放{}锁结果{},key,delete);// 关闭看门狗线程if (Objects.nonNull(scheduledFuture)){boolean cancel scheduledFuture.cancel(true);log.info(关闭看门狗结果{},cancel);}}else {log.info(不予释放key{} value{} delVal{},key,value,delVal);}}return ResultUtils.success(success);}}
3、缓存加速
这也是工作中非常常用的一种例如大宗采购项目中如果查询检斤化验单数据先从Redis缓存中查询如果缓存里存在则直接拿出数据进行计算如果不存在则再去检斤进行查询数据将数据保存到缓存里。
对于用户而言下面的流程图也是常见的 4、交集差集Redis的无序集合应用
例如共同好友、推荐好友功能我们可以使用到Redis的无序集合命令如下
sadd key val val ---添加
sinter key1 key2 ----交集
sdiff key1 key2 -----差集
5、排行榜Redis的有序集合应用
很多网站有排行榜的功能比如商城中有商品销量的排行榜游戏网站有玩家获得积分的排行榜。这种情况下我们可以使用Sorted Set保存排行榜的数据。使用ZADD可以添加排行榜的数据使用ZRANGE可以获取排行榜的数据。
ZADD rank:score 100 张三
ZADD rank:score 90 李四
ZADD rank:score 80 王五
ZRANGE rank:score 0 -1 WITHSCORES