(一)《Spring实战》——Spring核心

《Spring实战》(第4版)

    

第一章:Spring之旅

    

1. 简化Java开发

为了降低Java开发的复杂性,Spring采取了以下4种关键策略:

  • 基于POJO的轻量级和最小侵入性编程;
  • 通过依赖注入和面向接口实现松耦合;
  • 基于切面和惯例进行声明式编程;
  • 通过切面和模板减少样板式代码。

1.1 激发POJO的潜能

  在基于Spring构建的应用中,它的类通常没有任何痕迹表明你使用了Spring。最坏的场景是,一个类或许会使用Spring注解,但它依旧是POJO。

  Spring赋予POJO魔力的方式之一就是通过DI来装配它们。

1.2 依赖注入(DI)

  耦合是必须的,但应当被小心谨慎地管理。

  创建应用组件之间协作的行为通常称为装配(wiring)。Spring有多种装配bean的方式,采用XML是很常见的一种装配方式。

        

                KnightMain.java加载包含Knight的Spring上下文

  这里的main() 方法基于knights.xml文件创建了Spring应用上下文。随后它调用该应用上下文获取一个ID为knight的bean。得到Knight 对象的引用后,只需简单调用embarkOnQuest() 方法就可以执行所赋予的探险任务了。注意这个类完全不知道我们的英雄骑士接受哪种探险任务,而且完全没有意识到这是由BraveKnight 来执行的。只有knights.xml文件知道哪个骑士执行哪种探险任务。

  Spring还支持使用Java来描述配置。

         

            Spring提供了基于Java的配置,可作为XML的替代方案

  通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理它们的依赖关系,如图所示,依赖关系将被自动注入到需要它们的对象当中去。

                    

          依赖注入会将所依赖的关系自动交给目标对象,而不是让对象自己去获取依赖 

1.3 应用切面

  DI能够让相互协作的软件组件保持松散耦合,而面向切面编程(aspect-oriented programming,AOP)允许你把遍布应用各处的功能分离出来形成可重用的组件。

  面向切面编程往往被定义为促使软件系统实现关注点的分离一项技术。系统由许多不同的组件组成,每一个组件各负责一块特定功能。除了实现自身核心的功能之外,这些组件还经常承担着额外的职责。诸如日志、事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为它们会跨越系统的多个组件。

  • 实现系统关注点功能的代码将会重复出现在多个组件中。这意味着如果你要改变这些关注点的逻辑,必须修改各个模块中的相关实现。即使你把这些关注点抽象为一个独立的模块,其他模块只是调用它的方法,但方法的调用还是会重复出现在各个模块中。
  • 组件会因为那些与自身核心业务无关的代码而变得混乱。一个向地址簿增加地址条目的方法应该只关注如何添加地址,而不应该关注它是不是安全的或者是否需要支持事务。

            

        在整个系统内,关注点(例如日志和安全)的调用经常散布到各个模块中,而这些关注点并不是模块的核心业务

  AOP能够使这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。所造成的结果就是这些组件会具有更高的内聚性并且会更加关注自身的业务,完全不需要了解涉及系统服务所带来复杂性。总之,AOP能够确保POJO的简单性。

  如下图所示,我们可以把切面想象为覆盖在很多组件之上的一个外壳。应用是由那些实现各自业务功能的模块组成的。借助AOP,可以使用各种功能层去包裹核心业务层。这些层以声明的方式灵活地应用到系统中,你的核心应用甚至根本不知道它们的存在。这是一个非常强大的理念,可以将安全、事务和日志关注点与核心业务逻辑相分离。

            

            利用AOP,系统范围内的关注点覆盖在它们所影响组件之上

1.4 使用模板消除样板式代码

  因为使用Java API而导致的样板式代码,样板式代码的一个常见范例是使用JDBC访问数据库查询数据。在许多编程场景中往往都会导致类似的样板式代码,JMS、JNDI和使用REST服务通常也涉及大量的重复代码。

  Spring旨在通过模板封装来消除样板式代码。Spring的JdbcTemplate使得执行数据库操作时,避免传统的JDBC样板代码成为了可能。

          

2. 容纳你的Bean

在基于Spring的应用中,你的应用对象生存于Spring容器(container)中。Spring容器负责创建对象,装配它们,配置它们并管理它们的整个生命周期,从生存到死亡(在这里,可能就是newfinalize())

容器是Spring框架的核心。Spring容器使用DI管理构成应用的组件,它会创建相互协作的组件之间的关联。毫无疑问,这些对象更简单干净,更易于理解,更易于重用并且更易于进行单元测试。

Spring容器并不是只有一个。Spring自带了多个容器实现,可以归为两种不同的类型。bean工厂(由org.springframework.beans.factory.BeanFactory 接口定义)是最简单的容器,提供基本的DI支持。应用上下文(由org.springframework.context.ApplicationContext 接口定义)基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。

