从新来认识你的老朋友SPRING框架

Spring这个词对于开发者想必不会陌生,可能你天天都在使用Spring,享受着Spring生态提供的服务,理所固然的用着SpringIOC和SpringAOP去实现老板交给你的功能 ,唔 它就是这样使用的(类声明为Bean组件,而后注入),没错 能完成老板任务,没毛病。若是向你提问什么是Spring,Spring有什么核心功能呢,你会想:这太简单了,Spring就是框架嘛,Spring核心功能就是IOC和AOP,So Easy!!但是你真的了解Spring吗?带着这个疑问让咱们一块儿来从新了解一下Spring!数据库

 

Spring的起源和根本使命编程

Spring是一个开源框架,最先由Rod Johnson建立,是为了解决企业级应用开发的复杂性而建立的。不少框架都宣称在某些方面针对Java开发作出了简化,可是Spring的目标是致力于全方位简化Java开发,这也是Spring的根本使命 "简化Java开发"安全

从新来认识你的老朋友SPRING框架

 

 

Spring如何简化Java开发性能优化

为了下降Java开发的复杂性,Spring采起了如下4种关键策略,请务必牢记下面4中策略于心,这样会帮助你更深的理解Spring。下面咱们来逐一解读每一条策略,你就能明白Spring是如何简化Java开发的。架构

  • 基于POJO的轻量级和最小侵入性编程
  • 经过依赖注入和面向接口实现松耦合
  • 基于切面和惯例进行声明式编程
  • 经过切面和模板减小样版式代码

1. 基于POJO的轻量级和最小侵入性编程并发

Spring竭力避免因自身的API而弄乱你的代码。Spring不会强迫你实现Spring规范的接口或继承Spring规范的类。相反,在一个基于Spring构建的应用中,应用中的类没有任何痕迹代表你使用了Spring。最坏的状况就是你在应用的类中发现了Spring的相关注解,但它依然是POJO,下面咱们来看一个在Spring中的一个POJO例子。框架

从新来认识你的老朋友SPRING框架

 

你能够看到,这就是一个POJO(简单的JAVA类),没有任何地方代表它是Spring组件,Spring非侵入式编程模型意味着这个类在Spring应用和非Spring应用中均可以发挥一样的做用。尽管看起来很简单;但Spring经过IOC(Inversion of Control)管理这个POJO,而后经过DI(Dependency Inject)来注入他们,这个POJO就变的魔力十足;那么DI是如何帮助应用对象彼此之间保持松耦合的呢?分布式

在此我向你们推荐一个架构学习交流群。交流学习群号:874811168 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多模块化

2. 经过依赖注入和面向接口实现松耦合微服务

来咱们一块儿来看一下一个简单的POJO

从新来认识你的老朋友SPRING框架

 

在BeautifulGirl(可爱的小女孩)这个类中,在构造方法中建立一个EatAction(吃饭动做)。这样就极大限制了BeautifulGirl(可爱的小女孩)的能力;若是如今小女孩须要去玩耍呢?或者须要去睡觉呢?真是太抱歉了,BeautifulGirl(可爱的小女孩)只会吃东西这个动做。这是什么缘由呢?这就是BeautifulGirl(可爱的小女孩)和EatAction(吃饭动做)这两个类牢牢耦合在了一块儿!紧密耦合同时会形成代码的难以测试,难以服用,难以理解,而且典型地表现出"打地鼠“式的Bug特性(修复一个Bug,将会出现一个或多个新Bug),因此咱们能够知道耦合是必须的,但必须谨慎管理耦合,可是怎么才算是谨慎处理耦合关系呢?

从新来认识你的老朋友SPRING框架

 

上图所示,DI(依赖注入)会将所依赖关系自动交给目标对象,而不是让对象自己建立所依赖对象。对象的依赖关系将由系统中负责协调个对象依赖关系的第三方组件(相似Spring)在建立对象的时候设定。如今咱们明白了经过DI依赖注入能够将对象之间依赖关系轻松解耦,那么咱们来看一下简单的实例吧。

从新来认识你的老朋友SPRING框架

 

