易燃物汇聚 YouTube 有声书与书评
Spring源码深度解析 封面

Spring源码深度解析

郝佳编著

1.4万人在读
51.5万字总字数
¥41.4定价

有声书与视频解读 YouTube视频解读 12

内容简介

  《Spring源码深度解析》从核心实现和企业应用两个方面,由浅入深、由易到难地对Spring源码展开了系统的讲解,包括Spring的设计理念和整体架构、容器的基本实现、默认标签的解析、自定义标签的解析、bean的加载、容器的功能扩展、AOP、数据库连接JDBC、整合MyBatis、事务、SpringMVC、远程服务、Spring消息服务等内容。   《Spring源码深度解析》不仅介绍了使用Spring框架开发项目必须掌握的核心概念,还指导读者如何使用Spring框架编写企业级应用,并针对在编写代码的过程中如何优化代码、如何使得代码高效给出切实可行的建议,从而帮助读者全面提升实战能力。   《Spring源码深度解析》语言简洁,示例丰富,可帮助读者迅速掌握使用Spring进行开发所需的各种技能。《Spring源码深度解析》适合于已具有一定Java编程基础的读者,以及在Java平台下进行各类软件开发的开发人员、测试人员等。

读者书评

★★★☆☆

Spring Bean 的生命周期Spring Bean 的生命周期大致分为五个阶段:创建前准备阶段、创建实例阶段、依赖注入阶段、容器缓存阶段、销毁实例阶段 创建准备阶段:这个阶段主要的作用是, Bean 在开始加载之前,需要从上下文和相关配置中解析并查找 Bean 有关的扩展实现 比如像 init-method 容器在初始化 bean 调用的方法,destory-method 容器在销毁时调用的方法 以及 BeanFactoryPostProcessor 这类的 bean 加载过程的前置处理和后置处理 这些类或者配置其实是 Spring 提供给开发者,用来实现 Bean 加载过程中的扩展机制,在很多和 Spring 集成的中间件比较常见,比如 Dubbo 创建实例阶段:这个阶段主要是通过反射来创建 Bean 的实例对象,并且扫描和解析 Bean 声明的一些属性 依赖注入阶段: 如果被实例化的 Bean 存在依赖其他 Bean 对象的情况,则需要对这些依赖 bean 进行对象注入,比如常见的 @Autowired setter 注入等依赖注入的配置形式 同时,在这个阶段会触发一些扩展的调用,比如常见的扩展类:BeanPostProcessors(用来实现 bean初始化前后的回调)、InitializingBean、BeanFactoryAware 容器缓存阶段: 容器缓存阶段主要是把 bean 保存到容器以及 Spring 的缓存中,到了这个阶段,Bean就可以被开发者使用了 这个阶段涉及到的操作,常见的有 init-method 这个属性配置的方法,会在这个阶段调用 以及像 BeanPostProcessors 方法中的后置处理器方法:postProcessorAfterInitialization 也会在这个阶段触发 销毁实例阶段:当 Spring 应用上下文关闭时,该上下文中的所有 bean 都会被销毁 如果存在bean实现了 DisposableBean 接口,或者配置了 destroy-method 属性,会在这个阶段被调用 Bean 的生命周期扫描Bean:Spring启动后,扫描@ComponentScan注解配置的扫描路径下的所有.class文件,类加载器根据类名加载获取类的Class对象,通过判断@Component等注解找出Bean;给每个Bean创建BeanDefinition对象存放Class对象、作用域等信息,并放进beanDefinitionMap,映射关系是"Bean名"--->“对应的BeanDefinition”。 遍历beanDefinitionMap,创建所有Bean,每个Bean的创建过程如下: 推断构造方法: 根据BeanDefinition得到 Class 对象。 如果BeanDefinition绑定了一个 Supplier,那就调用Supplier的get方法得到一个对象并直接返回。 如果BeanDefinition中存在 factoryMethodName,那么就调用该工厂方法得到一个bean对象并返回。 如果BeanDefinition已经自动构造过了,那就调用autowireConstructor()自动构造一个对象。 如果有一个构造方法,则使用该构造方法实例化对象; 如果有多个构造方法,有且仅有一个构造方法注解了@Autowired,则选用该构造方法实例化对象。 如果有多个构造方法,并且都没有注解@Autowired,选用无参构造方法实例化对象。如果都带参,且有0个或多个构造方法注解了@Autowired”,则报错“Bean初始化异常”。 实例化:基于反射获取推断出的构造器对象,通过这个Constructor对象的newInstance(xx) 方法实例化类,得到原始对象; 存入三级缓存:基于原始对象生成Lambda表达式,并放入三级缓存singletonFactories。以后如果执行这个Lambda表达式,生成的将是代理对象。 属性填充:推断和实例化、存入三级缓存、属性填充(单例池找、判断循环依赖、二级缓存找、三级缓存找到,生成提前代理对象)、执行三级缓存、存入单例池 按名称注入;基于反射获取Bean的所有属性,将有@Autowired等注解的属性开启私有成员访问限制,通过getBean()方法(解决了单例循环依赖)给该属性填充它的Bean对象。 按类型注入; 处理Aware回调:如果Bean实例实现了BeanNameAware接口(通过instanceof判断),调用Bean重写的setBeanName()方法,给Bean实例的beanName变量赋值。 执行所有BeanPostProcessor的初始化前方法:遍历所有BeanPostProcessor实现类所在的列表,执行每个BeanPostProcessor对象里的postProcessBeforeInitialization()方法。本方法可以通过JDK的Proxy.newProxyInstance()实现动态代理返回目标对象的代理对象。 初始化:如果Bean实例实现了InitializingBean接口(通过instanceof判断),调用Bean重写的afterPropertiesSet()方法,处理初始化逻辑。afterPropertiesSet译为“在属性填充之后” 执行所有BeanPostProcessor的初始化后方法:遍历所有BeanPostProcessor实现类所在的列表,执行每个BeanPostProcessor对象里的postProcessAfterInitialization()方法。本方法可以通过JDK的Proxy.newProxyInstance()实现动态代理返回目标对象的代理对象。 存入单例池:如果是单例,就将最终的代理对象存入单例池(一级缓存,singletonObjects)。 生存期:Bean已就绪,可以被使用,所有Bean将一直驻留在应用上下文中,直到应用上下文被销毁。 销毁:如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果有方法注解了@PreDestroy,该方法也会被调用。 SpringBoot 的自动装配原理1. 自动装配,简单来说就是自动把第三方组件的 Bean 装载到 Spring IOC 容器中,不需要开发人员再去写 Bean 的装配配置2. 在 Spring Boot 应用里面,只需要在启动类加上 @SpringBootApplication 注解就可以实现自动装配3. @SpringBootApplication 是一个复合注解,真正实现自动装配的注解是 @EnableAutoConfiguration 1. 引入 Starter 启动依赖组件的时候,这个组件里面必须要包含 @Configuration 配置类,在这个配置类里面通过 @Bean 注解声明需要装配到 IOC 容器的 Bean 对象 2. 这个配置类是放在第三方的 jar 包里面,然后通过 SpringBoot 中的约定优于配置思想,把这个配置类的全路径放在 classpath:/META-INF/spring.factories 文件中,这样 SpringBoot 就知道第三方 jar 包里面的配置类的位置,这个步骤主要是用到了 Spring 里面的 SpringFactoriesLoader 来完成的 3. SpringBoot 拿到第三方 jar 包里面声明的配置类以后,再通过 Spring 提供的 ImportSelector 接口,实现对这些配置类的动态加载 4. 在我看来,SpringBoot 是约定优于配置这一理念下的产物,所以在很多的地方,都会看到这类的思想,它的出现,让开发人员更加聚焦在业务代码的编写上,而不需要关心和业务无关的代码 5. 其实,自动装配的思想,在 SpringFramework3.x 版本里面的 @Enable 注解,就有了实现的雏形,@Enable 注解就是模块驱动的意思,我们只需要增加某个 @Enable 注解,就自动打开某个功能,而不需要针对这个功能去做 Bean 的配置,@Enable 底层也是帮我们去自动完成这个模块相关 Bean 的注入。

