精华内容
参与话题
问答
  • spring源码阅读

    2019-08-29 23:46:24
    一. 整体加载流程 AnnotationConfigApplicationContext 1.this()->(1)父类GenericApplicationContext空参构造方法--->new DefaultListableBeanFactory() (2)该类空参构造方法:new ...

    一. 整体加载流程

    AnnotationConfigApplicationContext
        1.this()->(1)父类GenericApplicationContext空参构造方法--->new DefaultListableBeanFactory()
                (2)该类空参构造方法:new AnnotatedBeanDefinitionReader:bd读取器 ---> registerAnnotationConfigProcessors(完成spring内部bean definition的注册)
                    ① beanFactory.setDependencyComparator(),主要用于排序(解析order注解和priority注解))
                    ② beanFactory.setAutowireCandidateResolver(),提供延迟加载功能
                         ③ 注册spring内部beanDefinition:ConfigurationClassPostProcessor,CommonAnnotationBeanPostProcessor等7个beanDefinition到
                (3)该类空参构造方法:new ClassPathBeanDefinitionScanner:扫描包或类,转为beandefinition

        2.this.register(annotatedClasses);--->reader.register(annotatedClasses):调用上面reader的doRegisterBean()方法
                (1)new BeanDefinition(class)
                (2)shouldSkip()判断是否跳过解析
                (3)resolveScopeMetadata(abd):得到类的作用域并添加到abd中
                (4)generateBeanName()生成类名
                (5)processCommonDefinitionAnnotations:处理类中通用注解 (Primary Lazy等)
                (6)registerBeanDefinition:把BeanDefinitionHolder注册到DefaultListableBeanFactory这个工厂


        3.this.refresh()
               (1)prepareRefresh():准备工作,设置启动事件,是否激活标识位   
               (2)obtainFreshBeanFactory():得到bean工厂
               (3)prepareBeanFactory(beanFactory):准备bean工厂
               (4)invokeBeanFactoryPostProcessors(beanFactory);
               (5)registerBeanPostProcessors:注册beanPostProcessor
               (6)initMessageSource():国际化语言的支持
               (7)initApplicationEventMulticaster():初始化事件广播器
               (8)onRefresh():当前版本没实现,后续可能拓展
               (9)registerListeners():注册监听器。发布事件的时候会从这里注册的监听器中获取
               (10)finishBeanFactoryInitialization:实例化所有bean

    二.spring 内部bean

    1.ConfigurationClassPostProcessor,:是一个工厂后置处理器,基本上类上面的注解都在这里面判断并解析
    2.AutowiredAnnotationBeanPostProcessor:处理@autowired,是一个bean的后置处理器,在bean属性注入的时候会用到
    3.RequiredAnnotationBeanPostProcessor:处理@required注解,它是一个bean的后置处理器,在bean属性注入的时候会用到
    4.CommonAnnotationBeanPostProcessor:处理一些公共注解,它是一个bean后置处理器,可以处理@PostConstruct和@PreDestroy还有@Resource等
    5.PersistenceAnnotationBeanPostProcessor:这是对jpa的处理,所以需要引入spring-orm的包,没有引入的话则spring不会注册这个类
    6.EventListenerMethodProcessor:@EventListener注解的处理,spring实现事件监听的方式有很多种,其中一种就是在方法上添加@EventListener注解
    7.DefaultEventListenerFactory:也是和Listener相关的

     

    三.fresh()的prepareBeanFactory(beanFactory)准备bean工厂

    (1)setBeanClassLoader:设置beanFactory类加载器

    (2)setBeanExpressionResolver:设置bean表达式解析器,让beanfactory能解析bean的表达式 类似@Value("#{}")与@Value("${}")

    (3)addPropertyEditorRegistrar:设置属性编辑器 (比如读取properties的值赋值到属性上)

    (4)addPropertyEditorRegistrar():对象与string类型的转化
    (5)beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)):添加后置处理器ApplicationContextAwareProcessor,意思是当bean实现了以上的*Aware接口,通过setter方法会得到对应的属性参数
    (6)beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory):注册几个自动装配相关的类和实例
    (7)beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this)):添加一个BPP,处理时间监听器。在bean初始化完成后判断是不是监听器,是的话将它注册到应用的事件多播器上


    四.fresh()的invokeBeanFactoryPostProcessors(beanFactory)


    PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())
    invokeBeanFactoryPostProcessors在上下文中调用注册为bean的工厂处理器
    (1)getBeanFactoryPostProcessors获取自定义的beanFactoryPostProcessor,就是不通过注解形式扫描获取,而是通过手动context.addBeanFactoryPostProcessor()完成自定义
    (2)invokeBeanFactoryPostProcessors从beanFactory中获得所有类型为BeanDefinitionRegistryPostProcessor的beanDefinition的beanName,然后通过beanName获取beanDefinition并被添加进currentRegistryProcessors中,最后开始执行currentRegistryProcessors
    (3)invokeBeanDefinitionRegistryPostProcessors--->processConfigBeanDefinitions(registry) 处理所有注册的bd ①判断是否spring默认的BeanDefinition ②判断当前BeanDefinition是否存在@Configuration注解 ③处理@PropertySource,把资源文件读取到上下文环境中去 ④处理@ComponentScan⑤处理@Import ⑥处理@Bean

    五.refresh的registerBeanPostProcessors(beanFactory)


    注册beanPostProcessor
    (1)spring默认的3个类型为BeanPostProcessor的bd:AutowiredAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor
    (2)可以自定义bd(需要添加元注解,能够被扫描注册进容器)实现BeanPostProcessor接口,这时候postProcessorNames就会出现自定义bd的beanName.通过@Enable注解导入,例如我在测试aop时用到了@EnableAspectJAutoProxy、@EnableAsync注解

    六.BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor

    beandefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子类。

    除了能和BeanFactoryPostProcessor一样在实例化前改变bean的定义。还可以给容器添加一些额外的组件

    展开全文
  • Spring源码阅读

    2020-01-14 16:25:54
    阅读Spring源码,我们可通过在github上下载源码,再通过编译的方式进行,也可以通过Idea构建maven工程,阅读maven反编译后的源码,源码编译的方式会有编译错误,操作复杂,本文通过maven反编译的方式阅读spring源码...

    阅读Spring源码,我们可通过在github上下载源码,再通过编译的方式进行,也可以通过Idea构建maven工程,阅读maven反编译后的源码,源码编译的方式会有编译错误,操作复杂,本文通过maven反编译的方式阅读spring源码。

    因为XML的方式创建spring项目不易阅读,以下项目通过javabean的方式创建。

    1、创建maven项目

    很容易,不多说

    2、添加maven依赖

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>

    只需要添加这一个依赖即可

    3、添加配置类AppConfig

    再项目下创建AppConfig.java文件,内容如下

    @ComponentScan("com.test")
    public class AppConfig {
    }
    
    @ComponentScan("com.test")指定你需要Spring扫描的路径

    4、测试启动Spring

    public static void main(String[] args) {
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        }

    ok,Spring项目已创建完成

    展开全文
  • Spring 源码阅读

    2011-06-11 10:07:13
    最近断断续续阅读spring的IOC,和AOP源码,有感如下: 1:IOC。IOC大概过程如下;读取xml文件,一个个bean封装成BeanDefinition(具体涉及xml解析,用doc),然后放入一个map中。key是 bean定义的id,value是Bean...
    最近断断续续阅读spring的IOC,和AOP源码,有感如下: 1:IOC。IOC大概过程如下;读取xml文件,一个个bean封装成BeanDefinition(具体涉及xml解析,用doc),然后放入一个map中。key是 bean定义的id,value是BeanDefinition。然后当BeanFactory调用getBean方法时候,从map找出BeanDefinition,然后用jdk的反射机制 或者cglib方式生成bean,如果类中还要注入其他bean,迭代调用getBean生成其他bean,最后返回一个实例Bean。 2:AOP。按我的的理解,aop是基本上就是一个代理,调用指定方法之前类似拦截器的调用一个个指定的MethodBeforeAdvice,调用方法 之后调用AfterReturningAdvice,如果有异常调用ThrowAdvice(这个比上面两个复杂)。这个用处最大的我看就是事务控制了吧,权限 拦截也可以这样做,哈哈 感触;其实spring(基本上用到反射,当然设计模式很多,核心的bean),hibernate(就是封装了jdbc,里面重要的就是entity,表和entity对应), struts1.x(就是封装了servlet,记不记得web.xml里面那个actionservlet,哇哈哈),刚开始学习的时候感觉框架很神秘,现在感觉还是基础重要啊, 大的框架都是一步步从基础累加出来的。
    展开全文
  • 最近工作需要,使用到spring框架,想对spring框架进行深入的学习一下,看看源代码,提升和沉淀下自己,工欲善其事必先利其器,还是先搭建环境吧。 环境搭建 sping源码环境的搭建,当然了不想下载源码的话,就直接...

    想对spring框架进行深入的学习一下,看看源代码,提升和沉淀下自己,工欲善其事必先利其器,还是先搭建环境吧。

    环境搭建

    sping源码之前是svn管理,现在已经迁移到了github中了,新版本基于gradle构建项目。所以构建sping源码环境必须先安装github以及Gradle.
    当然了如果不想安装github客户端可以直接去git下载项目:spring中git地址https://github.com/spring-projects/spring-framework

    安装github

    首先去github官网下载安装包,我用的window环境下载地址:https://desktop.github.com/下载之后双击安装即可,操作比较傻瓜式。

    安装Gradle

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。
    面向Java应用为主。当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。下载地址:http://gradle.org/gradle-download/,下载之后将文件解压配置环境变量如下图所示:
    1. 添加GRADLE_HOME F:\gradle-all\gradle-1.6根据自己的文件目录配置。
    2. 添加变量到path中。(这个不用说添加很简单吧)

    Gradle目录结构如下图所示:

    测试是否安装成功:
    win+R 进入cmd模式输入命令:gradle -version如果安装成功 出现下图gradle 版本信息:

    下载spring(如果没有安装github客户端可以按照下面的github地址直接下载即可)

    spring git地址为:https://github.com/spring-projects/spring-framework可以直接下载下来防止命令clone比较慢。如下图所示:


    打开github或者直接进入gitsehll命名 我的建立在I盘springok文件中
    进入springok文件 右键 git bash打开git命名行如下图: 

    输入命令:git clone https://github.com/spring-projects/spring-framework 如下图所示:
    耐心等待吧,比较慢。。
    下载完成之后命令界面如下图所示:

    下载完成之后 看下下载的目录吧:

    ok了,但是默认的这种方式并不是eclipse项目,我们还需要将源码转化为eclipse项目。编译的时候比较慢,因为项目需要的jar包可能需要从网络下载。(我第一次下载编译了4个小时最终搞定)最好能翻墙防止下载不下来。怎么编译呢,进入下载的目录打开cmd控制台输入 gradle cleanidea eclipse 开始编译成功之后会提示的,耐心等待吧。
    我的工程地址是I:\springok\spring-framework
    操作步骤如下:
    1. 进入当前的目录:
    2. 命令编译命令为:gradle cleanidea eclipse 
    编译成功了 成功转化为eclipse项目。
    编译可能遇到的问题:
    spring编译错误可能出现的错误:
    1. 提示build.gradle 配置文件错误,解决的办法哪里提示错误把哪行注释或者删除即可(大部分原因因为test测试错误去掉不用测试即可)如下图所示:
    2. spring3X系列需要jdk5以上版本,spring4X编译需要jdk8版本,根据自己编译的版本决定。
    3. jar包一直卡着下载不下来(可能网络不好最好能翻墙)

    导入eclipse

    批量导入到eclipse后如果出现感叹号或者错误,可能依赖的项目还没有编译缺少那个就编译那个吧,所有依赖的项目编译通过,这个编译的项目也通过。
    最终效果:

    ok大功告成,开启我们的spring源码学习之旅吧。加油奋斗。




    展开全文
  • 下载源码3.1 源码地址3.2 通过gitee中转3.2.1 进去github源码地址,复制URL3.2.2 进入gitee,选择右上角加号,选择从GitHub/GitLab导入仓库3.2.3 粘贴复制的github地址到第一栏,然后为自己的仓库命名3.2.4 下载...
  • 阅读Spring源码,我们可以通过以下两种方式: 直接在Idea/Eclipse上创建自己的java maven/gradle项目,导入Spring特定版本依赖Jar和源码,直接运行测试代码,逐步调试阅读 从github直接获取Spring源码项目,基于...
  • spring源码阅读环境(几分钟下载包)

    万次阅读 多人点赞 2019-11-09 17:42:26
    下载spring源码:2.安装gradle:3.构建源码:导入idea: 简述: 不能忍受慢(看到这里你就准备笑吧!!) 其他大神的博客实在让我难受 自己动手,下载spring,编译spring源码,导入idea,开启学习模式!! 笔者环境:...
  • Spring事务其实是使用了Spring自定义标签的解析功能和SpringAOP功能。 Spring定义了一个自定义标签,然后定义了这个标签对应的Parser。这个parser里面注册了一个AutoProxyCreator,也注册了一个Advisor(里面包含...

空空如也

1 2 3 4 5 ... 20
收藏数 4,124
精华内容 1,649
关键字:

spring源码阅读

spring 订阅