1. ClassWorking Utilities In Spring Framework
1.1. org.springframework.core.GenericCollectionTypeResolver
Helper class for determining element types of collections and maps. Mainly intended for usage within the framework, determining the target type of values to be added to a collection or map (to be able to attempt type conversion if appropriate). Only usable on Java 5. Use an appropriate JdkVersion check before calling this class, if a fallback for JDK 1.4 is desirable.
从javadoc中的说明就可以猜到,像getCollectionType(), getMapKeyType()和getMapValueType()之类的常用方法, 在这个类里是不会缺的。
org.springframework.core.GenericTypeResolver跟GenericCollectionTypeResolver类似, 只不过, 现在不是针对Collection类型, 而是针对一般的Generic类。
1.2. org.springframework.core.annotation.AnnotationUtils
AnnotationUtils填补了默认的反射API中有关Annotation相关的几个功能,比如, 使用默认的反射API你只能读取当前class上的Annotation,而通过AnnotationUtils, 我们则可以获取当前class继承层次上的所有标注的Annotation, 更多信息可以参考该类的Javadoc.
![[Tip]]() |
Tip
有关Annotation的继承, 这里可以总结几句:
-
如果Annotation是标注于Interface之上的话, 不管该Annotation类型是否标注了@Inherited这个Annotation, 被标注的Interface的实现类都不会“继承” 这一Annotation。 也就是说,标注于Interface上的Annotation,通过反射API只能在这个Interface上才能读取到这一Annotation。
-
如果Annotation是标注于Class之上的话, 分两种情况:
-
如果当前的Annotation类型被标注了@Inherited,那么, 标注了当前Annotation的Class的子类会获得当前Annotation的“继承”, 也就是说, 即使子类没有标注这个Annotation,通过subClass.getClass().getAnnoation(currentAnnotation)也会获得这个Annotation所持有的元数据信息。
-
如果这个Annotation没有被标注@Inherited,那么, 子类不会获得这种继承。
结合以上信息, 也就不难想到为什么Spring会倡导将Transactional之类的Annotation标注在具体的实现类上,而不是Interface之上了。
|
1.3. org.springframework.util.ClassUtils
在 org.apache.commons.lang.ClassUtils存在的前提下,有重新发明轮子之嫌, 不过, 还是有一些补足的, 用与不用完全看你个人口味啦。不过,千万别跟我提“绑定到XX框架”这样的论调, 除非你真的能够像古代那样做个自给自足的隐士!
1.4. org.springframework.util.MethodInvoker
Helper class that allows for specifying a method to invoke in a declarative fashion, be it static or non-static. Usage: Specify "targetClass"/"targetMethod" or "targetObject"/"targetMethod", optionally specify arguments, prepare the invoker. Afterwards, you may invoke the method any number of times, obtaining the invocation result. Typically not used directly but via its subclasses MethodInvokingFactoryBean and MethodInvokingJobDetailFactoryBean.
主要适用于对某个确定的方法调用多次的场景, 如果每次都是调用不同的对象上的不同的方法的话, 需要提供多个该类的实例。 如果是在Spring容器内使用的话, 大多数时候会是使用MethodInvokingFactoryBean或者MethodInvokingJobDetailFactoryBean这样的子类。
1.5. org.springframework.util.ReflectionUtils
这个类主要对Java ReflectionAPI进行了封装, 虽然它的javadoc中声明仅限于框架内部使用,不过如果你不介意的话, 也可以拿来一用吧!不过,后果自负,哈
通过Java标准Reflection API是取不到方法参数的名称的,要达到这个目的,除了可以通过读取class文件中的debug信息(可能在compile的时候没有启用), 也可以使用类似ASM这样的类库获得, 不过, Spring framework中已经对读取方法参数名称这一功能进行了抽象和实现,我们可以直接拿过来用, 这一抽象接口为org.springframework.core.ParameterNameDiscoverer。
ParameterNameDiscoverer主要有三个实现类:
-
LocalVariableTableParameterNameDiscoverer
-
PrioritizedParameterNameDiscoverer
-
AspectJAdviceParameterNameDiscoverer
其中, LocalVariableTableParameterNameDiscoverer为最常用的实现类, 它会使用ObjectWeb的ASM来读取方法参数名称。
![[Warning]]() |
Warning
LocalVariableTableParameterNameDiscoverer只能发现具体实现类的Class上的方法参数名称,对于接口类型的Class上的方法参数名称, 需要另寻他路,比如扫描接口的实现类并匹配相应方法,然后读取实现类相应方法的参数名称 ,或者直接通过Annotation标注相应的方法参数, 然后通过反射API读取等等。
|
PrioritizedParameterNameDiscoverer纯粹是借助于它所持有的多个ParameterNameDiscoverer来完成方法参数名称的获取工作,它会按照顺序请求它所持有的ParameterNameDiscoverer来完成每一个ParameterNameDiscoverer本应完成的任务。
AspectJAdviceParameterNameDiscoverer主要用于集成了AspectJ的SpringAOP Advice实现类, 通过它的Javadoc可以获得进一步的详细信息。
以下是LocalVariableTableParameterNameDiscoverer和ParaNamer的简单使用代码示例:
Class<SubscriptionServiceImpl> clazz = SubscriptionServiceImpl.class;
Method method = ReflectionUtils.findMethod(clazz, "listAllSubscription",new Class<?>[]{String.class, Integer.class,Date.class,Date.class} );
ParameterNameDiscoverer pmDiscoverer = new LocalVariableTableParameterNameDiscoverer();
String[] parameterNames = pmDiscoverer.getParameterNames(method);
// BytecodeReadingParanamer reader = new BytecodeReadingParanamer();
// String[] parameterNames = reader.lookupParameterNames(method);
for(String parameterName : parameterNames)
{
System.out.println(parameterName);
}
3. classpath auto scanning 功能
我们知道,Spring2.5之后引入了类路径的自动扫描功能,Spring框架为这一功能提供了很好的扩展点,我们可以通过BeanNameGenerator或者自定义的org.springframework.core.type.filter.TypeFilter来定制自动扫描的行为, 比如:
<context:component-scan base-package="..." name-generator="..">
<context:exclude-filter type="annotation" expression="..."/>
<context:include-filter type="annotation" expression="..."/>
</context:component-scan>
除此之外,我们实际上还可以较为独立的形式来使用Spring框架提供的这一类路径自动扫描功能,或者说, class的元数据信息读取功能。 这一功能的核心类为MetadataReader, 以下代码给出了使用这一核心类的简单示例代码:
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver);
// or new SimpleMetadataReaderFactory()
MetadataReader reader = metadataReaderFactory.getMetadataReader("cn/spring21/code/samples/spring/controller/SimpleController");
AnnotationMetadata annotationMD = reader.getAnnotationMetadata();
ClassMetadata clazzMD = reader.getClassMetadata();
System.out.println(annotationMD.hasAnnotation("org.springframework.stereotype.Component"));
System.out.println(clazzMD.getClassName());
ResourcePatternResolver主要用于加载相应的Resources, 这里就是class文件, MetadataReaderFactory用于构造相应的MetadataReader,它有两个实现类,即SimpleMetadataReaderFactory和CachingMetadataReaderFactory。通过相应MetadataReaderFactory实现类获得可用的MetadataReader之后,就可以根据MetadataReader的getAnnotationMetadata()和getClassMetadata()返回的值对象来提取自己需要的信息了。
分享到:
相关推荐
SOH-SVM算法:斑点鬣狗优化技术对支持向量机的改进与解析,优化算法助力机器学习:SOH-SVM改进及源码解析与参考,SOH-SVM:斑点鬣狗优化算法改进支持向量机:SOH-SVM。 代码有注释,附源码和参考文献,便于新手理解,~ ,SOH-SVM; 斑点鬣狗优化算法; 代码注释; 源码; 参考文献,SOH-SVM算法优化:附详解代码与参考
美赛教程&建模&数据分析&案例分析
GESPC++3级大纲
电动汽车充电负荷预测:基于出行链分析与OD矩阵的蒙特卡洛模拟研究,电动汽车充电负荷预测:基于出行链分析与OD矩阵的蒙特卡洛模拟方法,电动汽车充电负荷预测,出行链,OD矩阵,蒙特卡洛模拟 ,电动汽车充电负荷预测; 出行链; OD矩阵; 蒙特卡洛模拟,基于出行链的电动汽车充电负荷预测研究:蒙特卡洛模拟与OD矩阵分析
柯尼卡美能达Konica Minolta bizhub 205i 驱动
内容概要:本文全面介绍使用示波器进行一系列电学实验和项目的内容。从基础实验,如示波器的操作入门和常见波形的测量,再到进阶部分,比如电路故障排除与复杂项目设计,旨在帮助学生掌握示波器的各项技能。文中不仅提供了详尽的操作流程指导,还包括针对每个阶段的学习目标设定、预期成果评估和所需注意事项。最终通过对示波器的深入理解和熟练运用,在实际应用场景(如构造简单设备或是进行音频处理)达到创新解决问题的目的。 适用人群:面向有志于深入理解电工仪器及其应用的学生或者技术人员,尤其是刚开始接触或正在强化自己这方面能力的学习者。 使用场景及目标:①作为培训材料支持初学者快速上手专业级电工测试设备—示波器;②用于教学环节辅助讲解电学概念以及实际操作技巧;③鼓励用户参与更高层次的DIY工程任务从而培养解决问题的能力.
标题中的“ntc热敏电阻 MF52AT 10K 3950精度1%STM32采集带数字滤波”表明我们要讨论的是一个使用STM32微控制器进行数据采集的系统,该系统中包含NTC热敏电阻MF52AT作为温度传感器。NTC热敏电阻是一种负温度系数的电阻器,其阻值随温度升高而降低。MF52AT型号的热敏电阻具有10K欧姆的标称电阻和3950的B值,表示在特定温度下(通常为25℃)的阻值和温度特性曲线。精度1%意味着该电阻的阻值有1%的允许误差,这对于温度测量应用来说是相当高的精度。 描述中提到的“MF52AT热敏电阻STM32数据采集2路”,暗示我们有两个这样的热敏电阻连接到STM32微控制器的模拟输入端口,用于采集温度数据。STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于各种嵌入式系统中,包括温度监测等应用。由于STM32内部集成了多个ADC(模拟数字转换器),因此它可以同时处理多路模拟输入信号。 "带滤波,项目中实际运用,温差范围在±0.5度",这表明在实际应用中,数据采集系统采用了某种数字滤波技术来提高信号质量,可能是低通滤波、滑动平均滤波或更复杂的数字信号处理算法。
SSM框架整合是Java开发中常见的技术栈,包括Spring、SpringMVC和Mybatis三个核心组件。这个压缩包提供了一个已经验证过的整合示例,帮助开发者理解和实践这三大框架的协同工作。 Spring框架是Java企业级应用的基石,它提供了一种依赖注入(Dependency Injection,DI)的方式,使得对象之间的依赖关系得以解耦,便于管理和服务。Spring还提供了AOP(面向切面编程)功能,用于实现如日志记录、事务管理等跨切面关注点的处理。 SpringMVC是Spring框架的一部分,专门用于构建Web应用程序。它采用了模型-视图-控制器(Model-View-Controller,MVC)设计模式,将业务逻辑、数据展示和用户交互分离,提高了代码的可维护性和可扩展性。在SpringMVC中,请求被DispatcherServlet接收,然后分发到相应的处理器,处理器执行业务逻辑后返回结果,最后由视图解析并展示给用户。 Mybatis是一个优秀的持久层框架,它简化了JDBC的繁琐操作,支持SQL语句的动态编写,使得开发者可以直接使用SQL来操作数据库,同时还能保持数
分割资源UE5.3.z25
Matlab 2021及以上版本:电气工程与自动化仿真实践——电力电子变换器微网建模与仿真研究,涵盖Boost、Buck整流逆变器闭环控制及光伏蓄电池电路等多重电气仿真,基于Matlab 2021及以上的电气工程与自动化仿真研究:电力电子变换器微网建模与Boost、Buck整流逆变器闭环控制及光伏蓄电池电路等多电气仿真分析,电气工程及其自动化仿真 Matlab simulink 电力电子变器微网建模仿真 仅限matlab版本2021及以上 Boost,Buck,整流逆变器闭环控制 光伏蓄电池电路等多种电气仿真 ,电气工程; Matlab simulink; 电力电子变换器; 微网建模仿真; Boost; Buck; 整流逆变器; 闭环控制; 光伏蓄电池电路; 电气仿真,Matlab 2021版电气工程自动化仿真研究:微网建模与控制策略
移动机器人路径规划,python入门程序
《DeepSeek从入门到精通》是清华大学推出的一套深度学习学习资源,内容涵盖基础知识、实用技巧和前沿应用,适合不同水平的学习者。通过系统化的学习路径,帮助你在深度学习领域快速成长。无论你是初学者还是
考虑新能源消纳的火电机组深度调峰策略:建立成本模型与经济调度,实现风电全额消纳的优化方案,考虑新能源消纳的火电机组深度调峰策略与经济调度模型研究,考虑新能源消纳的火电机组深度调峰策略 摘要:本代码主要做的是考虑新能源消纳的火电机组深度调峰策略,以常规调峰、不投油深度调峰、投油深度调峰三个阶段,建立了火电机组深度调峰成本模型,并以风电全额消纳为前提,建立了经济调度模型。 约束条件主要考虑煤燃烧约束、系统旋转备用功率约束、启停、爬坡、储热约束等等。 复现结果非常良好,结果图展示如下: 1、代码非常精品,有注释方便理解; ,核心关键词:新能源消纳;火电机组深度调峰策略;常规调峰;不投油深度调峰;投油深度调峰;成本模型;经济调度模型;煤燃烧约束;系统旋转备用功率约束;启停约束;爬坡约束;储热约束。,新能源优化调度策略:火电机组深度调峰及经济调度研究
"数字设计原理与实践" 数字设计是计算机科学和电子工程两个领域的交叉点,涉及到数字电路的设计和实现。本书籍《数字设计-原理与实践》旨在为读者提供一个系统的数字设计指南,从基本原理到实际应用,涵盖了数字设计的方方面面。 1. 数字设计的定义和目标 数字设计是指使用数字电路和系统来实现特定的功能目标的设计过程。在这个过程中,设计师需要考虑到各种因素,如电路的可靠性、功耗、面积等,以确保设计的数字电路能够满足实际应用的需求。 2. 数字设计的基本原理 数字设计的基本原理包括数字电路的基本元件,如逻辑门、 Flip-Flop、计数器、加法器等,以及数字电路的设计方法,如Combinational Logic、Sequential Logic和 Finite State Machine等。 3. 数字设计的设计流程 数字设计的设计流程通常包括以下几个步骤: * 需求分析:确定设计的目标和约束条件。 *电路设计:根据需求设计数字电路。 * 仿真验证:使用软件工具对设计的数字电路进行仿真和验证。 * 实现和测试:将设计的数字电路实现并进行测试。 4. 数字设计在实际应用中的应用 数字设计在实际应用中
基于Simulink仿真的直流电机双闭环控制系统设计与分析:转速电流双闭环PWM控制策略及7天报告研究,基于Simulink仿真的直流电机双闭环控制系统分析与设计报告:转速电流双闭环PWM控制策略的7天实践,直流电机双闭环控制系统仿真 simulink仿真 7d 转速电流双闭环 PWM 含有报告哈 ,直流电机; 双闭环控制系统; Simulink仿真; 7d; 转速电流双闭环; PWM; 报告,7天完成双闭环控制系统仿真报告:直流电机转速电流PWM管理与Simulink仿真研究
三目标微电网能量调度优化:经济、环境友好与高效能分配的协同策略研究,微粒群算法在三目标微电网能量调度中的应用:经济、环境友好与优化调度的综合研究,微电网 能量调度 三目标微网调度, 经济调度 环境友好调度 优化调度 微电网能量调度问题的求解 问题描述: - 微电网:包含多个能量源,包括DG(分布式发电设备,如太阳能光伏板、微型燃气轮机等)、MT(燃油发电机)和FC(燃料电池)。 - 目标:通过合理分配各种能源的发电功率,满足负荷需求,同时使得微电网的发电成本最小化。 解决方法: 微粒群算法(Particle Swarm Optimization, PSO): - 步骤: - 初始化微粒群:根据给定的微电网问题约束,随机生成一定数量的微粒(粒子),每个粒子代表一种发电方案,包含DG、MT和FC的发电功率分配情况。 - 适应度函数:对每个粒子,计算其对应的发电成本,作为其适应度值。 - 更新速度和位置:根据当前适应度值和历史最优适应度值,通过PSO算法的公式,更新每个粒子的速度和位置,以寻找更优的发电功率分配。 - 约束处理:根据问题约束条件,
《无感滑膜技术:Microchip1078代码移植至ST芯片的实践指南》——新手必备的反正切算法与电子资料整合方案,《无感滑膜技术:Microchip1078代码移植至ST芯片的实践指南》——新手必备的反正切算法与电子资料全解析,无感滑膜,反正切,microchip1078代码移植到st芯片上,新手学习必备。 可以提供提供相应文档和keil工程,电子资料, ,无感滑膜; 反正切; microchip1078代码移植; ST芯片; 新手学习; 文档; Keil工程; 电子资料,无感滑膜算法移植至ST芯片的Microchip1078代码迁移指南
风光柴储混合微电网系统中的储能电池与互补能量管理技术研究及MATLAB模拟实现,风光柴储混合微电网系统中的储能电池与互补能量管理技术:基于MATLAB的智能调控体系,风光柴储+混合微电网+储能电池系统+互补能量管理+MATLA ,核心关键词:风光柴储; 混合微电网; 储能电池系统; 互补能量管理; MATLA;,风光柴储混合微网能量管理系统及储能电池应用