★☆☆☆☆

非常垃圾的书。没有一点点提纲挈领的东西。基本上就是贴了满篇的源码加上一点点注释。源码不是这么读的。好的解析应该详略得当,挑关键点来深入分析,而不是平等地对待所有细节。

★★★☆☆

作者从核心实现和企业应用两个方面,由浅入深、由易到难地对Spring源码展开了系统的讲解,具体涉及如下内容: Spring的设计理念和整体架构、 容器的基本实现、 默认标签的解析、 自定义标签的解析、 bean的加载、 容器的功能扩展、 AOP、 数据库连接JDBC、 整合MyBatis、 事务、 SpringMVC、 远程服务、 Spring消息服务等内容。 Core和Beans模块是框架的基础部分,提供IoC(转控制)和依赖注入特性。 Expression Language模块提供了一个强大的表达式语言用于在运行时查询和操纵对象。 ORM模块为流行的对象-关系映射API,如JPA、JDO、Hibernate、iBatis等,提供了一个交互层。 OXM模块提供了一个对Object/XML映射实现的抽象层,Object/XML映射实现包括JAXB、Castor、XMLBeans、JiBX和XStream。 JMS(Java Messaging Service)模块主要包含了一些制造和消费消息的特性。 Transaction模块支持编程和声明性的事物管理,这些事物类必须实现特定的接口,并且对所有的POJO都适用。 Web模块:提供了基础的面向Web的集成特性。例如,多文件上传、使用servlet listeners初始化IoC容器以及一个面向Web的应用上下文。它还包含Spring远程支持中Web的相关部分。 Web-Servlet模块web.servlet.jar:该模块包含Spring的model-view-controller(MVC)实现。 Web-Struts模块:该模块提供了对Struts的支持,使得类在Spring应用中能够与一个典型的Struts Web层集成在一起。注意,该支持在Spring 3.0中是deprecated的。 Web-Porlet模块:提供了用于Portlet环境和Web-Servlet模块的MVC的实现。 AOP模块提供了一个符合AOP联盟标准的面向切面编程的实现,它让你可以定义例如方法拦截器和切点,从而将逻辑代码分开,降低它们之间的耦合性。 对于配置文件的封装,不同来源的资源文件都有相应的Resource实现:文件(FileSystemResource)、Classpath资源(ClassPathResource)、URL资源(UrlResource)、InputStream资源(InputStreamResource)、Byte数组(ByteArrayResource)等。 获取器注入是一种特殊的方法注入,它是把一个方法声明为返回某种类型的bean,但实际要返回的bean是在配置文件里面配置的,此方法可用在设计有些可插拔的功能上,解除程序依赖。 循环依赖处理: 创建依赖的时候为了避免循环依赖,在Spring中创建bean的原则是不等bean创建完成就会将创建bean的ObjectFactory提早曝光加入到缓存中,一旦下一个bean创建时候需要依赖上一个bean则直接使用ObjectFactory。 即Spring处理循环依赖的解决办法,在B中创建依赖A时通过ObjectFactory提供的实例化方法来中断A中的属性填充,使B中持有的A仅仅是刚刚初始化并没有填充任何属性的A,而这正初始化A的步骤还是在最开始创建A的时候进行的,但是因为A与B中的A所表示的属性地址是一样的,所以在A中创建好的属性填充自然可以通过B中的A获取,这样就解决了循环依赖的问题。 事务处理: 默认情况下Spring中的事务处理只对RuntimeException方法进行回滚,所以,如果此处将Runtime Exception替换成普通的Exception不会产生回滚效果。 重新复习一遍,还算有收获。