2.1 使用应用上下文

Spring自带了多种类型的应用上下文。下面罗列的几个是你最有可能遇到的。

  • AnnotationConfigApplicationContext 从一个或多个基于Java的配置类中加载Spring应用上下文。
  • AnnotationConfigWebApplicationContext 从一个或多个基于Java的配置类中加载Spring Web应用上下文。
  • ClassPathXmlApplicationContext 从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。
  • FileSystemXmlapplicationcontext 从文件系统下的一个或多个XML配置文件中加载上下文定义。
  • XmlWebApplicationContext 从Web应用下的一个或多个XML配置文件中加载上下文定义。

无论是从文件系统中装载应用上下文还是从类路径下装载应用上下文,将bean加载到bean工厂的过程都是相似的。例如,如下代码展示了如何加载一个FileSystemXmlApplicationContext:

      

  类似地,你可以使用ClassPathXmlApplicationContext 从应用的类路径下加载应用上下文:

      

  使用FileSystemXmlApplicationContext 和使用ClassPathXmlApp-licationContext 的区别在于:FileSystemXmlApplicationContext 在指定的文件系统路径下查找knight.xml文件;而ClassPathXmlApplicationContext 是在所有的类路径(包含JAR文件)下查找 knight.xml文件。

  应用上下文准备就绪之后,我们就可以调用上下文的getBean() 方法从Spring容器中获取bean。

2.2 bean的生命周期

  在传统的Java应用中,bean的生命周期很简单。使用Java关键字new进行bean实例化,然后该bean就可以使用了。一旦该bean不再被使用,则由Java自动进行垃圾回收。

  相比之下,Spring容器中的bean的生命周期就显得相对复杂多了。正确理解Spring bean的生命周期非常重要,因为你或许要利用Spring提供的扩展点来自定义bean的创建过程。下图展示了bean装载到Spring应用上下文中的一个典型的生命周期过程。

      

正如你所见,在bean准备就绪之前,bean工厂执行了若干启动步骤。我们对上图进行详细描述:

  • 1.Spring对bean进行实例化;
  • 2.Spring将值和bean的引用注入到bean对应的属性中;
  • 3.如果bean实现了BeanNameAware 接口,Spring将bean的ID传递给setBean-Name() 方法;
  • 4.如果bean实现了BeanFactoryAware 接口,Spring将调用setBeanFactory() 方法,将BeanFactory容器实例传入;
  • 5.如果bean实现了ApplicationContextAware 接口,Spring将调用setApplicationContext() 方法,将bean所在的应用上下文的引用传入进来;
  • 6.如果bean实现了BeanPostProcessor 接口,Spring将调用它们的post-ProcessBeforeInitialization() 方法;
  • 7.如果bean实现了InitializingBean 接口,Spring将调用它们的after-PropertiesSet() 方法。类似地,如果bean使用init-method 声明了初始化方法,该方法也会被调用;
  • 8.如果bean实现了BeanPostProcessor 接口,Spring将调用它们的post-ProcessAfterInitialization() 方法;
  • 9.此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
  • 10.如果bean实现了DisposableBean 接口,Spring将调用它的destroy() 接口方法。同样,如果bean使用destroy-method 声明了销毁方法,该方法也会被调用。

3. 俯瞰Spring风景线

3.1 Spring模块

在Spring 4.0中,Spring框架的发布版本包括了20个不同的模块,每个模块会有3个JAR文件(二进制类库、源码的JAR文件以及JavaDoc的JAR文件)。

                  

这些模块依据其所属的功能可以划分为6类不同的功能:

            

3.2 Spring Portfolio

  Spring远不是Spring框架所下载的那些。如果仅仅停留在核心的Spring框架层面,我们将错过Spring Portfolio所提供的巨额财富。整个Spring Portfolio包括多个构建于核心Spring框架之上的框架和类库。概括地讲,整个Spring Portfolio几乎为每一个领域的Java开发都提供了Spring编程模型。

原文地址:https://www.cnblogs.com/zjfjava/p/8448787.html

时间: 2024-09-28 18:36:25

(一)《Spring实战》——Spring核心的相关文章

【书籍推荐】Spring实战-----Spring入门经典

如果看完了Servlet学习指南后,可以开始考虑使用框架了,这时候是完全没有什么问题的,因为有太多的开发者在帮我们解决问题了,作为一个新手,我们可以先使用别人的轮子,等到使用得很熟练,技术提高了,我们才考虑制造一些小轮子,当然这个过程需要很长的时间,但我相信只要不断的学习,就一定能成功. 当然,个人认为这本书只是入门级,因为文档是更好的资料,但是每个人迈出的第一步都倾向于轻松有趣,另外看英文版当然是更好有更好的提升,但是个人认为既然入门就可以选择看中文版的快速入门,然后再看英文版的文档,或者在下

