zoukankan      html  css  js  c++  java
  • 慢慢看Spring源码

     1、 要想在java技术上提升一下,不看一下java源码是不行的,jdk源码,框架源码等,java的源码相对于c/c++,还是很容易看懂的。但是源码那么多,专门去看源码肯定很枯燥,所以就得一点一点看,坚持下去。有一点心得就记一点,如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
  • 相关阅读:
    强化学习基础:蒙特卡罗和时序差分
    强化学习基础:基本概念和动态规划
    EM算法和高斯混合模型GMM介绍
    使用Tensorflow搭建自编码器(Autoencoder)
    神经网络介绍:梯度下降和正则化
    神经网络介绍:算法基础
    K均值聚类和DBSCAN介绍
    Zabbix安装过程中遇到的问题
    Docker容器操作基础命令(二)
    Docker的安装及基本用法(一)
  • 原文地址:https://www.cnblogs.com/Robin008/p/8977261.html
Copyright © 2011-2022 走看看