1.idea source å resource çåºå«
2.注解@Autowired和@Resource的源码区别总结
3.为什么@Resource出错
4.resource.irf是什么
idea source å resource çåºå«
sourceå½ç±»æç®å½éä¸è¬æ¾çæ¯æºä»£ç æ件å¦JavaãCppï¼èresourceå½ç±»æç®å½éæ¾çæ¯èµæºæ件å¦å¾çãå¾æ ãé³é¢è§é¢æ件
注解@Autowired和@Resource的区别总结
@Autowired和@Resource是Spring框架中常见的依赖注入注解,但它们的源码注入机制和处理略有不同。接下来,源码我们将从源码角度深入剖析它们的源码注入过程。
@Autowired总结:
- 注入流程涉及AutowiredAnnotationBeanPostProcessor,源码首先检查属性或方法上的源码操盘手 源码@Autowired,构建AutowiredFieldElement或AutowiredMethodElement。源码
- 如果未启用懒加载,源码AutowiredFieldElement会通过DefaultListableBeanFactory的源码resolveDependency方法寻找并注入bean,包括候选bean的源码查找和确定。
@Resource总结:
- CommonAnnotationBeanPostProcessor的源码buildResourceMetadata方法是切入点,只对非静态、源码非忽略类型的源码字段创建ResourceElement对象。
- ResourceElement对象的源码getResourceToInject方法负责获取bean,通过autowireResource方法调用。源码
源码分析:
1. @Autowired的注入过程涉及AutowiredAnnotationBeanPostProcessor的多个内部方法,如doResolveDependency和findAutowireCandidates,处理了候选bean的选择和懒加载机制。
2. @Resource的人脸facex源码流程在CommonAnnotationBeanPostProcessor中更为直接,主要通过ResourceElement类的getResourceToInject方法获取bean。
学习更多关于Java和Spring的深入知识,如MyBatis、ZooKeeper等,持续关注博主的更新。
为什么@Resource出错
看spring2.0源码中的 InputStreamResource类中的isOpen() 方法:
/
*** This implementation always returns <code>true</code>.
*/
public boolean isOpen() {
return true;
}
这个方法永远返回true。
再看这个方法:
/
*** Detects which kind of validation to perform on the XML file identified
* by the supplied { @link Resource}. If the
* file has a <code>DOCTYPE</code> definition then DTD validation is used
* otherwise XSD validation is assumed.
*/
protected int detectValidationMode(Resource resource) {
if (resource.isOpen()) {
throw new BeanDefinitionStoreException(
"Passed-in Resource [" + resource + "] contains an open stream: " +
"cannot determine validation mode automatically. Either pass in a Resource " +
"that is able to create fresh streams, or explicitly specify the validationMode " +
"on your XmlBeanDefinitionReader instance.");
}
... ...
}
由于resource.isOpen()永远返回true,所以这里会抛出异常。我的hutool源码导读理解是:InputStreamResource是直指向输入流InputStream的,在构造InputStreamResource时,我们要加载的资源第一次被打开后, 即InputStreamResource的getInputStream()方法调用后, 不允许再次读取资源对应的InputStream。下面是getInputStream()方法,可以看到,InputStreamResource用私有的属性 read来标记输入流是否被读取过, 若读取过一次, 再次读取会抛异常的fastadmin加载源码。
/
*** This implementation throws IllegalStateException if attempting to
* read the underlying stream multiple times.
*/
public InputStream getInputStream() throws IOException, IllegalStateException {
if (this.read) {
throw new IllegalStateException("InputStream has already been read - " +
"do not use InputStreamResource if a stream needs to be read multiple times");
}
this.read = true;
return this.inputStream;
}
然而从spring2.0开始,为了支持xml schema,需要再次读取资源以检查配置文件是否遵循了DTD 和 xml schema, 又由于当前被打开的资源不能被多次读取, 以致异常抛出。从下面spring源码中关于InputStreamResource类的说明中可以看到,作者强烈建议不要使用InputStreamResource, 而是尽量使用替代者ByteArrayResource、ClassPathResource、短网api源码FileSystemResource、UrlResource等来加载xml等资源。
InputStreamResource类是为给定的InputStream而准备的Resource接口的实现。它只有在没有其它合适的Resource接口实现类可用时才使用。而且,只要有可能就尽量使用ByteArrayResource或者其它基于文件的Resource实现。与其它Resource实现不同的是,这是个已经打开资源的描述符(因此isOpen()函数返回 true)。如果你需要在其它位置保持这个资源的描述符或者多次读取一个流,请不要使用它。
/
*** { @link Resource} implementation for a given InputStream. Should only
* be used if no specific Resource implementation is applicable.
* In particular, prefer { @link ByteArrayResource} or any of the
* file-based Resource implementations where possible.
*
* <p>In contrast to other Resource implementations, this is a descriptor
* for an <i>already opened</i> resource - therefore returning "true" from
* <code>isOpen()</code>. Do not use it if you need to keep the resource
* descriptor somewhere, or if you need to read a stream multiple times.
*
* @author Juergen Hoeller
* @since ..
* @see ByteArrayResource
* @see ClassPathResource
* @see FileSystemResource
* @see UrlResource
*/
public class InputStreamResource extends AbstractResource { ...}
引一段springsource站网友的解释, 供参考:
This is caused by Spring 2.0's new support for XML schema: We need to sneak into the file to find out whether it's based on our DTD or our schema now. Simply assuming the DTD as default in that case could cause strange exceptions in the XML parser that would only arise with such an InputStream specified.
The recommended solution is the same as the general resource loading recommendation of the past two years:Do not use InputStreamResource unless explicitly necessary.
resource.irf是什么
resource.irf是一种文件格式,通常用于存储与资源相关的数据。
在软件开发的领域里,资源文件常常包含程序中用到的各种数据,例如图像、声音、文本等。这些数据以二进制或其他格式存储在资源文件中,以便程序在运行时能够方便地访问和使用。resource.irf文件就是其中一种资源文件的格式,它可能包含了特定程序所需的多种资源数据。
具体来说,resource.irf文件可能包含一些程序代码、图形图像、声音文件等。这些资源可能是为特定的应用程序或系统开发的,并在运行时由应用程序或系统调用和使用。例如,一个游戏程序可能会使用resource.irf文件来存储游戏所需的图像、音效和动画等资源,以便在游戏运行时能够加载和显示这些资源。
此外,resource.irf文件的具体结构和内容可能因应用程序或系统的不同而有所差异。不同的开发者可能会根据自己的需求和规范来创建和使用resource.irf文件,因此其具体格式和内容可能会有所不同。
总的来说,resource.irf文件是一种用于存储程序资源的文件格式,其具体结构和内容因应用程序或系统的不同而有所差异。了解resource.irf文件的具体内容和格式通常需要查阅相关的开发文档或源代码。