阅读全文大概须要7分钟
java
大多数文章讲"什么到Spring?"上来就是 控制反转(IoC)或依赖注入(DI)和面向切面编程(AOP),拿着官网文档直译 copy。对小白来讲并不友好,看完可能仍是一头雾水。下面是我利用业余时间整理的一些资料、书籍和本身的理解,致力于更容易理解方式讲 Spring。
[toc]web
Spring 是一个开源框架,Spring是于2003 年兴起的一个 轻量级的Java 开发框架,由 Rod Johnson 在其著做 Expert One-On-One J2EE Development and Design 中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而建立的。框架的主要优点之一就是其分层架构,分层架构容许使用者选择使用哪个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring 使用基本的 JavaBean 来完成之前只可能由 EJB 完成的事情。
然而,Spring的用途不只限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用均可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来讲,Spring 是一个分层的 JavaSE/EE full-stack
(一站式) 轻量级
开源框架。spring
简单来讲,它是一个容器框架,用来装 javabean(java对象),中间层框架(万能胶)能够起一个链接做用,好比说把 Struts 和 hibernate 粘合在一块儿运用。简单来讲,Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。数据库
若是你如今还有点疑惑,通读全文,你必定有所收获
如下内容都是基于 Spring 4 及以上的
Spring
官网图片编程
Spring就是一个大工厂(容器),能够将全部对象建立和依赖关系维护,交给Spring管理,spring工厂是用于生成bean缓存
Spring提供面向切面编程,能够方便的实现对程序进行权限拦截、运行监控等功能安全
只须要经过配置就能够完成对事务的管理,而无需手动编程服务器
Spring对Junit4支持,能够经过注解方便的测试Spring程序微信
Spring不排斥各类优秀的开源框架,其内部提供了对各类优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持多线程
Spring 对 JavaEE 开发中很是难用的一些 API(JDBC、JavaMail、远程调用等),都提供了封装,使这些 API 应用难度大大下降
Spring 中最重要的概念 IoC 和 AOP
IoC
须要DI
(依赖注入)的支持为何呢?由于没有 DI 的注入 Spring 创造出的对象都是空值是没法使用的,因此说IoC
和DI
多数是同时出现人们眼前的。
IOC
是 Inversion of Control
的缩写,多数书籍翻译成“控制反转”。为了解决对象之间的耦合度太高的问题,软件专家 Michael Mattson 提出了 IOC 理论,用来实现对象之间的解耦。
2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么究竟是“哪些方面的控制被反转了呢?”,通过详细地分析和论证后,他得出了答案:“得到依赖对象的过程被反转了”。控制被反转以后,得到依赖对象的过程由自身管理变为了由 IOC 容器主动注入。因而,他给“控制反转”取了一个更合适的名字叫作“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现 IOC 的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
依赖注入(DI)和控制反转(IOC)是从不一样的角度的描述的同一件事情,就是指经过引入 IOC 容器,利用依赖关系注入的方式,实现对象之间的解耦。
背景介绍完了,讲讲个人理解
IoC 就是依赖倒置原则的一种设计思路,就是将本来在程序中本身手动建立对象的控制权,交由 Spring 框架来管理。Spring 框架负责控制对象的生命周期和对象之间的关系。IoC 在其余语言中也有应用,并不是 Spirng 特有。ioc 容器实际上就是个 map(key,value),里面存的是各类对象(在xml里配置的bean节点||repository、service、controller、component)。
Spring IOC 容器就像是一个工厂同样,当咱们须要建立一个对象的时候,只须要配置好配置文件/注解便可,彻底不用考虑对象是如何被建立出来的。 IOC 容器负责建立对象,将对象链接在一块儿,配置这些对象,并从建立中处理这些对象的整个生命周期,直到它们被彻底销毁。
在实际项目中一个 Service 类若是有几百甚至上千个类做为它的底层,咱们须要实例化这个 Service,你可能要每次都要搞清这个 Service 全部底层类的构造函数,这可能会把人逼疯。若是利用 IOC 的话,你只须要配置好,而后在须要的地方引用就好了,这大大增长了项目的可维护性且下降了开发难度。
推荐阅读:
https://www.zhihu.com/questio...
IoC容器的初始化过程能够分为三步:
IoC 源码:
https://javadoop.com/post/spr...
AOP(Aspect Oriented Programming 面向切面编程),在程序开发中主要用来解决一些系统层面上的问题,好比日志收集,事务管理,权限,缓存,对象池管理等。
AOP 能够说是 OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP 引入封装、继承、多态等概念来创建一种对象层次结构,用于模拟公共行为的一个集合。不过 OOP 容许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码每每横向地散布在全部对象层次中,而与它对应的对象的核心功能毫无关系对于其余类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在 OOP 设计中,它致使了大量代码的重复,而不利于各个模块的重用。
AOP技术偏偏相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减小系统的重复代码,下降模块之间的耦合度,并有利于将来的可操做性和可维护性。
Spring AOP就是基于动态代理的,底层实现有俩种方式:一种是 JDK 动态代理(JDK Proxy),另外一种是 CGLib(Code Generation Library(基于字节码操做)) 的方式。
若是要被代理的对象是个实现类,那么 Spring 会使用 JDK动态代理来完成操做(Spirng 默认采用JDK动态代理实现机制);若是要被代理的对象不是个实现类那么,Spring 会强制使用 CGLib 来实现动态代理。
推荐阅读:https://www.jianshu.com/p/5b9...
固然,也可使用 AspectJ ,AspectJ 能够作Spring AOP干不了的事情,它是 AOP 编程的彻底解决方案。
Spring AOP 属于运行时加强;而 AspectJ 是编译时加强。Spring AOP 只能在运行时织入,AspectJ 运行时织入不可用,支持编译时、编译后和加载时织入。
AspectJ 相比于 Spring AOP 功能更增强大,可是 Spring AOP 相对来讲更简单。
线程安全一直是代码编写的重地,咱们大多时候在系统开发中不会使用多线程。单例 bean 存在线程安全问题,当多个线程操做同一个对象的时候,这个对象的非静态成员变量会存在线程安全问题。
解决方法:
2.在Bean对象中尽可能避免定义可变的成员变量。
在传统的Java应用中,bean的生命周期很简单,使用Java关键字 new 进行Bean 的实例化,而后该Bean 就可以使用了。一旦bean再也不被使用,则由Java自动进行垃圾回收。
相比之下,Spring管理Bean的生命周期就复杂多了,正确理解Bean 的生命周期很是重要。一个Bean的构造过程:
说到了 Spring ,那必定提一下 Spring MVC,各类讲 SSM 的技术博客你们应该都见了不少。
在我初学时 Java,那时讲的是 “Java Bean(Model) + JSP(View) + Servlet(Controller)” 这种开发模式,这是早期的 JavaWeb MVC。
Spring MVC 是一款很优秀的 MVC 框架。可让咱们的开发更简洁,并且它和 Spring 是无缝集成,是 Spring 的一个子模块,是咱们上面提到 Spring 你们族中 Web 模块。
Spring MVC 框架主要由 DispatcherServlet 、处理器映射、处理器(控制器)、视图解析器、视图组成。
Spring MVC 流程图很重要:
事务管理对于企业应用来讲是相当重要的,即便出现异常状况,它也能够保证数据的一致性。
声明式事务又分为两种:
@Transactional(rollbackFor = Exception.class)注解
在 @Transactional
注解中若是不配置 rollbackFor
属性,那么事物只会在遇到 RuntimeException
的时候才会回滚,加上 rollbackFor=Exception.class
,可让事物在遇到非运行时异常时也回滚。
scope 是范围的意思,在绝地求生中 scope 意为瞄准镜,若是你的队友是个老外你就和他说 i want this 4times scope 他就明白了。
下篇结合代码一块讲解
声明:参考来源互联网,有任何争议能够留言。站在前人的肩上,咱们才能看的更远。本教程纯手打,致力于最实用教程,但愿多多转发支持,对我真的很重要。
欢迎来我公众号,但愿能够结识你,更多原创PDF,微信搜索:JavaPub,回复:【666】,也能够催更。有任何问题均可以来谈谈 !