Redis实战和核心原理详解(5)使用Spring Session和Redis解决分布式Session跨域共享问题

Redis实战和核心原理详解(6)使用Spring Session和Redis解决分布式Session跨域共享问题 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomcat在运行的时候分别是不同的容器里,因此会出现session不同步或者丢失的问题. 实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat.Jetty等服务器提

【Spring实战】--1Spring的核心

最近面试总会涉及Spring的优点,SpringMVC与Struts2的比较,生活慢慢稳定下来,这些面试还是应了那句话“只顾盲目拉车,不会低头看路”,回过头来还是要好好研究一下Spring,如果仅仅是停留在粘贴拷贝像从前一样机械的完成任务,可能再过一段时间我还是不会太明白Spring事务的妙处,以及Spring松耦合为什么就会让代码看起来清爽.以前上学那会也是在半梦半醒中学了一部分Spring,看了开涛的Spring的一些博客.这次潜心研究一下,主要参考资料: 1<Spring实战(第4版)>

《02.Spring Boot连载:Spring Boot实战.Spring Boot核心原理剖析》

在上节中我们通过了一个小的入门案例已经看到了Spring Boot的强大和简单之处.本章将详细介绍Spring Boot的核心注解,基本配置和运行机制.笔者一直认为:精通一个技术一定要深入了解这个技术帮助我们做了哪些动作,深入理解它底层的运行原理,只有达到这个目标才可以熟练使用框架,最终达到融会贯通的目的. 一.启动类与@SpringBootApplication Spring Boot的项目一般都会有注解*Application标注的入口类,入口类中会有一个main方法,main方法是一个标准

Extjs5.0从入门到实战开发信息管理系统(Extjs基础、Extjs5新特性、Spring、Spring mvc、Mybatis)视频教程

Extjs5.0从入门到实战开发信息管理系统(Extjs基础.Extjs5新特性.Spring.Spring mvc.Mybatis)视频教程下载   联系QQ:1026270010 Extjs作为一款优秀的JS前端开发框架以其良好的架构.丰富的UI组件库.完善的文档和社区支持等诸多优点拥有广泛的市场应用空间,开发人员无需过多的关注HTML.CSS甚至各种常用JS算法,只需把精力放在业务逻辑上,利用各种组件的相互组合调用便可轻松而高效的开发出系统的前端页面. Extjs5在之前版本的基础上又推出

[Spring实战系列](16)面向切面编程(AOP)概述

1. 简介 在软件中,有些行为对于大多数应用都是通用的.日志,安全和事务管理的确很重要,但他们是都是应用对象主动参与的行为呢?如果让应用对象只关注自己所针对的业务领域问题,而其他方面的问题由其他应用对象来处理,这样会不会更好? 在软件开发中,分布于应用中多处的功能被称为横切关注点.通常,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑中).将这些横切关注点与业务逻辑相分离是面向切面编程索要解决的. 上图展示了一个被划分为模块的典型应用.每个模块的核心功能都是为特

《Spring实战(第三版)》 之旅(一)

前言 一个寒假吧SSM学完了,也不能说是学完了,只能说是过了一遍,知道大体的流程,框架的搭建,但具体的实现原理,为什么要这样,什么时候要这样,概念还是很模糊. 反正经过这五大框架的学习,感觉最重要的还是Spring框架,于是乎,开学时期偶得一书<Spring实战>,在网上口碑还是蛮高的,于是继续深入学习(复习)下Spring这个框架. 到目前为止已经读到了第8章 使用Spring Web Flow ,突然想到了写写博客记录下读书的历程,也能说是总结?笔记?反正就是自己在看这部分内容的时候心里在

《Spring实战》学习笔记-第五章:构建Spring web应用

之前一直在看<Spring实战>第三版,看到第五章时发现很多东西已经过时被废弃了,于是现在开始读<Spring实战>第四版了,章节安排与之前不同了,里面应用的应该是最新的技术. 本章中,将会接触到Spring MVC基础,以及如何编写控制器来处理web请求,如何通明地绑定请求参数到业务对象上,同时还可以提供数据校验和错误处理的功能. Spring MVC初探 跟踪Spring MVC请求 在请求离开浏览器时,会带有用户所请求内容的信息,例如请求的URL.用户提交的表单信息. 请求旅

Spring实战(第4版)pdf

下载地址:网盘下载 Spring实战(第4版)是非常畅销的Spring图书也是国内读者极其熟悉的Spring经典图书之一,Java web开发从入门到精通,了解Java Spring技术内幕. 全球有超过100 000的开发者使用本书来学习Spring中文版累计销售超10万册,畅销经典Spring 技术图书,针对Spring 4 全新升级作者Craig Walls,SpringSource的软件开发人员,也是一位畅销书作者.第3版译者继续翻译新版,品质保障! <Spring实战(第4版)>是经