1、 要想在java技术上提升一下,不看一下java源码是不行的,jdk源码,框架源码等。但是源码那么多,专门去看源码肯定很枯燥,所以就得一点一点看,坚持下去。有一点心得就记一点,如org.springframework.stereotype包下有@Controller注解。

2、见名知意,如org.springframework.context.annotation包下的一些enable*注解,DelegatingWebMvcConfiguration,这个是类包含了很多web应用的默认配置。

3、Crtl+H全局搜索文件,方法,类等。。当时遇到AspectJAutoProxy注解。想找一个包在哪里都找不到-_-,尴尬。

--------------下面开始正文--------

  Spring呢,首先是一个容器,比如帮我们装配bean,面向切面功能等,所以最重要的类应该是ApplicationContext,首先应该抓住这个类看,说不定会好点。

package org.springframework.context;
// 这是一个借口,代码很简单,但是包含的信息量还是很多的,比如各个接口
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
@Nullable
String getId(); String getApplicationName(); String getDisplayName(); long getStartupDate(); @Nullable
ApplicationContext getParent(); AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}

  接下来还是要看ApplicationContext的继承类的实现源码,搜到几篇不错的文章:https://www.jianshu.com/p/8aaad9cff96b,https://www.jianshu.com/p/2537e2fec546,其中提到了,spring中使用的Context实际上是XmlWebApplicationContext,下面看看该源码:

package org.springframework.web.context.support;

public class XmlWebApplicationContext extends AbstractRefreshableWebApplicationContext {
public static final String DEFAULT_CONFIG_LOCATION = "/WEB-INF/applicationContext.xml";
public static final String DEFAULT_CONFIG_LOCATION_PREFIX = "/WEB-INF/";
public static final String DEFAULT_CONFIG_LOCATION_SUFFIX = ".xml"; public XmlWebApplicationContext() {
}
//省略了一些方法,看到了"/WEB-INF/“是不是感觉很熟悉,没错,这就是我们要将配置文件写到这里的原因。
}

  那么问题来了,要看看AbstractRefreshableWebApplicationContext的实现,这个类中应该可以看到很多内容

package org.springframework.web.context.support;public abstract class AbstractRefreshableWebApplicationContext extends AbstractRefreshableConfigApplicationContext implements ConfigurableWebApplicationContext, ThemeSource {
@Nullable
private ServletContext servletContext;
@Nullable
private ServletConfig servletConfig;
@Nullable
private String namespace;
@Nullable
private ThemeSource themeSource;
public AbstractRefreshableWebApplicationContext() {
this.setDisplayName("Root WebApplicationContext");
}
public void setServletContext(@Nullable ServletContext servletContext) {
this.servletContext = servletContext;
}
@Nullable
public ServletContext getServletContext() {
return this.servletContext;
}
//这里仍然只列举一些简要的代价,其中可以看到该对象可以获取到ServletContext,作为一个容器,要能访问(容纳)更多的对象
}

  AbstractRefreshableWebApplicationContext类中,方法不多,接下来还得看AbstractRefreshableConfigApplicationContext,这个类代码也不多,还得看其父类

AbstractRefreshableApplicationContext。
public abstract class AbstractRefreshableApplicationContext extends AbstractApplicationContext {
@Nullable
private Boolean allowBeanDefinitionOverriding;
@Nullable
private Boolean allowCircularReferences;
@Nullable
private DefaultListableBeanFactory beanFactory;
private final Object beanFactoryMonitor = new Object(); public AbstractRefreshableApplicationContext() {
}
//当然也省略了很多代码,追根溯源,马上就到根了,大多数代码还是在AbstractApplicationContext中,
}

   在看一下spring的启动代码:

package org.springframework.web;

@javax.servlet.annotation.HandlesTypes({org.springframework.web.WebApplicationInitializer.class})
public class SpringServletContainerInitializer implements javax.servlet.ServletContainerInitializer {
public SpringServletContainerInitializer() { /* compiled code */
public void onStartup(@org.springframework.lang.Nullable java.util.Set<java.lang.Class<?>> webAppInitializerClasses,
javax.servlet.ServletContext servletContext)
throws javax.servlet.ServletException { /* compiled code */ }
} 

这段代码是springboot的启动代码。 

1.注解不仅可以用在方法上,也可以用在参数上。

2.在servlet3.0环境中,容器会查找实现了javax.servlet.ServletContainerInitializer接口的类,如代码中的SpringServletContainerInitializer,就会使用其配置servlet容器。而该类又会查找实现了WebApplicationInitializer的类,AbstractAnnotationConfigDispatcherServletInitializer就实现了该类。


参考文章:https://www.jianshu.com/p/2854d8984dfc

慢慢看Spring源码的更多相关文章

  1. Spring源码分析(一):从哪里开始看spring源码(系列文章基于Spring5.0)

