精华内容
下载资源
问答
  • Spring源码

    2017-10-24 17:05:35
    最新版本的Spring源码,提供用于Spring框架的学习,希望大家共同进步!
  • 因为直接下载下来的代码不能直接导入到IDEA,这个是可以直接导入的:打开IDEA,File->New->Project From Existing Sources…,选中Spring-framework文件夹,OK->Import project from external model,选中Gradle,...
  • spring源码

    2018-10-16 14:58:42
    springmvc的源码,采用典型的三层架构进行开发,最简单的增删改查,登陆、修改密码等
  • Java spring源码

    2016-10-07 17:30:29
    Java spring源码
  • spring源代码

    2018-10-31 16:43:11
    spring5.0.6框架源代码,看好源代码就是关键,祝你成功
  • Spring源码解读

    2017-12-28 11:20:29
    spring源码spring源码spring源码spring源码spring源码spring源码,pring源码,spring源码spring源码spring源码spring源码spring源码spring源码,pring源码,pring源码,pring源码,pring源码,...
  • 通过参与,您将遵守此代码。 请向报告不可接受的行为。 下载工件 请参阅以获取Maven信息库信息。 无法使用Maven或其他可传递依赖项管理工具? 请参阅。 文献资料 请参阅当前的和。 获得支持 在上检查一下标签。 也...
  • spring 源码环境搭建

    2018-11-19 11:14:32
    想要读spring源码但是是又不知道如何下手的同学看过来。文档中介绍如何搭建spring源码环境。
  • spring源码4.3

    2019-02-26 17:00:44
    spring源码4.3,未编译的源码,方便大家进行下载,无需到github下下载。
  • spring 源码解析

    2019-01-10 16:36:47
    spring源码解析,分享出来,供大家学习研究 a
  • spring 源码中文注释

    2018-12-11 15:22:05
    spring 源码解析
  • Spring框架 这是Spring框架的所在地,它是所有的基础。...从构建 请参阅Wiki页面以及 。 保持联系 在Twitter上关注 , 及其。 可以在上找到深入的文章,并通过我们的宣布其。 执照 Spring框架是在2.0版下。
  • spring源码中英文注释

    2020-01-12 07:34:32
    spring源码 中英文注释
  • Spring源码.zip

    2019-11-30 07:28:13
    Spring5的源码,包含注释,使用gradle进行构建编译,安装gradle的版本为4.9,也可以时4.9以上的,然后导入的时候进行gradle配置,最后使用右键选择run进行编译,就可以在上面编写代码了,构建过程时间有点长,往见谅...
  • 学习和深读Spring源码一个重要的安排:编译源码到我们的本地环境。这样方便我们在本地环境中添加注释,断点追踪,查看类或接口的继承关系。等等,更高效的学习Spring原始代码。个人觉得深读Spring原始代码对我们的...
  • spring源码注释中文

    2019-04-12 09:47:30
    spring源码带注释的,直接可以阅读,不需要重新编译。
  • 包含SPRING技术内幕:深入解析SPRING架构与设计原理(第2版)【带书签】,spring揭秘(完整),深入剖析Spring Web源码 (第二版) ,这几本有关spring 源码解析的书籍,看了挺不错的
  • spring源码分析专题,源码分析视频,对spring的源码进行分析
  • 搭建Spring源码调试环境的工具,亲测有效,遇到的问题都解决了呢!
  • NULL 博文链接:https://ylxy3058.iteye.com/blog/2224244
  • spring 源码

    2018-05-13 10:27:11
    Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。
  • spring源代码 官网下载是gradle版本 已转化为eclipse可以使用的项目
  • 学习spring源码的第一步便是需要去编译源码;很多网友在编译spring源码的时候遇到了困难继而放弃了spring源码的学习; 这篇文章主要来阐述如何正确的编译spring源码;首先你得检查你的网线能正常上网;最好网速还行...

    学习spring源码的第一步便是需要去编译源码;很多网友在编译spring源码的时候遇到了困难继而放弃了spring源码的学习;
    这篇文章主要来阐述如何正确的编译spring源码;首先你得检查你的网线能正常上网;最好网速还行;不然你会疯掉

    下载spring源码

    下载spring源码可以选择github或者码云(国内的);下载方式可以选择git clone 或者直接下载一个zip包;笔者推荐使用git clone这种方式;我在本地的d:\workspace下面clone了spring5.1.x的源码(写文章的时候spring已经有了5.2了,版本你自己选择)

    在这里插入图片描述

    阅读spring的编译文档

    如何编译spring的源码其实spring提供了详细的文档;离线版和在线版都有(离线版在我们下过来的源码当中的README.md);这里我们选择在线版作为参考吧;在github上spring-framework这个项目的底下有一个build from source的章节

    在这里插入图片描述

    点击这个链接之后就是构建编译spring源码的文档
    编译文档地址 https://github.com/spring-projects/spring-framework/wiki/Build-from-Source

    在这里插入图片描述

    本文中我会参考这个文档来重新编译一个spring5.1.x的源码;按照文档说的首先你得具备一个jdk8以上的环境;笔者使用的是jdk11;然后通过git clond一份源码下来;这个事情我们已经做完了;继而到项目的根目录运行 ./gradlew build但是文档上是linux命令,如果是windows系统其实我可以看到项目的根目录下面有个gradlew.bat的文件;可以直接运行这个文件(不建议双击直接运行,因为如果有错误你看不到,建议通过cmd去运行这样就能看到他提示的错误);

    其实我们不着急去运行这个文件;运行这个命令spring会首先去下载一个gradle到你本地,然后通过gradle去编译spring源码;为什么运行这个命令会自动下载gradle呢?从哪下载呢?版本是什么呢?

    首先看看这个命令的是否存在根目录

    在这里插入图片描述

    上述gradlew.bat就是等下我们需要运行的命令;但是先不着急运行;因为这个命令回去读取一个文件;在这个文件当中配置了gradle的版本和下载地址;一旦运行变化自动下载;有时候会下载不过来;而且有时候可能需要翻墙等等,就算下载过来了目录在哪里也是他自动指定的,下载过来后解压目录等等都是在那个文件里面配置了;索性我们自己下载过来然后修改这个配置文件;
    0、配置文件的位置——D:\workspace\spring-framework\gradle\wrapper\gradle-wrapper.properties
    1、可以修改这个下载地址——默认是一个http的url;如果你自己下载过来后可以修改为自己的本地目录
    2、下载后的存放目录、以及解压目录都可以修改——但是不建议修改可以使用默认的

    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    distributionUrl=file\:///d\:/tools/java/gradle-6.5.1-bin.zip
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    

    distributionBase 下载之后的目录(从distributionUrl下载过来是一个zip文件,存放的目录)
    GRADLE_USER_HOME 如果是windows系统默认问c:\Users\你的用户.gradle
    distributionPath 会自动拼接 distributionBase
    zipStoreBase 是解压目录

    上述配置的大概意思就是如果我们运行gradlew.bat 会自动去 file:///d:/tools/java/gradle-6.5.1-bin.zip这个目录下载一个gradle到C:\Users\java_\.gradle\wrapper\dists然后解压到C:\Users\java_\.gradle\wrapper\dists;但是实际目录不是这个,这个命令还会自己生成一些目录;下图是笔者电脑实际gradle的解压目录

    在这里插入图片描述

    但是关于gradle-6.5.1-bin.zip这个文件哪里能下载,可以自己百度;当然也可以从笔者的网盘上下载
    链接:https://pan.baidu.com/s/1CyfaZvBGBczJ8QSj66JFKA 提取码:5qvd

    在这里插入图片描述

    改完这个配置也不要急着运行命令编译;因为当自动下载完gradle之后会通过gradle去编译spring源码;这里就涉及到一个gradle的中央仓库的问题了,编译过程中会下载大量的依赖;如果你采用默认的依赖那么这个编译过程一定特别漫长;而且会失败;于是我们需要修改中央仓库为国内的阿里云;这样就会快很多;如何修改呢?

    找到项目根目录的build.gradle文件,打开并且编辑添加阿里云的仓库

    在这里插入图片描述

    repositories {
    			mavenCentral()
    			maven { url "https://repo.spring.io/libs-spring-framework-build" }
    			maven { url "https://repo.spring.io/snapshot" } // Reactor
    			maven {url 'https://maven.aliyun.com/nexus/content/groups/public/'} //阿里云
    			maven {url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
    		}
    

    至此万事具备只欠东风了,cmd到项目根目录运行gradlew.bat(当然这些优化是笔者自己总结出来的,如果你的网速够快你完全可以不用优化,直接运行那个命令);

    在这里插入图片描述

    这个过程会相当漫长取决于你的网速;我再截几张笔者编译过程中的图

    在这里插入图片描述

    这个结果可能会最后显示失败;如果显示失败就再运行一遍gradlew.bat直到他编译成功;下图是显示编译成功的结果

    在这里插入图片描述

    编译成功后就可以导入idea了(一共用了36分钟;差不多一个子路的时间);至于文档上说的publishToMavenLocal这些操作可以不用;如何导入idea他也提供了文档
    导入idea的文档地址:https://github.com/spring-projects/spring-framework/blob/master/import-into-idea.md

    在这里插入图片描述

    根据文档的提示在导入idea之前需要去Precompile spring-oxm也就是预编译 oxm这个项目;运行gradlew :spring-oxm:compileTestJava

    在这里插入图片描述
    这个预编译很快笔者的破电脑38s便编译完了;

    导入idea

    导入之前你随便打开一个项目,然后在该项目当中对idea进行一些设置(当然如果你知道如何去对idea进行全局设置可以不必要打开一个项目)

    在这里插入图片描述
    这个设置尤为重要特别是第二个设置一定要指定前面我们自动下载过来解压的gradle;不然又会下载一遍jar;

    设置完成之后开始把源码导入到idea
    在这里插入图片描述

    选择项目的目录;继而选择根目录当中的build.gradle文件导入

    在这里插入图片描述

    导入idea之后会开始建立索引这个过程也是很漫长,你只能等,大概10-20分钟吧;看电脑性能

    在这里插入图片描述

    正确构建之后如下图

    在这里插入图片描述
    接下来要对idea进行设置,不然每次idea运行都会通过gradle去编译运行——gradle运行编译特别慢;需要改成idea自己编译运行

    在这里插入图片描述

    再次说明一下这里不是一定要改,但是如果你不改用默认的则会特别慢,改成idea快的不止一点点

    改完之后便可以建一个子model来测试了,但是一定得建gradle的项目,因为spring源码这个父项目就是用gradle来开发的

    在这里插入图片描述

    在这里插入图片描述

    建好项目之后再gradle的配置文件中添加spring的依赖——相当于你建了一个maven项目,在pom文件中添加spring的依赖;

    compile(project(":spring-context"))
    

    在这里插入图片描述
    然后开始开始完善项目的其他类

    配置类的代码

    @Configuration
    @ComponentScan("com.shadow")
    public class AppConfig {
    //扫描com.shadow包下面的所有bean
    }
    

    service的代码

    @Component
    public class IndexService {
    }
    

    测试类的代码

    public class ShadowTest {
    	public static void main(String[] args) {
    		AnnotationConfigApplicationContext
    				ac
    				= new AnnotationConfigApplicationContext(AppConfig.class);
    		System.out.println(ac.getBean(IndexService.class));
    	}
    }
    

    右键运行——可能你会出现一些错误;比如博主这里就出现了某些类找不到的错误

    在这里插入图片描述

    遇到这种问题是因为这个类所在的项目没有编译这个类——说白了就是没有产生class文件;比如上图那个错误便是没有找到 InstrumentationSavingAgent 这个类,那么你首先找到这个类所在的项目(InstrumentationSavingAgent类所在的项目为spring-instrument);再看看out文件下面是不是有这个class;比如博主这里连out文件夹没有——build文件下下面是gradle产生的,我们上面已经把编译方式改成了idea,idea默认编译文件为out——说白了就是这个build可以直接删除;out文件夹都没有表示这个项目当中的java类idea压根没有编译;我们可以运行这个项目下面的测试类test让idea去帮我们编译这些java类

    在这里插入图片描述

    上图可以看到我已经吧build文件删除了;找到test文件夹下面的java文件夹右键 run all tests

    在这里插入图片描述

    遇到其他问题也类似这种办法解决,最后再次运行我们自己的main方法;

    在这里插入图片描述
    一些正常;spring5.1.x的源码编译导入idea完成

    最近比较忙二宝刚出生;看完如果觉得对你有帮助点赞评论都是支持博主更新的动力,我会尽快出下一篇spring的源码的文章

    最后大家B搜索一下**“边境线java”** 这是我个人的b站账号,我会在上面一直更新一些java技术

    展开全文
  • XmlBeanFactory继承自DefaultListableBeanFactory,而DefaultListableBeanFactory是整个bean加载的核心部分,是Spring注册及加载bean的默认实现,XmlBeanFactory与DefaultListableBeanFactory不同的地方其实是在...
  • 一、概述 对于大多数第一次看spring源码的人来说,都会感觉不知从哪开始看起,因为spring项目源码由多个子项目组成,如spring-beans,spring-context,spring-core,spring-aop,spring-web,spring-webmvc等,整个...

    一、概述

    • 对于大多数第一次看spring源码的人来说,都会感觉不知从哪开始看起,因为spring项目源码由多个子项目组成,如spring-beans,spring-context,spring-core,spring-aop,spring-web,spring-webmvc等,整个项目结构如图:
      在这里插入图片描述
    • 可能有人会觉得,既然spring是一个IOC容器或者说是一个bean的容器,那么应该从spring-beans看起,先了解spring是如何从xml文件配置获取需要创建的bean的信息,但是这里有个问题就是虽然知道怎么遍历初始化,但是不知道哪里用到或者说哪里让这些初始化开始,而且像BeanFactory,FactoryBean,Environment,PropertySource等接口还是比较抽象的,比较难看懂,所以很容易让人感觉枯燥,然后就放弃了。
    • 我们可以换个思路,从能接触到的角度开始,即我们通常会使用spring-mvc来进行web开发,如@Controller,@RequestMapping都是再熟悉不过的了。如果搭过spring-mvc项目都知道,通常需要在web.xml文件中,配置一个ContextLoaderListener,contextConfigLocation,DispatcherServlet,可能很多人都是从网上copy了一份配置过来或者知道contextConfigLocation是指定spring配置文件的位置,DispatcherServlet是接收所有请求的前端控制器,需要指定拦截路由:“/”,从而拦截所有URL中带“/”的请求,但是在spring源码中是怎么使用这些组件的呢?以及怎么配置了一个@Controller,@RequestMapping中指定了一个url,就可以访问了呢?还有就是通常我们的web项目都会部署在web容器,如tomcat当中,那么tomcat和spring有啥关系呢?所以我们可以带着这些问题去查看spring源码找到答案。
    • 所以我推荐是从spring-mvc开始看spring源码,因为这个是我们使用得比较多,比较容易理解的一个模块,然后一层一层往上剥,找到与spring-context,spring-beans,spring-aop等的关系。如果真的对JavaWeb开发,Java EE很感兴趣,或者更容易读懂spring的源码,可以先看servlet规范和Tomcat的设计与Tomcat的请求处理工作流。我目前也在结合这两个方面看,也可以看下我的Tomcat源码分析系列。

    二、Servlet规范

    • 在servlet的规范当中,servlet容器或者叫web容器,如tomcat,中运行的每个应用都由一个ServletContext表示,在web容器中可以包含多个ServletContext,即可以有多个web应用在web容器中运行。如在tomcat的webapp目录下,每个war包都对应一个web应用,tomcat启动时会解压war包,并启动相关的应用。
    • 在web容器启动的时候,会初始化web应用,即创建ServletContext对象,加载解析web.xml文件,获取该应用的Filters,Listener,Servlet等组件的配置并创建对象实例,作为ServletContext的属性,保存在ServletContext当中。之后web容器接收到客户端请求时,则会根据请求信息,匹配到处理这个请求的Servlet,同时在交给servlet处理之前,会先使用应用配置的Filters对这个请求先进行过滤,最后才交给servlet处理。
    • 了解web容器启动,之后接受客户端请求这些知识有啥用处呢?这里我们需要回过头来看我们的spring项目。我们在日常开发中,直接接触的是spring相关的组件,然后打成war包,放到web容器中,如拷贝到tomcat的webapp目录,并不会直接和web容器打交道。经过以上的分析,其实一个spring项目就是对应web容器里的一个ServletContext,所以在ServletContext对象的创建和初始化的时候,就需要一种机制来触发spring相关组件的创建和初始化,如包含@Controller和@RequestMapping注解的类和方法,这样才能处理请求。

    三、Listener监听器机制:ContextLoaderListener

    • servlet规范当中,使用了Listener监听器机制来进行web容器相关组件的生命周期管理以及Event事件监听器来实现组件之间的交互。
    • 其中一个重要的生命周期监听器是ServletContextListener。web容器在创建和初始化ServletContext的时候,会产生一个ServletContextEvent事件,其中ServletContextEvent包含该ServletContext的引用。然后交给在web.xml中配置的,注册到这个ServletContext的监听器ServletContextListener。ServletContextListener在其contextInitialized方法中定义处理逻辑,接口定义如下:
      /**
       * Implementations of this interface receive notifications about changes to the
       * servlet context of the web application they are part of. To receive
       * notification events, the implementation class must be configured in the
       * deployment descriptor for the web application.
       *
       * @see ServletContextEvent
       * @since v 2.3
       */
      public interface ServletContextListener extends EventListener {
      
          /**
           ** Notification that the web application initialization process is starting.
           * All ServletContextListeners are notified of context initialization before
           * any filter or servlet in the web application is initialized.
           * @param sce Information about the ServletContext that was initialized
           */
          public void contextInitialized(ServletContextEvent sce);
      
          /**
           ** Notification that the servlet context is about to be shut down. All
           * servlets and filters have been destroy()ed before any
           * ServletContextListeners are notified of context destruction.
           * @param sce Information about the ServletContext that was destroyed
           */
          public void contextDestroyed(ServletContextEvent sce);
      }
      
      从contextInitialized的注释可知:通知所有的ServletContextListeners,当前的web应用正在启动,而且这些ServletContextListeners是在Filters和Servlets创建之前接收到通知的。所以在这个时候,web应用还不能接收请求,故可以在这里完成底层处理请求的组件的加载,这样等之后接收请求的Filters和Servlets创建时,则可以使用这些创建好的组件了。spring相关的bean就是这里所说的底层处理请求的组件,如数据库连接池,数据库事务管理器等。
    • ContextLoaderListener:spring-web包的ContextLoaderListener就是一个ServletContextListener的实现类。ContextLoaderListener主要用来获取spring项目的整体配置信息,并创建对应的WebApplicationContext来保存bean的信息,以及创建这些bean的对象实例。默认去WEB-INF下加载applicationContext.xml配置,如果applicationContext.xml放在其他位置,或者使用其他不同的名称,或者使用多个xml文件,则与指定contextConfigLocation。具体spring源码的实现过程后续文章详细分析。
      <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      <!-- 修改配置文件路径 -->
      <context-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring/applicationContext.xml</param-value>
      </context-param>
      

    四、DispatcherServlet:前端控制器

    • 在web容器中,web.xml中的加载顺序:context-param -> listener -> filter -> servlet。其中ContextLoaderListener是属于listener阶段。我们通常需要在项目的web.xml中配置一个DispatcherServlet,并配置拦截包含“/”路径的请求,即拦截所有请求。这样在web容器启动应用时,在servlet阶段会创建这个servlet,由Servlet规范中servlet的生命周期方法可知:
      public interface Servlet {
          void init(ServletConfig var1) throws ServletException;
      
          ServletConfig getServletConfig();
      
          void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
      
          String getServletInfo();
      
          void destroy();
      }
      
      web容器在创建这个servlet的时候,会调用其init方法,故可以在DispatcherServlet的init方法中定义初始化逻辑,核心实现了创建DispatcherServlet自身的一个WebApplicationContext,注意在spring中每个servlet可以包含一个独立的WebApplicationContext来维护自身的组件,而上面通过ContextLoaderListener创建的WebApplicationContext为共有的,通常也是最顶层,即root WebApplicationContext,servlet的WebApplicationContext可以通过setParent方法设值到自身的一个属性。DispatcherServlet默认是加载WEB-INF下面的“servletName”-servlet.xml,来获取配置信息的,也可以与ContextLoaderListener一样通过contextLoaderConfig来指定位置。DispatcherServlet具体的源码设计在之后文章详细分析。

    五、总结

    • 从上面的分析,可知spring相关配置解析和组件创建其实是在web容器中,启动一个web应用的时候,即在其ServletContext组件创建的时候,首先解析web.xml获取该应用配置的listeners列表和servlet列表,然后保存在自身的一个属性中,然后通过分发生命周期事件ServletContextEvent给这些listeners,从而在listeners感知到应用在启动了,然后自定义自身的处理逻辑,如spring的ContextLoaderListener就是解析spring的配置文件并创建相关的bean,这样其实也是实现了一种代码的解耦;其次是创建配置的servlet列表,调用servlet的init方法,这样servlet可以自定义初始化逻辑,DispatcherServlet就是其中一个servlet。
    • 所以在ContextLoaderListener和DispatcherServlet的创建时,都会进行WebApplicationContext的创建,这里其实就是IOC容器的创建了,即会交给spring-context,spring-beans包相关的类进行处理了,故可以从这里作为一个入口,一层一层地剥spring的源码了。
    展开全文
  • Tom_深入分析Spring源码docTom_深入分析Spring源码doc
  • spring 源码 翻译注释

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 542,774
精华内容 217,109
关键字:

spring源码

spring 订阅