Java最根本的使命:简化Java开发。
是如何简化Java开发的?
- 基于POJO的轻量级和最小侵入性编程
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯例进行声明式编程
- 通过切面和模板减少样板式代码
1.激发POJO潜能与依赖注入
侵入式编程方式:很多框架通过强迫应用继承它们的类或实现它们的接口从而导致应用于框架绑死。
任何应用都会由多个类组成,这些类相互之间进行协作来完成特定的业务逻辑。传统做法是,每个对象负责管理与自己相互协作的对象(即它所依赖的对象)的引用,这回导致高度耦合和难以测试的代码。
DI——对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理它们的依赖关系。
测试也很简单,只需要给定接口一个mock实现即可。
装配(wiring)—— 创建应用组件之间协作的行为。Spring有多种装配bean的方式,采用XML是一种,使用Java注解来描述配置也是一种方式。
总结:
- 依赖注入核心本质也是面向接口编程
- Spring通过应用上下文Application Context装载bean的定义并把它们组装起来。
- 类似于电脑的主板,负责各个组件之间的关系;类似于中介者模式,负责各个模块之间的交互
2.应用切面
DI能够让相互协作的软件组件保持松散耦合,而面向切面编程(aspect-oriented programming——AOP)允许你把遍布应用各处的功能分离出来形成可重用的组件。
横切关注点:诸如日志、事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为它们会跨越系统的多个组件。
如果将这些关注点分散到各个组件中去,代码将会带来双重的复杂性。
- 实现系统关注点功能的代码将会重复出现在多个组件中。这意味如果要改变这些关注点逻辑,必须修改各个模块中的相关实现。即使你把这些关注点抽象为一个独立的模块,其他模块只是调用它的方法,但方法调用还是会重复出现在各个模块中。
- 组件会因为那些与自身核心业务无关的代码而变得混乱。
如图,左边的业务对象与右边的系统级服务结合得过于紧密。每个对象不但要知道它需要记日志、进行安全控制和参与事务,还要亲自执行这些服务。
AOP能够使这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。所造成的结果就是这些组件会具有更高的内聚性并且会更加关注自身的业务,完全不需要了解涉及系统服务所带来的复杂性。总之,AOP能够确保POJO的简单性。
可以将切面想象为覆盖在很多组件之上的一个外壳。借助AOP,可以使用各种功能区包裹核心业务层。可以将安全、事务和日志关注点与核心业务逻辑相分离。
3.使用模板消除样板式代码
样板式代码:重复写类似代码,例如使用JDBC访问数据库查询数据(大部分操作都是雷同的)。JMS、JNDI和使用REST服务通常也涉及大量的重复代码。
Spring旨在通过模板封装来消除样板式代码。JdbcTemplate使得执行数据库操作时,避免传统的JDBC样板代码。使之仅仅关注于核心的业务逻辑。
4.Spring容器
Spring容器负责创建对象,装配它们,配置它们并管理它们的整个生命周期。
Spring容器并不是只有一个。可以归为两种不同的类型:
- BeanFactory是最简单的容器,提供基本的DI支持
- ApplicationContext基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以及发布应用事件给监听者
Spring自带了多种类型ApplicationContext:
- AnnotationConfigApplicationContext
- AnnotationConfigWebApplicationContext
- ClassPathXmlApplicationContext
- FileSystemXmlApplicationContext
- XmlWebApplicationContext
5.bean的生命周期
6.Spring体系架构
Spring核心容器
管理着Spring应用中bean创建、配置和管理。Spring的AOP模块
借助于AOP,可以将遍布系统的关注点(例如事务和安全)从它们所应用的对象中解耦出来。数据访问与集成
使用JDBC编写代码通常会导致大量的样板式代码。Spring的JDBC和DAo模板抽象了这些样板式代码。另外Spring也提供了ORM模块。Web与远程调用
MVC模式是一种普遍被接受的构建Web应用的方法,可以帮助用户将界面逻辑与应用逻辑分离。该模块还提供了多种构建与其他应用交互的远程调用方案。Instrumentation
提供了为JVM添加代理的功能。具体来讲,为Tomcat提供了一个织入代理,能够为Tomcat传递类文件,就像这些文件是被类加载器加载的一样。测试
7.Spring Protfolio
参考官方主页
包括多个构建于核心Spring框架之上的框架和类库。几乎为每一个领域的Java开发都提供了Spring编程模型。
- Spring Web Flow——基于Spring MVC
- Spring Web Service
- Spring Security
- Spring Integration
- Spring Batch
- Spring Data
- Spring Social
- Spring Mobile
- Spring Boot