    概述 对于大多数第一次看spring源码的人来说,都会感觉不知从哪开始看起,因为spring项目源码由多个子项目组成,如spring-beans,spring-context,spring-core, ...

  2. 如何看Spring源码

    想要深入的熟悉了解Spring源码,我觉得第一步就是要有一个能跑起来的极尽简单的框架,下面我就教大家搭建一个最简单的Spring框架,而且是基于Java Config形式的零配置Spring框架. 首 ...

  3. 零基础带你看Spring源码——IOC控制反转

    本章开始来学习下Spring的源码,看看Spring框架最核心.最常用的功能是怎么实现的. 网上介绍Spring,说源码的文章,大多数都是生搬硬推,都是直接看来的观点换个描述就放出来.这并不能说有问题 ...

  4. 看Spring源码不得不会的@Enable模块驱动实现原理讲解

    这篇文章我想和你聊一聊 spring的@Enable模块驱动的实现原理. 在我们平时使用spring的过程中,如果想要加个定时任务的功能,那么就需要加注解@EnableScheduling,如果想使用 ...

  5. Spring源码情操陶冶-PropertyPlaceholderBeanDefinitionParser注解配置解析器

    本文针对spring配置的context:property-placeholder作下简单的分析,承接前文Spring源码情操陶冶-自定义节点的解析 spring配置文件应用 <context: ...

  6. Spring源码分析-BeanFactoryPostProcessors 应用之 PropertyPlaceholderConfigurer

    BeanFactoryPostProcessors 介绍 BeanFactoryPostProcessors完整定义: /** * Allows for custom modification of ...

  7. spring源码分析(一)IoC、DI

    创建日期:2016.08.06 修改日期:2016.08.07 - 2016.08.12 交流QQ:992591601 参考书籍:<spring源码深度解析>.<spring技术内幕 ...

  8. spring源码学习之路---AOP初探(六)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,但当初打算学习 ...

  9. Spring源码情操陶冶-ComponentScanBeanDefinitionParser文件扫描解析器

    承接前文Spring源码情操陶冶-自定义节点的解析,本文讲述spring通过context:component-scan节点干了什么事 ComponentScanBeanDefinitionParse ...

随机推荐

  1. quartus II输入原理图及仿真步骤

    在Quartus II中输入原理图以及实现仿真是学习基本数字电路的好方法.下面以一个基本的D锁存器为例,在quartus II 13.0中一步一步来实现原理图输入以及仿真过程. 1,创建工程 指定工程 ...

  2. python实战--csdn博客专栏下载器

    打算利用业余时间好好研究Python的web框架--web.py,深入剖析其实现原理,体会web.py精巧之美.但在研究源码的基础上至少得会用web.py.思前想后,没有好的Idea,于是打算开发一个 ...

  3. 01-复杂度1 最大子列和问题(剑指offer和PAT)

    01-复杂度1 最大子列和问题   (20分) 给定KK个整数组成的序列{ N​1​​, N​2​​, ..., N​K​​ },“连续子列”被定义为{ N​i​​, N​i+1​​, ..., N​ ...

  4. [Java] HashMap 源码简要分析

    特性 * 允许null作为key/value. * 不保证按照插入的顺序输出.使用hash构造的映射一般来讲是无序的. * 非线程安全. * 内部原理与Hashtable类似.   源码简要分析 pu ...

  5. EditText控件设置只读

    android的文本框输入控件(EditText),有时需要设置控件为只读,最简单的方法就是在layout xml文件中设置EditText的android:editable属性值为false即可,但 ...

  6. 源码版本管理工具 :TFS GIT

    至于svn  ..忽略不计了... 集中式代码管理 CVCS 模式:TFS 分布式代码管理 DVCS 模式:git 两者比较大的差别:tfs 只有一个中央仓储,其他副本都要与中央仓储进行更新.git  ...

  7. Window开启上帝模式

    所谓的上帝模式就是所有功能在一个文件下,方便.快捷地操作! 01.新建一个文件夹 02.重命名文件夹 文件夹重命名为“GodMode.{ED7BA470-8E54-465E-825C-99712043 ...

  8. 浅谈java构建工具的选择

    在学校的时候还总是自己用eclipse自带的jar导出工具,然后人工来给项目打包,那是相当的原始. 而后工作了,项目中都是用ant,慢慢的开始学会使用这个工具.感觉就和脚本一样,很容易读懂,做项目构建 ...

  9. Android——SQLite/数据库 相关知识总结贴

    android SQLite简介 http://www.apkbus.com/android-1780-1-1.html Android SQLite基础 http://www.apkbus.com/ ...

  10. C++11 正则表达式——基础知识介绍

    C++11开始支持正则表达式,使得处理文本更加简洁方便.C++11 支持六种正则表达式语法:ECMAScript, basic(POSIX Basic Regular Expressions), ex ...