首页 文章 精选 留言 我的

精选列表

搜索[ioc],共1136篇文章
优秀的个人博客,低调大师

SpringFramework核心技术一(IOC:注册一个LoadTimeWeaver)

一、什么是LoadTimeWeaver 在LoadTimeWeaver用于由Spring动态变换的类,因为它们被装载到Java虚拟机(JVM)。 要启用加载时织入,请将其添加@EnableLoadTimeWeaving到您的某个 @Configuration类中: @Configuration @EnableLoadTimeWeaving public class AppConfig { } 或者对于XML配置,请使用以下context:load-time-weaver元素: <beans> <context:load-time-weaver/> </beans> 一旦配置为ApplicationContext。它内部的任何bean都ApplicationContext 可以实现LoadTimeWeaverAware,从而接收对加载时织机实例的引用。这与Spring的JPA支持相结合特别有用, 因为JPA类转换可能需要加载时织入。有关LocalContainerEntityManagerFactoryBean更多详细信息,请参阅javadocs。有关AspectJ加载时织入的更多信息,请参阅Spring框架中使用AspectJ进行加载时织入。 好了,注册一个LoadTimeWeaver就到这里啦。

优秀的个人博客,低调大师

【死磕 Spring】----- IOC 之解析 bean 标签:解析自定义标签

前面四篇文章都是分析 Bean 默认标签的解析过程,包括基本属性、六个子元素(meta、lookup-method、replaced-method、constructor-arg、property、qualifier),涉及内容较多,拆分成了四篇文章,导致我们已经忘记从哪里出发的了, 勿忘初心。 processBeanDefinition() 负责 Bean 标签的解析,在解析过程中首先调用BeanDefinitionParserDelegate.parseBeanDefinitionElement() 完成默认标签的解析,如果解析成功(返回的 bdHolder != null ),则首先调用 BeanDefinitionParserDelegate.decorateBeanDefinitionIfRequired() 完成自定义标签元素解析,前面四篇文章已经分析了默认标签的解析,所以这篇文章分析自定义标签的解析。 public BeanDefinitionHolder decorateBeanDefinitionIfRequired(Element ele, BeanDefinitionHolder definitionHolder) { return decorateBeanDefinitionIfRequired(ele, definitionHolder, null); } 调用 decorateBeanDefinitionIfRequired() : public BeanDefinitionHolder decorateBeanDefinitionIfRequired( Element ele, BeanDefinitionHolder definitionHolder, @Nullable BeanDefinition containingBd) { BeanDefinitionHolder finalDefinition = definitionHolder; // 遍历节点,查看是否有适用于装饰的属性 NamedNodeMap attributes = ele.getAttributes(); for (int i = 0; i < attributes.getLength(); i++) { Node node = attributes.item(i); finalDefinition = decorateIfRequired(node, finalDefinition, containingBd); } // 遍历子节点,查看是否有适用于修饰的子元素 NodeList children = ele.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { finalDefinition = decorateIfRequired(node, finalDefinition, containingBd); } } return finalDefinition; } 遍历节点(子节点),调用 decorateIfRequired() 装饰节点(子节点)。 public BeanDefinitionHolder decorateIfRequired( Node node, BeanDefinitionHolder originalDef, @Nullable BeanDefinition containingBd) { // 获取自定义标签的命名空间 String namespaceUri = getNamespaceURI(node); // 过滤掉默认命名标签 if (namespaceUri != null && !isDefaultNamespace(namespaceUri)) { // 获取相应的处理器 NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri); if (handler != null) { // 进行装饰处理 BeanDefinitionHolder decorated = handler.decorate(node, originalDef, new ParserContext(this.readerContext, this, containingBd)); if (decorated != null) { return decorated; } } else if (namespaceUri.startsWith("http://www.springframework.org/")) { error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", node); } else { if (logger.isDebugEnabled()) { logger.debug("No Spring NamespaceHandler found for XML schema namespace [" + namespaceUri + "]"); } } } return originalDef; } 首先获取自定义标签的命名空间,如果不是默认的命名空间则根据该命名空间获取相应的处理器,最后调用处理器的 decorate() 进行装饰处理。具体的装饰过程这里不进行讲述,在后面分析自定义标签时会做详细说明。 至此,Bean 的解析过程已经全部完成了,下面做一个简要的总结。 解析 BeanDefinition 的入口在 DefaultBeanDefinitionDocumentReader.parseBeanDefinitions() 。该方法会根据命令空间来判断标签是默认标签还是自定义标签,其中默认标签由 parseDefaultElement() 实现,自定义标签由 parseCustomElement() 实现。在默认标签解析中,会根据标签名称的不同进行 import 、alias 、bean 、beans 四大标签进行处理,其中 bean 标签的解析为核心,它由 processBeanDefinition() 方法实现。 processBeanDefinition() 开始进入解析核心工作,分为三步: 解析默认标签: BeanDefinitionParserDelegate.parseBeanDefinitionElement() 解析默认标签下的自定义标签: BeanDefinitionParserDelegate.decorateBeanDefinitionIfRequired() 注册解析的 BeanDefinition: BeanDefinitionReaderUtils.registerBeanDefinition 在默认标签解析过程中,核心工作由 parseBeanDefinitionElement() 方法实现,该方法会依次解析 Bean 标签的属性、各个子元素,解析完成后返回一个 GenericBeanDefinition 实例对象。 原文发布时间为:2018-09-26 本文作者:Java技术驿站 本文来自云栖社区合作伙伴“Java技术驿站”,了解相关信息可以关注“Java技术驿站”。

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册