从上面实例代码中能够看到BeautifulGirl自己并无建立任何的动做,而是经过构造方法传入一个实现了Action(动做)接口的实现类便可,也就是说BeautifulGirl能够完成任意实现了Action接口的动做(睡觉啦...玩耍啦...旅行啦....)。这里的要点是BeautifulGirl没有与任何特定的Action发生耦合。BeautifulGirl只须要的是一个实现Action接口就行,对象自己只是经过接口(而非具体实现或初始化过程)来代表依赖关系,那么这种依赖就可以在BeautifulGirl不知情的状况下替换不一样的具体动做。好了咱们如今明白了DI进行依关系解耦的原理了,下面咱们看一下如何在Spring中应用DI。

从新来认识你的老朋友SPRING框架

 

从新来认识你的老朋友SPRING框架

 

这样执行Main方法,从Context中获取BeautifulGirl实例执行action方法。固然Spring提供了基于Java的配置,可做为XML配置文件的代替方案

从新来认识你的老朋友SPRING框架

 

只不过Spring的上下文的实现应该使用AnnotationConfigApplicationContext进行加载配置

从新来认识你的老朋友SPRING框架

 

3. 基于切面和惯例进行声明式编程

如今咱们已经明白DI可以将互相协做的软件保持松耦合,而面向切面编程(aspect-oriented-programming,AOP)能够将遍及应用各处的功能分离出来造成可从用的组件。咱们仍然使用上面的例子,BeautifulGirl为所欲为的执行各类动做真的没问题吗?若是可爱的小女孩执行的动做是去河边玩耍,吃一些危险的东西呢?那么咱们势必须要一个家长(Parent类)进行监督小女孩的动做是不是安全的,下面咱们来看一下Parent类。

从新来认识你的老朋友SPRING框架

 

很是简单!Parent(家长类)只有一个方法就是check,那么如今就让Parent对BeautifulGirl的执行动做进行检查吧。

从新来认识你的老朋友SPRING框架

 

从新来认识你的老朋友SPRING框架

 

咱们很是聪明,使用了DI将Parent类注入到了BeautifulGirl类中,在BeautifulGirl执行action动做以前执行 parent.check()方法,这样咱们要的效果就达到了。等等....好像有什么不对的地方?

  • 管理Parent家长的check动做真的是美丽的小女孩的职责吗?
  • 将Parent家长注入到美丽的小女孩类中不是将代码复杂化了吗?
  • 咱们需不须要一个不须要家长注入的美丽的小女孩呢?
  • 若是注入的Parent为NULL咱们是否应该在美丽的小女孩中进行校验呢?

 

真的是太糟糕了,注入一个Parent(家长)将会产生那么多的问题,为何呢?由于Parent类的业务于BeautifulGirl无关;BeautifulGirl将会承担Parent类的职责。

 

在一个项目中,不少系统服务都会分布到各个业务模块中,这使得业务模块的逻辑变得十分复杂,而使用AOP可以使这些服务模块化,并以声明式的方式将他们应用到他们所须要影响的组件中,使得这些组件将会具备更高的内聚性而且更加关注自身的业务逻辑,彻底不须要了解系统服务所带来的复杂性。

下面咱们使用SpringAOP对上面代码进行改造

从新来认识你的老朋友SPRING框架

 

从新来认识你的老朋友SPRING框架

 

咱们只须要在Spring配置文件中声明Parent为Spring Bean,而后将配置在SpringAOP中便可,咱们能够发现BeautifulGirl类中没有发现任何关于Parent的信息,这就是AOP的魅力所在——以声明的方式将组件应用到他们所须要影响的组件中!

4. 经过切面和模板减小样版式代码

在经过JavaAPI进行编程,咱们常常会编写不少重复的代码例如JDBC访问数据库,JMS,JNDI等场景下会重复编写大量的样版式代码,而Spring皆在经过模板封装来消除模板式代码,例如Spring针对JDBC访问数据库进行封装的JdbcTemplate等,这里就是Spring使用封装的模板来减小JavaAPI样版式代码。

从新来认识你的老朋友SPRING框架

相关文章
相关标签/搜索