Spring学习笔记
Spring学习笔记
spring是什么?
Spring是一个开源框架,最早有Rod Johnson创建,它解决的是业务逻辑层和其他各层的松耦合问题。在诞生之初,创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB。相对于EJB来说,Spring提供了更加轻量级和简单的编程模型。
经过十几年的发展,Spring正在扩展其他的领域,如:移动开发、社交API集成、NoSQL数据库、云计算、大数据以及微服务架构。
spring简化开发采取的四种策略
-
基于POJO的轻量级和最小侵入性编程(POJO)
- 很多框架通过强制要求应用继承规定的类或者实现规定的接口,从而实现相应的功能,导致应用与框架强制耦合。
- Spring不会强迫实现Spring规范的接口或继承规范的类,相反,在基于Spring构建的应用中,它的类通常是没有任何痕迹表明你使用了Spring。最坏的情况就是使用Spring注解,但它依然是一个简单的POJO类,可以做其他的任何事情。
-
通过依赖注入和面向接口实现松耦合(IOC)
-
强耦合调用
-
接口编程解耦合
-
Spring IOC松耦合
-
-
基于切面和惯例进行声明式编程(AOP)
- IOC能够让相互协作的软件组件保持松散的耦合,而面向切面编程(AOP)允许你把遍布系统各处的功能抽离出来形成可重用的组件。
- 面向切面编程往往被定义为促使软件系统实现关注点的分离技术。系统由许多不同的组件组成,每一个组件各负其责一块特定功能。除了实现自身核心的功能之外,这些组件还经常承担着额外的职责。诸如日志、事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为它们会跨越系统的多个组件。
- 如果将这些关注点分散到多个组件中去,你的代码将会带来双重的复杂性。
- 实现系统关注点功能的代码将会重复出现在多个组件中。
- 组件会因为那些与自身核心业务无关的代码而变得混乱。
-
通过切面和模版减少样板式代码(Template)
- 在编码时,我们通常为了实现通用和简单的任务,必须一遍遍的重复编写类似的代码,这就是样板式代码。样板式代码的一个常见范例是使用JDBC访问数据库查询数据,常见的还有JSM、JNDI与使用REST服务也会涉及大量的重复代码。
- Spring旨在通过模版封装来消除样板式代码
SpringBean容器
-
在基于Spring的应用中,你的应用对象生存在Spring容器中,Spring容器负责创建对象,装配它们,配置它们并管理它们的生命周期,由生到死。
-
容器是Spring框架的核心,Spring容器使用IOC管理构成应用的组件,它会创建相互协作的组件之间的关联。使这些对象更简单、干净,更易于理解,更易于重用并且更易于进行单元测试。
-
Spring容器并不只有一个,Spring自带了多个容器实现,可归为两种不同的类型。
- Bean工厂(有org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器,提供基本的DI支持。(Bean在调用的时候进行实例化)。
- 应用上下文(由org.springframework.context.ApplicationContext接口定义) 基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以及发布应用实践给感兴趣的事件监听着。(Bean在容器初始化的时候进行实例化)。
-
Bean工厂对于大多数的应用来说往往太低级,因此应用上下文要比Bean工厂更受欢迎。
Bean的生命周期创建
SpringBean创建流程图:
在传统的Java应用中,bean的声明周期很简单,使用Java关键字new、反射等方式进行bean实例化后,该bean就可以使用了。一旦该bean不再被使用,则由Java虚拟机进行自动垃圾回收(GC)。相比之下Spring容器中的bean的生命周期就显得相对复杂很多。
- Spring对bean进行实例化。
- Spring讲值和bean的引用注入到bean对应的属性中。
- 如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法。
- 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,讲BeanFactory容器实例传入。
- 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来
- 如果bean实现了BeanPostProcessor接口,Spring将调用post-ProcessBeforeInitialization()方法。
- 如果bean实现了InitalizingBean接口,Spring将调用它们的after-PropertiesSet()方法。类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用。
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitalization()方法。
- 此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁。
- 如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。
Spring框架结构
-
Core Container(Spring核心容器)
容器是Spring框架最核心的部分,它管理着Spring应用中bean的创建、配置和管理。在该模块中,包括了Spring Bean工厂,它为Spring提供了DI的功能。基于bean工厂,Spring还提供了应用上下文的实现(Context)。所有的Spring模块都是构建于核心容器之上。
-
Spring的AOP模块
在AOP模块中,Spring对面向切面编程提供了丰富的支持。这个模块是Spring应用系统中开发切面的基础。与DI一样,AOP可以帮助应用对象解耦。借助于AOP,可以讲遍布系统的关注点(例如事务、安全和日志)从它们所应用的对象中解耦出来。
-
Data Access/Integration(数据访问与集成)
使用JDBC编写代码通常会导致大量的样式代码,例如获取数据库连接、创建语句、处理结果集到最后关闭数据库连接。
-
Web与远程调用
MVC(Model-View-Controller)模式是一种普遍被接收的构建Web应用的方法,它可以帮助用户将界面逻辑与应用逻辑分离。
-
测试
鉴于开发者自测的重要性,Spring提供了测试模块以致力于Spring应用的测试。