★★★☆☆

郝佳编著的Spring源码深度解析,总体是一本不错的书,有大量的源码和对源码的解读,主要介绍了spring框架涵盖了20多个模块,启其中最核心的模块有core container  web  orm aop。一,首先讲了bean factory,它是构建bean的核心,定义了规范和规则。xmlpathresource读取xml文件,然后变成了document。二,factoryBean是模本bean;三,BeanDifination,包含root  child  generic。四,解析器,处理器。五,aop,pointcut,aspectj,前置处理器,后置处理器。六,applicationContext继承了BeanFactory,扩展了子类,监听器,填充了bean。七,springMVC,servlet,dispatchServlet,handlerMapping,SimpleControllerHandlerAdspter,handler。HttpServletRequest  HttpServletResponse  HandlerInsterceptor处理拦截器有pre post after。HandlerExceptionInterceptor异常拦截器。八,事务增强器,advisor,取注解和编程式事务,先从方法过去事务增强器,然后生成代理处理。九,RMI,远程方法调用。十,JMS,java消息服务

★☆☆☆☆

完全从函数的角度解析spring,舍本逐末。想了解spring也是首先了解流程,例如解析后的bean,配置存在那里,之后自己去看。书中对上面两点一笔带过,详细的按照函数讲代码,导致结构零零散散,即使读完本书还是一头雾水,不知道哪儿跟哪儿

★★☆☆☆

给两星吧 书第一版读过,第二版竟然和第一版高度重合。 举个例子,3.0之后,开始大量使用纯Java开发,到4.0后,基本成为主流。如今都5.0了,新版还在分析XML,不能把读者当傻瓜。

☆☆☆☆☆

Spring是java开发者的春天,它带来的便利是很大的,看源码解析,领略大佬的核心思想[耶][耶]书很好很不错

★★★☆☆

粗略浏览了一遍,前面生成bean definition讲述的比较清晰。类图以及一些设计理念有讲到。下面就开始翻译源代码,而不去讲解为什么要这么做,写得大多是开发无需关心的细节~

★★★★☆

值得看,说的很详细。只不过貌似是基于 Spring 3 编写的,有一些类和方法的名称已经不同了。 不过还是建议在电脑上看,手机不适合看大片的代码。手机屏幕上还是适合看一些理论的上东西。

★★★☆☆

翻开看了一眼 确实不怎么滴 可入门 想了解流程 就难堪大用了

书籍信息

作者郝佳编著
出版社人民邮电出版社
出版时间2013-09-01
ISBN9787115325686
分类计算机-计算机综合
格式EPUB
完结状态连载中
章节数17