本文承接前文Spring源码情操陶冶-DefaultBeanDefinitionDocumentReader#parseBeanDefinitions,特开辟出一块新地来啃啃这块有意思的骨头 自定义节点的类型 我们常用的可分为spring/springmvc两类 spring常用的节点类型 context类型 context-component-scan-扫描包内的所有class类并注册为beanDefinition到spring上下文 context-property-placeholder-…
承接前文Spring源码情操陶冶-自定义节点的解析,本文讲述spring通过context:component-scan节点干了什么事 ComponentScanBeanDefinitionParser#私有属性 罗列下context:component-scan可填的基础属性 private static final String BASE_PACKAGE_ATTRIBUTE = "base-package"; private static final String RESOURCE…
本文承接前文Spring源码情操陶冶-自定义节点的解析,分析spring中的context:annotation-config节点如何被解析 源码概览 对BeanDefinitionParser接口的实现方法parse代码如下 @Override public BeanDefinition parse(Element element, ParserContext parserContext) { Object source = parserContext.extractSource(elemen…
本文针对spring配置的context:property-placeholder作下简单的分析,承接前文Spring源码情操陶冶-自定义节点的解析 spring配置文件应用 <context:property-placeholder location="classpath:context.properties"> PropertyPlaceholderBeanDefinitionParser-继承关系 配置文件解析类的继承关系如下 * AbstractBeanDefini…
在spring中,是支持单实例bean的循环引用(循环依赖)的,循环依赖,简单而言,就是A类中注入了B类,B类中注入了A类,首先贴出我的代码示例 @Component public class AddressVO { @Autowired private UserVO userVO; } @Component public class UserVO { @Autowired private AddressVO addressVO; public void test(){ System.out.p…
继续spring源码的学习之路,现在越来越觉得这个真的很枯燥的,而且我觉得要是自己来看源码,真的看不下去,不是没有耐心,而是真的没有头绪,我觉得结合着书来看,还是很有必要的,最起码大致的流程是能够捋清楚的,继续,希望自己能够坚持到最后! 一.标签解析的总体的理解 spring标签包括默认标签和自定义标签两种,今天只是来探索默认标签的! org.springframework.beans.factory.xml包下的DefaultBeanDefinitionDocumentReader类中 pri…
1. 读源码的方法 java程序员都知道读源码的重要性,尤其是spring的源码,代码设计不仅优雅,而且功能越来越强大,几乎可以与很多开源框架整合,让应用更易于专注业务领域开发.但是能把spring的源码吃透,不仅需要花费大量时间与精力,更需要需要掌握一些方法.下面结合自己读源码与走过的一些弯路,结合网上知名博客专家的建议,整理出以下要点,与读者共勉. 1.1 重视官方英文文档 spring的官方文档写的非常全面,基本可以认为是spring源码思想的一手来源,上面有很多例子不仅帮助读者如何应用,…
aop-Aspect Oriented Programming,面向切面编程.根据百度百科的解释,其通过预编译方式和运行期动态代理实现程序功能的一种技术.主要目的是为了程序间的解耦,常用于日志记录.事务管理等方面. spring中常用<aop-config>来配置aop代理 AOP概念梳理 切面(Aspect) 连接点(Joinpoint) 通知(Advice) 切入点(PointCut) 目标对象 AOP代理 具体的AOP解释以及用法可详情参考专业人士写的博客>>>Spri…
简介 前面已经讲完 spring-bean( 详见Spring ),这篇博客开始攻克 Spring 的另一个重要模块--spring-aop. spring-aop 可以实现动态代理(底层是使用 JDK 动态代理或 cglib 来生成代理类),在项目中,一般被用来实现日志.权限.事务等的统一管理. 我将通过两篇博客来详细介绍 spring-aop 的使用.源码等.这是第一篇博客,主要介绍 spring-aop 的组件.架构.使用等. 项目环境 maven:3.6.3 操作系统:win10 JDK…
记录并分享一下本人学习spring源码的过程,有什么问题或者补充会持续更新.欢迎大家指正! 环境: spring5.X + idea 建议:学习过程中要开着源码一步一步过 Spring根据BeanDefinition创建单例对象 DefaultSingletonBeanRegister中getSingleton((String beanName, ObjectFactory<?> singletonFactory)) public Object getSingleton(String bean…
距离上一次写Spring源码解析,已经过去了快要好几个月了,主要原因还是Spring的源码解析类文章太难写了,不像我先前写的什么CAS源码,AQS源码,LinkedBlockingQueue等等,这些无非就是分析几个核心方法,代码也不算太长,就像比较复杂的AQS源码也是两篇搞定的,虽然AQS源码也很多东西也不能算是百分百的理解,但是核心思想应该是还算理解的.解析完毕成就感也满满的,写完博客,看着大段大段的文字,心里也很开心:哈哈哈,原来JDK源码也是可以读懂的,而且还能写出来.但是Spring源…
一.BeanDefinition 1. bean定义都定义了什么? 2.BeanDefinition的继承体系  父类: AttributeAccessor: 可以在xml的bean定义里面加上DTD文件里面没有的属性,如 <bean id="cbean" class="com.study.spring.samples.CBean" name="leeSamll" age="18"> <constructor…
一.环境准备 在文件读取的时候,第9步我们发现spring会根据标签的namespace来选择读取方式,联想spring里提供的各种标签,比如<aop:xxx>等应该会有不同的读取和解析方式,这一章我们来找一个其他文件,了解下spring自定义标签和配置的读取流程. 手边正好有一套dubbo的源码,因此为了区别与spring的原生读取,就使用它来进行分析. 首先spring的配置文件中我们需要加上标签的namespace <?xml version="1.0" enc…
这个是接着上一篇来写,主要是这章内容比较多,还是分开来写吧! 一.AbstractBeanDefinition属性介绍 XML中的所有的属性都可以在GenericBeanDefinition中找到对应,GenericBeanDefinition只是子类实现,大部分通用的配置都在其父类AbstractBeanDefinition中定义,来看一下AbstractBeanDefinition中有哪些属性定义,因为我看的是spring5.0版本,和作者的版本应该不一样,这里是少了两个属性的就是scope…
本文主要讲解Spring加载xml配置文件的方式,跟踪加载BeanDefinition的全过程. 源码分析 源码的入口 ClassPathXmlApplicationContext构造函数 new ClassPathXmlApplicationContext(“spring.xml”)用于加载CLASSPATH下的Spring配置文件,将配置文件传给构造函数,然后调用类内部的另外一个重载方法. 从构造函数中,可以看到一共做了3件事 super(parent) super(parent)的作用是为…
obtainFreshBeanFactory()方法概述 定义BeanFactory,并加载以下两种bean的定义,装配到BeanFactory: 1.配置文件中定义的bean 2.通过<context:component-scan base-package="..." />配置的路径下的,且经过相应注解标注的所有类,注解包括:@Controller.@Service.@Component.@Repository 源码解读 主要流程总结: 1.创建BeanFactory:D…
转载请注明出处https://www.cnblogs.com/yang-zd/p/11352833.html,谢谢合作! 前面已经分析了memcached中的slabs内存管理及缓存对象如何利用item表达并存储在slabs管理的空间中,并分析了如何实现LRU策略实现缓存对象的释放.但memcached是一个client-server结构的缓存系统,服务端需要接收客户端的指令,然后在服务端做相应的操作,比如新建缓存对象,读取缓存对象.memcached使用libevent实现这些网络通信操作,接…
1.XmlBeanFactory 的使用,参考MyEclipse Spring 学习总结一 Spring IOC容器 public static void main(String[] args) { XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); HelloWorld obj = (HelloWorld)factory.getBean("…
Spring广泛的被使用足以证明它的价值,成功的东西自然值得我们深入学习.有很多人说的熟悉Spring也只是简单的使用经验,当我发现我也是其中一员时我很恐惧,所以开始扒源码,准备深入了解,话不多说,直奔主题.首先我们知道Bean是Spring的核心,所以就从这里入手分析一下Spring是如何创建Bean对象的.首先来看一下Bean的继承关系. 在这份关系图中,我们可以清楚的看见类之间的关系,首先BeanFactory是所有类的父类,准确的说这是一个接口,如果你查找比较老一点的代码的话你可以看见使…
public class Test { public static void main(String[] args) throws Exception { BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("bean.xml")); Person person = beanFactory.getBean("person",Person.class); person.info(); }…
阅读本文请先稍微浏览下上篇文章Spring源码情操陶冶-AOP之ConfigBeanDefinitionParser解析器,本文则对aop模式的通知类作简单的分析 入口 根据前文讲解,我们知道通知类的解析主要建立在aop:aspect节点的解析上.废话少说我们直接观察ConfigBeanDefinitionParser#parseAdvice()方法 ConfigBeanDefinitionParser#parseAdvice()-解析通知类并注册到bean工厂 先奉上源码 /** * Pars…
1. BeanDefinition简介 前面讲的解析bean标签,本质就是将bean的信息封装成BeanDefinition对象的过程,最后放入容器beanDefinitionMap中.spring 要根据 BeanDefinition对象来实例化bean,只要把解析的标签,扫描的注解类封装成BeanDefinition对象,spring才能实例化bean. BeanDefinition有三个实现类,ChildBeanDefinition.GenericBeanDefinition.RootBe…
承接Spring源码情操陶冶-自定义节点的解析.本节关于事务进行简单的解析 spring配置文件样例 简单的事务配置,对save/delete开头的方法加事务,get/find开头的设置为不加事务只读模式 <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*"…
承接Spring源码情操陶冶-自定义节点的解析.线程池是jdk的一个很重要的概念,在很多的场景都会应用到,多用于处理多任务的并发处理,此处借由spring整合jdk的cocurrent包的方式来进行深入的分析 spring配置文件样例 配置简单线程池 <task:executor keep-alive="60" queue-capacity="20" pool-size="5" rejection-policy="DISCARD&…
简介 spring-aop 用于生成动态代理类(底层是使用 JDK 动态代理或 cglib 来生成代理类),搭配 spring-bean 一起使用,可以使 AOP 更加解耦.方便.在实际项目中,spring-aop 被广泛用来实现日志.权限.事务.异常等的统一管理. 上一篇博客(Spring源码系列(三)--spring-aop的基础组件.架构和使用)简单讲了 spring-aop 的基础组件.架构和使用方法,本文将开始研究 spring-aop 的源码,主要分成以下部分: spring-aop…
写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Document对象,处理完profile后终于到了标签的解析,这篇文章主要来探究Spring默认标签的解析. 1.4 BeanDefinition的创建 - 处理Spring默认标签 protected void parseBeanDefinitions(Element root, BeanDefiniti…
写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spring的整体思路就是按部就班的读取标签并把数据放入一个map集合中以备后用. ps:以前在看别人写博客时没有很注意,到自己写才发现:博文一长,如何去维持文章的可读性,让读者在阅读时理清整篇文章的脉络实在是一件很难的事情.上篇文章就是如此,我自己回头去读时都难以去顺畅的学习,何况他人,甚是惭愧.也尝试数…
在上一章中笔者介绍了refresh()的<1>处是如何获取beanFactory对象,下面我们要来学习refresh()方法的<2>处是如何调用invokeBeanFactoryPostProcessors方法执行bean工厂后置处理器,这个方法在笔者看来是整个refresh()方法最重要的方法之一,因为就是在这个方法完成了扫描类路径下所有的类,并将类解析成BeanDefinition注册到spring容器中. public abstract class AbstractAppli…
写在前面 上文 Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件主要讲Spring容器创建时通过XmlBeanDefinitionReader读取配置文件,将其经过编码并经过系列处理后,交给了同类中的doLoadBeanDefinitions()方法,这次就直接进入这个方法,来看看Spring到底是如何创建BeanDefinition的. 1.2 BeanDefinition的创建 - 创建BeanDefinition前的最终准备 首先进入…
写在前面 从大四实习至今已一年有余,作为一个程序员,一直没有用心去记录自己工作中遇到的问题,甚是惭愧,打算从今日起开始养成写博客的习惯.作为一名java开发人员,Spring是永远绕不过的话题,它的设计精巧,代码优美,值得每一名开发人员学习阅读. 在我最开始学习javaEE时,第一次接触Spring是从一个S(Struts)S(Spring)H(Herbinate)的框架开始.由java原生开发到框架开发转换过程中,那时我的印象里Struts负责控制层,herbinate负责数据层,而Sprin…