当前位置: 首页 > news >正文

@Value注解底层原理(二)

        前面介绍了@Value注解的几种解析方式,下面可以是模拟@Value注解如何解析带有SPEL表达式的例子。

       测试类如下:

 public static void main(String[] args) throws NoSuchFieldException {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestValue.class);ContextAnnotationAutowireCandidateResolver resolver = new ContextAnnotationAutowireCandidateResolver();resolver.setBeanFactory(context.getDefaultListableBeanFactory());extracted3(context,resolver,Bean4.class.getDeclaredField("value"));}

   解析的方法:

private static void extracted3(AnnotationConfigApplicationContext context, ContextAnnotationAutowireCandidateResolver resolver, Field field) {DependencyDescriptor descriptor = new DependencyDescriptor(field,true);//获取@Value的内容String value = resolver.getSuggestedValue(descriptor).toString();System.out.println(value);//解析${}value = context.getEnvironment().resolvePlaceholders(value);System.out.println(value);//解析#{}Object bean3 = context.getBeanFactory().getBeanExpressionResolver().evaluate(value, new BeanExpressionContext(context.getBeanFactory(), null));//类型转换Object res = context.getBeanFactory().getTypeConverter().convertIfNecessary(bean3, descriptor.getDependencyType());System.out.println(res);}

Bean4

    static class Bean4{@Value("#{'hello, '+'${JAVA_HOME}'}")private String value;}

测试结果:

       第一步是拿到@Value里面的整体内容,第二步解析里面带有${}的字符,第三步解析#{}里面的内容。下面的方法对SPEL表达式进行解析。

Object bean3 = context.getBeanFactory().getBeanExpressionResolver().evaluate(value, new BeanExpressionContext(context.getBeanFactory(), null));

       总结一下,无论是@Value注解还是@Autowired注解,其中用到的一些解析器都是类似的。获取属性上的注解然后根据类型不同进行层层处理。Spring底层提供了丰富的注解解析器。

http://www.dtcms.com/a/362902.html

相关文章:

  • 云端职达:你的AI求职专属猎头,颠覆传统招聘模式
  • 哈尔滨云前沿服务器托管与租用服务
  • STM32——串口
  • 在windows上使用ROS2 kilted
  • Pytorch Yolov11目标检测+window部署+推理封装 留贴记录
  • LeetCode算法日记 - Day 30: K 个一组翻转链表、两数之和
  • Unity核心概率④:MonoBehavior
  • @Hadoop 介绍部署使用详细指南
  • 从 WPF 到 Avalonia 的迁移系列实战篇6:ControlTheme 和 Style区别
  • R 语言科研绘图第 71 期 --- 散点图-边际
  • 小白也能看懂!“找不到 msvcp140.dll无法继续执行代码” 的6种简易解决方法,5 分钟快速修复
  • Watt Toolkit下载安装并加速GitHub
  • C# 原型模式(C#中的克隆)
  • 基因表达数据的K-M生存曲线的数据处理及绘制
  • Anaconda安装与使用详细教程
  • 服务器CPU飙高?排查步骤与工具推荐
  • 深入探索 HarmonyOS Stage 模型与 ArkUI:构建现代化、高性能应用
  • 【NestJS】HTTP 接口传参的 5 种方式(含前端调用与后端接收)
  • 面试新纪元:无声胜有声,让AI成为你颈上的智慧伙伴
  • 基于YOLO8的番茄成熟度检测系统(数据集+源码+文章)
  • 利用飞算Java打造电商系统核心功能模块的设计与实现
  • Controller返回CompletableFuture到底是怎么样的
  • 【DSP28335 入门教程】定时器中断:为你的系统注入精准的“心跳”
  • 在windows平台oracle 23ai 数据库上使用bbed
  • zephyr设备树的硬件描述转换为c语言
  • 梳理一下 @types/xxx
  • 【Python语法基础学习笔记】竞赛常用标准库
  • 数据库的锁级别
  • Git在idea中的实战使用经验(一)
  • 深度学习之第五课卷积神经网络 (CNN)如何训练自己的数据集(食物分类)