《Spring 实战》 读书笔记
第一章 Spring之旅
1.1简化Java开发
Spring最根本的使命:
简化Java开发。
为了降低Java开发的复杂性,Spring采取了以下4种关键策略:
1.基于POJO的轻量级和最小侵入性编程;
2.通过依赖注入和面向接口实现松耦合;
3.基于切面和惯例进行声明式编程;
4.通过切面和模板减少样板式代码。
依赖注入的方式之一–构造器注入:
依赖注入(Dependency Injection,DI)能够让相互协作的软件保持松散耦合。
#未使用依赖注入代码:
public class DamselRescuingKinght implements Knight{
private RescueDamselQuest quest;
public DamselRescuingKnight(){
this.quest = new RescueDamselQuest();
}
public void embarkOnQuest(){
quest.embark();
}
}
#使用依赖注入的方式之一--构造器注入的代码:
public class BraveKnight implements Knight{
private Quest quest;
public BraveKnight(Quest quest){
this.quest = quest;
}
public void embarkOnQuest(){
quest.embark();
}
}
如果一个对象只通过接口(而不是具体实现或初始化过程)来表明依赖关系,那么这种依赖就能够在
对象本身毫不知情的情况下,用不同的具体实现进行替换。
装配
创建应用组件之间协作的行为通常称之为装配(wiring)。
Spring 装配bean的方式
1.通过XML进行装配;
2.基于Java进行装配。
Spring通过应用上下文(Application Context)装配bean的定义并把他们组装起来。
Spring应用上下文全权负责对象的创建和组装。
应用切面
面向切面编程(Aspect-Oriented Programming,AOP)允许你把遍布应用各处的功能分离出来形成可重用的组件。
横切关注点:
诸如日志、事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为他们会跨越系统的多个组件。
AOP能够使这些服务(例如日志和安全服务)模块化,并以声明的方式将他们应用到它们需要影响的组件中去。所造成的结果就是这些组件会具有更高的内聚性并且会更加关注自身的业务,完全不需要了解涉及系统服务所带来复杂性。总之,AOP能够确保POJO的简单性。
我们可以把切面想象为覆盖在很多组件之上的一个外壳。应用是由那些实现各自业务功能的模块组成的。借助AOP,可以使用各种功能层去包裹核心业务层。这些层以声明的方式灵活地应用到系统中,你的核心应用甚至根本不知道他们的存在。这是一个非常强大的理念,可以将安全、事务和日志关注点与核心业务逻辑相分离。
应用切面
使用xml将bean声明为切面步骤:
1.声明为bean;
2.定义切点(表达式的语法可以采用AspectJ的切点表达式语言);
3.声明前置通知;
4.声明后置通知;
切面可以被应用到bean中,而bean不需要显示地调用它。实际上,bean完全不知道切面的存在。
能够为其他Spring bean做到的事情都可以同样应用到Spring切面中,例如为他们注入依赖。
1.2容纳你的Bean
在基于Spring的应用中,你的应用对象生存于Spring容器(container)中。Spring容器负责创建对象,装配它们,配置它们并管理它们的整个生命周期,从生存到死亡(在这里,可能就是new到finalize())。
容器是Spring框架的核心。Spring容器使用DI管理构成应用的组件,它会创建相互协作的组件之间的关联。
Spring容器并不是只有一个。Spring自带了多个容器实现,可以归为两种不同的类型。bean工厂(由org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器,提供基本的DI支持。应用上下文(由org.springframework.context.ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。应用上下文要比bean工厂更受欢迎。
Spring自带了多种类型的应用上下文。下面罗列的几个是你最可能遇到的:
1.AnnotationConfigApplicationContext:从一个或者多个基于Java的配置类中加载Spring应用上下文。
2.AnnotationConfigWebApplicationContext:从一个或者多个基于Java的配置类中加载Spring Web应用上下文。
3.ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。
4.FileSystemXmlApplicationContext:从文件系统下的一个或多个XML配置文件中加载上下文定义。
5.XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义。
使用FileSystemXmlApplicationContext和使用ClassPathXmlApplicationContext的区别在于:FileSystemXmlApplicationContext在指定的文件系统路径下查找.xml文件;而ClassPathXmlApplicationContext是在所有的类路径(包含JAR文件)下查找.xml文件。
应用上下文准备就绪后,我们就可以调用上下文的getBean()方法从Spring容器中获取bean。
bean的生命周期
在传统的Java应用中,bean的声明周期很简单。使用Java关键字new进行bean实例化,然后该bean就可以使用了。一旦该bean不再被使用,则由Java自动进行垃圾回收。
bean装在到Spring应用上下文中的一个典型的声明周期过程:
1.实例化;
2.填充属性;
3.调用BeanNameAware的setBeanName()方法;
4.调用BeanFactoryAware的setBeanFactory()方法;
5.调用ApplicationContextAware的setApplicationContext()方法;
6.调用BeanPostProcessor的预初始化方法;
7.调用InitializingBean的afterPropertiesSet()方法;
8.调用自定义的初始化方法;
9.调用BeanPostProcessor的初始化后方法;(此时bean可以使用了,接下来步骤是关闭容器)
10.调用DisposableBean的destory()方法;
11.调用自定义的销毁方法。
1.3俯瞰Spring风景线
Spring框架关注于通过DI、AOP和消除样板式代码来简化企业级Java开发。
Spring框架由6个定义良好的模块分类组成:
1.数据访问与集成:JDBC、Transation、ORM、OXM、Messaging、JMS;
2.Web与远程调用:Web、Web servlet、Web portlet、WebSocket;
3.面向切面编程:AOP、Aspects;
4.Instrumentation:Instrument、Instrument Tomcat;
5.Spring核心容器:Beans、Core、Context、Expression、Context support;
6.测试:Test。
Spring核心容器:
容器是Spring框架最核心的部分,它管理着Spring应用中bean的创建、配置和管理。所有的
Spring模块都构建于核心容器之上。
Spring的AOP模块:
与DI一样,AOP可以帮助应用对象解耦。借助于AOP,可以将遍布系统的关注点(例如事务和安全)
从他们所应用的对象中解耦出来。
数据访问和集成:
使用JDBC编写代码通常会导致大量的样板式代码,例如获得数据库连接、创建语句、处理结果集到最
后关闭数据库连接。
Spring的ORM模块建立在对DAO(Data Access Object)的支持之上,并为多个ORM框架提供了一种
构建DAO的简便方式。
Web与远程调用:
MVC(Model-View-Controller)模式是一种普遍被接受的构建Web应用的方法,它可以帮助用户将界面逻辑与应用逻辑分离。
Instrumentation:
Spring的Instrumentatian模块提供了为JVM添加代理(agent)的功能。
Spring Web Flow:
Spring Web Flow建立于Sring MVC之上。它为基于流程的会话式Web应用(可以想一下购物车或者
向导功能)提供了支持。
Spring Security:
利用Spring AOP、Spring Security为Spring应用提供了声明式的安全机制。
Spring Batch:
批处理。
Spring Data:
Spring Data使得在Spring中使用任何数据库都变得非常容易。
Spring Data都为持久化提供了一个简单的编程模型。这包括为多种数据库类型提供了一种自动化
的Repository机制,它负责为你创建Repository的实现。
Spring Boot:
Spring Boot大量依赖于自动配置技术,它能够消除大部分(在很多场景中,甚至是全部)Spring配
置。它还提供了多个Starter项目,不管你使用Maven还是Gradle,这都能减少Spring工程构建文件
的大小。
小结:
DI是组装应用对象的一种方式,借助这种方式对象无需知道依赖来自何处或者依赖的实现方式。不同于自己获取依赖对象,对象会在运行期赋予他们所依赖的对象。依赖对象通常会通过接口了解所注入的对象,这样的话就能确保低耦合。
AOP可以帮助应用将散落在各处的逻辑汇集于一处–切面。当Spring装配bean的时候,这些切面能够在运行期编织起来,这样就能非常有效地赋予bean新的行为。