b2c信息网

您现在的位置是:首页 > 热点事件 > 正文

热点事件

spring源码豆瓣(spring bean源码)

hacker2022-09-07 09:40:25热点事件96
本文目录一览:1、spring源码深度解析这本书怎么样2、

本文目录一览:

spring源码深度解析这本书怎么样

您好,希望以下回答能帮助您

《SPRING技术内幕——深入解析SPRING架构与设计原理》

该书讲了spring的ioc容器原理,在xml的spring配置文件中,对象是如何解析并生成的。

spring的aop,面向切面编程。这两块是比较重要的,属于核心部分。

其他的如spring mvc ,spring jdbc与hibernate,ibatise集成,spring事务,spring security,

spring 任务调度都有介绍。

大体来说,属于跟着代码走向,一个类一个类介绍了一下。其实代码都是有英文注释的。

跟着作都的思路看过来也还是可以的,最好是对照类图分析。

如您还有疑问可继续追问。

怎么学习Spring的源代码?谢谢。

spring是一种架构,是一种工具,作为工具,使用才是最重要。而什么时候需要理解源代码,是需要使用同样思想编写一个类似的工具,或者要对这个工具进行改进的时候才需要完全理解源代码。这是耗时又耗力的工作。

学习源码,基本都是直接看代码

如何评价spring源码深度解析

您好,希望以下回答能帮助您 《SPRING技术内幕——深入解析SPRING架构与设计原理》 该书讲了spring的ioc容器原理,在xml的spring配置文件中,对象是如何解析并生成的。 spring的aop,面向切面编程。这两块是比较重要的,属于核心部分。 其他的如spring mvc ,spring jdbc与hibernate,ibatise集成,spring事务,spring security, spring 任务调度都有介绍。 大体来说,属于跟着代码走向,一个类一个类介绍了一下。其实代码都是有英文注释的。 跟着作都的思路看过来也还是可以的,最好是对照类图分析。 如您还有疑问可继续追问。

Spring事件监听机制源码解析

1.Spring事件监听体系包括三个组件:事件、事件监听器,事件广播器。

事件:定义事件类型和事件源,需要继承ApplicationEvent。

事件监听器:用来监听某一类的事件,并且执行具体业务逻辑,需要实现ApplicationListener 接口或者需要用@ListenerEvent(T)注解。好比观察者模式中的观察者。

事件多播器:负责广播通知所有监听器,所有的事件监听器都注册在了事件多播器中。好比观察者模式中的被观察者。Spring容器默认生成的是同步事件多播器。可以自定义事件多播器,定义为异步方式。

创建 AnnotationConfigApplicationContext 的过程中,会执行refresh()中的initApplicationEventMulticaster()方法。该方法先获取bean工厂,然后判断工厂是否包含了beanName 为 applicationEventMulticaster的bean。如果包含了,则获取该bean,赋值给applicationEventMulticaster 属性。如果没有,则创建一个 SimpleApplicationEventMulticaster 对象,并且赋值给 applicationEventMulticaster 。实现了源码如下:

监听器的注册有两种,通过实现 ApplicationListener接口或者添加@EventListener注解。

注册的逻辑实现在refresh()中的registerListeners()方法里面。第一步,先获取当前ApplicationContext中已经添加的 applicationListeners(SpringMVC源码中有用到),遍历添加到多播器中。第二步,获取实现了ApplicationListener接口的listenerBeanNames集合,添加至多播器中。第三步,判断是否有早期事件,如果有则发起广播。

思考一下,上面的代码中第二步为啥添加的是listenerBeanName?

如果监听器是懒加载的话(即有@Lazy 注解)。那么在这个时候创建监听器显然是不对的,这个时候不能创建监听器。所以添加监听器到多播器的具体逻辑放在初始化具体的监听器之后。通过 BeanPostProcessor 的接口实现。具体的实现类是 ApplicationListenerDetector 。这个类是在 refreah()中prepareBeanFactory()方法中添加的。代码如下:

在创建 AnnotationConfigApplicationContext 的构造方法中,会执行org.springframework.context.annotation.AnnotationConfigUtils#registerAnnotationConfigProcessors(org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object) 方法。这个方法中会添加两个 beanDefs, 代码如下:

EventListenerMethodProcessor:事件监听器的BeanFactory后置处理器,在前期会创建 DefaultEventListenerFactory ,后期在创建好Bean之后,根据 EventListener 属性,调用DefaultEventListenerFactory创建具体的 ApplicationListenerMethodAdapter 。

DefaultEventListenerFactory:监听器的创建工厂,用来创建 ApplicationListenerMethodAdapter 。

EventListenerMethodProcessor 的类继承图如下:

在refreash的invokeBeanFactoryPostProcessors()中会调用 org.springframework.context.event.EventListenerMethodProcessor#postProcessBeanFactory方法,获取EventListenerFactory 类型的 Bean。代码如下:

在 org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons 方法中,创建完所有的单例Bean 之后,会遍历所有Bean是否实现了 SmartInitializingSingleton 接口。如果实现接口会执行该 Bean 的 afterSingletonsInstantiated() 方法。代码如下:

org.springframework.context.event.EventListenerMethodProcessor#afterSingletonsInstantiated 中会调用私有方法 processBean()进行 ApplicationEventAdatper 的创建。代码如下:

可以通过调用 org.springframework.context.support.AbstractApplicationContext#publishEvent(java.lang.Object, org.springframework.core.ResolvableType) 方法进行事件的调用。代码如下:

SimpleApplicationEventMulticaster 中的 multicasEvent,invokeListener,doInvokeListener 三个方法代码如下:

SpringMVC中就是通过Spring的事件机制进行九大组件的初始化。

监听器定义在FrameworkServlet类中,作为内部类。代码如下:

监听器的添加在org.springframework.web.servlet.FrameworkServlet#configureAndRefreshWebApplicationContext 中进行。通过SourceFilteringListener进行包装。添加代码如下:

在refresh中的registerListeners方法进行添加,代码如下:

在refresh中的finishRefresh()方法中,会调用publishEvnet(new ContextRefreshedEvent(this))发布事件。进行多播器广播,代码如下

最终会调到FrameworkServlet.this.onApplicationEvent(event)。

发表评论

评论列表

  • 世味雾月(2022-09-07 14:03:40)回复取消回复

    初始化。 监听器定义在FrameworkServlet类中,作为内部类。代码如下: 监听器的添加在org.springframework.web.servlet.FrameworkServlet#configureAndRef

  • 性许路岷(2022-09-07 19:46:18)回复取消回复

    合,添加至多播器中。第三步,判断是否有早期事件,如果有则发起广播。 思考一下,上面的代码中第二步为啥添加的是listenerBeanName?

  • 听弧听弧(2022-09-07 18:07:54)回复取消回复

    面。第一步,先获取当前ApplicationContext中已经添加的 applicationListeners(SpringMVC源码中有用到),遍历添加到多播器中。第二步,获取实现了ApplicationListener接口的list

  • 孤央枝桠(2022-09-07 12:11:07)回复取消回复

    本文目录一览:1、spring源码深度解析这本书怎么样2、怎么学习Spring的源代码?谢谢。3、如何评价spring源码深度解析4、Spring事件监听机制源码解析spring源码深度解析这本书怎么样您好,希望以下回答能帮助您《