简化Java开发
Spring的诞生
应对应用的复杂性,Spring的关键策略
基于POJO的轻量级和最小侵入性编程
通过依赖注入和面向接口实现松耦合
基于切面AOP和惯例进行声明式编程
通过切面和模板减少样板式代码
POJO之美
定义
POJO(Plain Old Java Objects):简单普通的Java对象。
不具有任何特殊角色,不继承/实现任何其他Java框架的类和接口。
很多框架具有侵入性,强迫开发者编写与框架绑定的大量冗余、难以测试的代码。
Spring强调基于POJO的最下侵入性编程
Spring不会强迫实现的特定规范的接口或继承特定类
Spring通过依赖注入赋予POJO以魔力
J2EE中轻量级框架和重量级框架的概念:
简单一句话:量级主要由对容器的依赖性决定,依赖性越小,越轻量
容器:用来管理组件行为的一个集合工具,组件的行为包括与外部环境的交互、组件的生命周期、组件之间的合作依赖关系等
在Java应用开发环境中,“轻量级Java”主要指两个东西:简化的编程模型和更具响应能力的容器。轻量级Java旨在消除与传统JavaEE API有关的不必要的复杂性和限制,同时缩短应用程序的部署实现。
轻量级技术当中,控制反转IoC(依赖注入DI)是关键。使用IoC,开发人员不需要编写复杂的代码来执行查询、处理基础架构异常或管理连接,就能够解决对象依赖性问题。这有助于简化代码,将业务逻辑和基础架构分离,从而是应用程序更容易维护。
轻量级Java的另一个特征就是,它不会强迫业务对象遵循平台特定接口。这允许开发人员在普通Java对象(POJO)中实现业务逻辑,从而提高生产率。
依赖注入
过于复杂的软件系统,使得面向对象已经不够。
组件化的思想:分离关注点,其目的是解耦合,实现每个组件块时只关注组件内部的事情,要点就是明确定义组件之间的接口。
依赖注入:强制将组件的构建和使用分离,就像拼接泡沫板一样,内部就自己内部管理,但是提供外部接口以供使用。
实用的Java系统由多个类组成,类之间互相协作完成特定的业务逻辑。
以往通常每个对象负责管理与之协作的对象(即所依赖的对象)的引用,导致高度耦合、难以测试。
耦合具有两面性
耦合的代码难以测试
一定程度的耦合是不可避免的
依赖注入DI(Dependence Injection):对象的依赖关系由负责协调系统中各对象的第三方组件(通常是容器)在创建对象时设定。对象无需自己创建或管理它们的依赖关系——依赖关系将被自动注入到需要它们的对象中去。
依赖注入带来的好处:松耦合
Spring通过应用上下文装载Bean的定义并把它们组装起来,应用上下文负责对象的创建和组装。
应用切面
横切关注点:诸如日志、事务管理和安全等系统服务通常被称为横切关注点(跨越系统的多个组件)。以往通常这些横切关注点分散到多个组件中去(融入到有自身逻辑业务的组件中),导致代码引入双重复杂性:
遍布系统的横切关注点实现代码将会重复出现在多个组件中
组件会因为这些与自身业务无关的代码而变得复杂混乱
AOP(面向切面编程)使得这些业务模块化,并以声明的方式将他们应用到需要的组件中去,AOP能确保POJO简单。
使用模板消除样板式代码
JDBC等使用Java API导致样板式代码
Spring旨在通过模板封装来消除样板式代码
例如,我们在JDBC的操作中,有增删改查操作,这些操作的代码共性很多,而且每一种操作真正的重要部分往往就那么几行代码,此时我们可以封装一个JDBC模板类(JDBCTemplate),作为一个通用的JDBC操作。