之前只是在学校里大概的学习了一下 Spring 框架的使用以及一些最基本, 浅显的原理, 并没有做出深入的学习, 等到工作之后想提升自己的时候发现所掌握的 Spring 框架的简直烂如狗屎, 为监督自己的学习进度, 立下一个 flag, 一天一篇 Spring 框架的学习心得!!
1,Spring 的诞生
Spring 是一个开源框架, 它由 Rod Johnson 创建. 它是为了解决企业应用开发的复杂性而创建的. Spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情. 然而, Spring 的用途不仅限于服务器端的开发. 从简单性, 可测试性和松耦合的角度而言, 任何 Java 应用都可以从 Spring 中受益. Spring 是一个轻量级的控制反转 (IoC) 和面向切面 (AOP) 的容器框架.
轻量 -- 从大小与开销两方面而言 Spring 都是轻量的. 完整的 Spring 框架可以在一个大小只有 1MB 多的 JAR 文件里发布. 并且 Spring 所需的处理开销也是微不足道的. 此外, Spring 是非侵入式的: 典型地, Spring 应用中的对象不依赖于 Spring 的特定类.
控制反转 --Spring 通过一种称作控制反转 (IoC) 的技术促进了松耦合. 当应用了 IoC, 一个对象依赖的其它对象会通过被动的方式传递进来, 而不是这个对象自己创建或者查找依赖对象. 你可以认为 IoC 与 JNDI 相反 -- 不是对象从容器中查找依赖, 而是容器在对象初始化时不等对象请求就主动将依赖传递给它.
面向切面 --Spring 提供了面向切面编程的丰富支持, 允许通过分离应用的业务逻辑与系统级服务 (例如审计(auditing) 和事务 (transaction) 管理)进行内聚性的开发. 应用对象只实现它们应该做的 -- 完成业务逻辑 -- 仅此而已. 它们并不负责 (甚至是意识) 其它的系统级关注点, 例如日志或事务支持.
容器 --Spring 包含并管理应用对象的配置和生命周期, 在这个意义上它是一种容器, 你可以配置你的每个 bean 如何被创建 -- 基于一个可配置原型(prototype), 你的 bean 可以创建一个单独的实例或者每次需要时都生成一个新的实例 -- 以及它们是如何相互关联的. 然而, Spring 不应该被混同于传统的重量级的 EJB 容器, 它们经常是庞大与笨重的, 难以使用.
框架 --Spring 可以将简单的组件配置, 组合成为复杂的应用. 在 Spring 中, 应用对象被声明式地组合, 典型地是在一个 xml 文件里. Spring 也提供了很多基础功能(事务管理, 持久化框架集成等等), 将应用逻辑的开发留给了你.
所有 Spring 的这些特征使你能够编写更干净, 更可管理, 并且更易于测试的代码. 它们也为 Spring 中的各种模块提供了基础支持.
2,Spring 的目标
为程序开发者提供一个一站式, 轻量级的开发平台, 这个平台不仅可以降低代码的开发难度, 降低代码之间的耦合度还可以与第三方中间件更好, 更便捷的结合.
通过 IoC 容器来管理 POJO 对象, 以及对象之间的耦合关系.
通过 AOP, 以动态, 非侵入的方式来增强服务的功能.
IoC 和 AOP 是 Spring 的核心部分, 是最为底层的抽象.
3,Spring 的整体结构
(1)Spring IoC
Spring 的 IoC 中包含了最基本的 IoC 容器的 beanFactory 的接口和实现.
BeanFactory 中包含三个子类, 分别是 ListableBeanFactory,HierarchicalBeanFactory 和 AutowireCapableBeanFactory. 而最终实现的类是 DefaultListableBeanFactory, 实现这个类即可实现所有类.
- public interface BeanFactory {
- // 这里是对 FactoryBean 的转义定义, 因为如果使用 bean 的名字检索 FactoryBean 得到的对象是工厂生成的对象,
- String FACTORY_BEAN_PREFIX = "&";
- // 根据 Bean 的名字来找到对应的实例.
- Object getBean(String name) throws BeansException;
- // 根据 bean 的名字和 Class 类型来得到 bean 实例, 和上面的方法不同在于它会抛出异常: 如果根据名字取得的 bean 实例的 Class 类型和需要的不同的话.
- Object getBean(String name, Class requiredType) throws BeansException;
- // 查看是否在 IoC 容器有这个名字的 bean
- boolean containsBean(String name);
- // 根据 bean 名字得到 bean 实例, 并同时判断这个 bean 是不是单件
- boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
- // 对得到 bean 实例的 Class 类型
- Class getType(String name) throws NoSuchBeanDefinitionException;
- // 得到 bean 的别名, 如果根据别名检索, 那么其原名也会被检索出来
- String[] getAliases(String name);
- }
Spring 不仅仅只提供一个 IoC 容器.
1 AnnotationConfigApplicationContext: 从一个或多个基于 java 的配置类中加载上下文定义, 适用于 java 注解的方式;
2 ClassPathXmlApplicationContext: 从类路径下的一个或多个 xml 配置文件中加载上下文定义, 适用于 xml 配置的方式;
3 FileSystemXmlApplicationContext: 从文件系统下的一个或多个 xml 配置文件中加载上下文定义, 也就是说系统盘符中加载 xml 配置文件;
4 AnnotationConfigwebApplicationContext: 专门为 Web 应用准备的, 适用于注解方式;
5 XmlWebApplicationContext: 从 Web 应用下的一个或多个 xml 配置文件加载上下文定义, 适用于 xml 配置方式.
(2)Spring AOP
Spring 集成了 AspectJ 作为 AOP 的特定时现, 同时还在 JVM 动态代理和 CGLIB 的基础上来实现 AOP 框架.
JVM 动态代理实现分为两种, 一种是 JDK 实现的动态代理和 CGLIB 方式, 不需要强制实现接口.
AOP 的最底层实现原理就是代理模式.
例如 TransactionProxyFactoryBean 声明式事务处理就是一个完整的 AOP 代理对象, 实现 AOP 拦截器, 甚至实现所有 Advice 的过程.
代理模式: 若是我们想使用 A 类时, 我们不直接使用, 而是通过 B 类来调用 A 类来实现我们最初要使用 A 类的初衷.
(3)Spring MVC
Spring MVC 是为了是后端框架与前端 Web 模块更好的整合在一起出现的. 这个模块以 DispatcherServerlet 为核心. 来实现 MVC 模式, 其中包括与 Web 容器的集成, Web 请求的拦截, 分发, 处理以及 ModuleAndView 数据的返回, 以及集成各种 UI 试图展现和数据表现.
(4)Spring JDBC/ORM
在开发过程中, 对关系型数据库的操作是很重要的, 使用 JAVA 提供的 JDBC 过于繁琐, 所以 Spring 提供 Spring JDBC 来处理对数据库的操作, Spring JDBC 就是对 JAVA 提供的 JDBC 的进一层封装, 使用 JdbcTemplate 做为模板, 其中封装了最近本的数据库操作, 例如: 增加, 修改, 删除, 查询等, 并且还提供了 RDBMS 的操作对象, 通过这些对象可以将数据映射到集合中, 类似于一个小型的 ORM 操作.
Spring ROM:Spring 框架封装了许多 ORM 工具, 例如: Hibernate,Mybatis 等, 还为其提供了许多模板, 例如 HibernateTemplate 等, 便于与 ORM 框架联合使用.
(5)Spring 事务处理
Spring 事务处理是通过 SpringAOP 实现的增强自身服务的模块, 在这个模块中, Spring 把事务处理的主要过程提出来, 并且通过 AOP 的切面增强声明式事务处理功能.
(6)Spring 远端调用
通过 Spring 的端对端调用, 通过 Spring 的封装, 隐藏了各种通信以及调用细节.
(7)Spring 应用
Spring IO Platform : Spring IO 是可集成的, 构建现代化应用的版本平台. Spring IO 是模块化的, 企业级的分布式系统, 包括一系列依赖, 是的开发者仅能对自己所需的部分进行完全的部署控制.
Spring Boot:Spring 应用快速开发工具, 用来简化 Spring 应用开发过程.
Spring XD:Spring XD(eXtreme Date, 极限数据)是 Pivotal 的大数据产品. 它结合了 Spring Boot 和 Grails, 组成 Spring IO 平台的执行部分.
Spring Data:Spring Data 是为了简化构建基于 Spring 框架应用的数据访问实现, 包括非关系数据库, Map-Reduce 框架, 云数据服务等; 另外, 也包含对关系数据库的访问支持.
Spring Integration:Spring Integration 为企业数据集成提供了各种适配器, 可以通过这些适配器来转换各种消息格式, 并帮助 Spring 应用完成与企业应用系统的集成.
Spring Batch:Spring Batch 是一个轻量级的完整批处理框架, 皆在帮助应用开发者构建一个健壮, 高效的企业级批处理应用(这些应用的特点是不需要与用户交互, 重复的操作量大, 对于大容量的批量数据处理而言, 这些操作往往要求较高的可靠性)
Spring Security:Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架. 它提供了一组可以在 Spring 应用上下文配置的 bean, 充分利用 IoC 和 AOP 功能, 为应用系统提供声明式的安全访问控制功能.
Spring Hateoas:Spring Hateoas 是一个用户支持实现超文本驱动的 REST Web 服务的开发库, 是 Hateoas 的实现. Hateoas(Hypermedia as the engine of application state)是 REST 架构风格中最复杂的约束, 也是构建成熟 REST 服务的核心. 它的重要性在于打破了客户端和服务器之间严格的契约, 是的客户端可以更加智能和自适应.
Spring Social:Spring Social 是 Spring 框架的扩展, 用来方便开发 Web 社交应用程序, 可通过该项目来创建与各种社交网站的交互, 如 Facebook,LinkedIn,Twitter 等.
Spring AMQP:Spring AMQP 是基于 Spring 框架的 AMQP 消息解决方案, 提供模版化的发送和接收消息的抽象层, 提供基于消息驱动的 POJO. 这个项目支持 Java 和. NET 连个版本. Spring Source 旗下的 Rabbit MQ 就是一个开源的基于 AMQP 的消息服务器.
Spring for Android:Spring for Android 为 Android 终端开发应用提供 Spring 的支持, 它提供了一个在 Android 应用环境中工作, 基于 Java 的 REST 客户端.
Spring Mobile:Spring Mobile 是基于 Spring MVC 构建的, 为移动端的服务器应用开发提供支持.
Spring Web Flow:Spring Web Flow(SWF)一个建立在 Spring MVC 基础上的 Web 页面流引擎.
Spring Web Service:Spring Web Service 是基于 Spring 框架的 Web 服务框架, 主要侧重于基于文档驱动的 Web 服务, 提供 SOAP 服务开发, 允许通过多种方式创建 Web 服务.
Spring LDAP:Spring LDAP 是一个用户操作 LDAP 的 Java 框架, 类似 Spring JDBC 提供了 JdbcTemplate 方式来操作数据库. 这个框架提供了一个 LdapTemplate 操作模版, 可帮助开发人员简化 looking up,closing contexts,encoding/decoding,filters 等操作.
Spring Session: Spring Session 致力于提供一个公共基础设施会话, 支持从任意环境中访问一个会话, 在 Web 环境下支持独立于容器的集群会话, 支持可插拔策略来确定 Session ID,WebSocket 活跃的时候可以简单地保持 HttpSession.
Spring Shell: Spring Shell 提供交互式的 Shell, 用户可以简单的基于 Spring 的编程模型来开发命令.
---------------------
作者: DoReMiFaSolLaTi
来源: http://www.bubuko.com/infodetail-3052524.html