Spring Framework学习笔记(一) – 初涉Spring
1. 为什么要使用Spring
Spring是为了解决企业级应用开发的复杂性而创建的,使用Spring可以让简单的JavaBean实现之前只有EJB才能完成的事情。但Spring不仅仅局限于服务器端开发,任何Java应用都能在简单性、可测试性和松耦合等方面从Spring中获益。
为了降低Java开发的复杂性,Spring采取了以下4种关键策略:
- 基于POJO的轻量级和最小侵入性编程;
- 通过依赖注入和面向接口实现松耦合;
- 基于切面和惯例进行声明式编程;
- 通过切面和模板减少样板式代码。
2. 俯瞰Spring
2.1 Spring需要的lib
在Spring 4.0中,Spring框架的发布版本包括了20个不同的模块,每个模块会有3个JAR文件(二进制类库、源码的JAR文件以及JavaDoc的JAR文件)。
在学习Spring的时候,全部代码都会基于Spirng 4.3.2
2.2 Spring模块
模块依据其所属的功能可以划分为6类不同的功能
对上图简单的说明
Spring核心
- 容器作为Spring的核心内容。简略的参照3.Sring容器
Spring的AOP模块
- 参照4. Spring的AOP
数据访问与集成
- 使用JDBC会产生大量的模块代码,而Spring的JDBC和DAO模块会抽象化这些模块代码
- Spring集成了很多ORM(Object-Relational Mapping)框架 例如:
3. Spring容器
Spring容易负责创建对象,装配,配置,管理整个生命周期(从new到finzliza)。
容器是Spring的核心,Spring容器使用DI管理构成应用的组件,它会创建相互协作的组件之间的关联。
两种容器:
- bean工厂:org.springframework. beans. factory.eanFactory接口定义
- 上下文:org.springframework.context.ApplicationContext接口定义
bean工厂的级别远低于上下文,主要关注上下文的使用。
接口 | 说明 |
---|---|
AnnotationConfigApplicationContext | 从一个或多个基于Java的配置类中加载Spring应用上下文。 |
AnnotationConfigWebApplicationContext | 从一个或多个基于Java的配置类中加载Spring Web应用上下文。 |
ClassPathXmlApplicationContext | 从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。 |
FileSystemXmlapplicationcontext | 从文件系统下的一个或多个XML配置文件中加载上下文定义。 |
XmlWebApplicationContext | 从Web应用下的一个或多个XML配置文件中加载上下文定义。 |
4. Spring的AOP
面向切面编程 aspect-oriented programming
诸如日志、事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为它们会跨越系统的多个组件。
举个例子
有一个类,是球员,球员会用很多种动作,比如,接球,移动,投篮,过人 等等。。。。。
还有一个解说员,解说会根据球员的每个动作,balabala的说明。
如果在每个方法中都调用解说员类,对代码的编写测试都会有很大的影响。同时也会提高程序的耦合性。
球员不会管解说员说啥,他该做什么动作就做什么,对于我们编写的代码也是同样的道理,我们只专注于自身的功能
这种解耦的方式就叫做AOP。会在之后的笔记中详细说明。
5. Bean的生命周期
Spring对bean进行实例化;
Spring将值和bean的引用注入到bean对应的属性中;
如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBean-Name()方法;
如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来;
如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessBeforeInitialization()方法;
如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法。类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用;
如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization()方法;
此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。
6. Spring 4.0的新特性
Spring提供了对WebSocket编程的支持,包括支持JSR-356——Java API for WebSocket;
鉴于WebSocket仅仅提供了一种低层次的API,急需高层次的抽象,因此Spring 4.0在WebSocket之上提供了一个高层次的面向消息的编程模型,该模型基于SockJS,并且包含了对STOMP协议的支持;
新的消息(messaging)模块,很多的类型来源于Spring Integration项目。这个消息模块支持Spring的SockJS/STOMP功能,同时提供了基于模板的方式发布消息;
Spring是第一批(如果不说是第一个的话)支持Java 8特性的Java框架,比如它所支持的lambda表达式。别的暂且不说,这首先能够让使用特定的回调接口(如RowMapper和JdbcTemplate)更加简洁,代码更加易读;
与Java 8同时得到支持的是JSR-310——Date与Time API,在处理日期和时间时,它为开发者提供了比java.util.Date或java.util.Calendar更丰富的API;
为Groovy开发的应用程序提供了更加顺畅的编程体验,尤其是支持非常便利地完全采用Groovy开发Spring应用程序。随这些一起提供的是来自于Grails的BeanBuilder,借助它能够通过Groovy配置Spring应用;
添加了条件化创建bean的功能,在这里只有开发人员定义的条件满足时,才会创建所声明的bean;
Spring 4.0包含了Spring RestTemplate的一个新的异步实现,它会立即返回并且允许在操作完成后执行回调;
添加了对多项JEE规范的支持,包括JMS 2.0、JTA 1.2、JPA 2.1和Bean Validation 1.1。”
7. 缩写的含义
- POJO 老式Java对象 Plain Old Java object
- EJB 企业级JavaBean(Enterprise JavaBean
- JDO Java数据对象Java Data Object
- 耦合具有两面性(two-headed beast)。
- 一方面,紧密耦合的代码难以测试、难以复用、难以理解,并且典型地表现出“打地鼠”式的bug特性(修复一个bug,将会出现一个或者更多新的bug)。
- 另一方面,一定程度的耦合又是必须的——完全没有耦合的代码什么也做不了。为了完成有实际意义的功能,不同的类必须以适当的方式进行交互。总而言之,耦合是必须的,但应当被小心谨慎地管理。
创建应用组件之间协作的行为通常称为装配(wiring)