Spring根本任务

Spring的根本任务就是简化Java开发。
目前许多框架如果要使用他们,就必须要继承或实现这些框架的各种类。这使得框架与我们的程序耦合度过高。由于在我们的程序中加入了过多的框架代码,使得我们的代码看起来非常臃肿。
但Spring不是这样,它不会强迫你去实现或继承任何Spring的类,这样你的代码会非常清晰,而且完全看不出有Spring加入的痕迹。当然,如果使用了Spring注解,你的代码会稍稍留有Spring的痕迹,但与其他框架相比,即使使用了注解,Spring与我们程序的耦合度依然很低。

Spring特性一:依赖注入

面向接口编程

在了解依赖注入之前,首先要了解“面向接口编程”的思想。
首先来看如下代码:
以下代码创建了两个类A和B,A的构造函数中通过new创建B的对象,并调用B的show方法。
在一个类中,如果通采用new来创建另一个类的对象,将会使得这两个类过度耦合。

class A{private B b;public A(){b = new B();b.show();}
}class B{public void show(){System.out.println("我是B");}
}

如果我们把B的对象作为参数传递给A的构造函数,即B对象的创建由类A调用者创建,而不是A自己创建,这样就能在一定程度上降低两个类的耦合度。代码如下:

class A{private B b;public A(B b){this.b = b;b.show();}
}

下面我们进一步降低这两个类降低耦合度:
类A不变,我们把类B抽象成一个接口,该接口中有一个抽象函数show。
然后我们分别定义接口B的两个实现类:B_1和B_2,并且分别实现show方法。

interface B{void show();
}class B_1 implements B{public void show(){System.out.println("我是B_1");}
}class B_2 implements B{public void show(){System.out.println("我是B_2");}
}

那么此时,如果调用者创建B_1的对象传递给A的构造函数的话,将会执行B_1的show方法,如果将B_2的对象传递给A的构造函数的话,就会执行B_2的show方法。因此,在A类代码不变的情况下,A的调用者可以自由地控制A究竟执行哪个B实现类的show方法,从而进一步降低了A和B的耦合度。
这种思想就是大名鼎鼎的“面向接口编程”!即:将接口作为函数的参数,在调用函数时,调用者可以灵活地决定究竟创建该接口的哪一个实现对象,从而达到在不改变函数代码的前提下,执行不同的代码

class A{private B b;public A(B b){this.b = b;b.show();}
}

依赖注入

在没学Spring之前,我们为一个引用赋值有以下三种方式:
1.通过new创建一个对象,然后赋给引用:

A a = new A();

2.通过函数的参数传递

void function(A aaa){A a = aaa;
}

3.将一个现成的对象赋给引用

A a = aaa;//假设aaa为一个现成的A对象

而现在,整个程序的所有对象都由Spring创建并管理。
Spring把类称为bean,每个bean都需要在XML文件中声明,为bean指定名字。
当我们需要一个对象的时候,只需调用Spring的context.getBean(“bean的名字”)即可获得该对象。而不是通过传统的new来创建。
这就是“依赖注入”。

依赖注入的优点

对于一个接口来说,它将会有很多实现类,这些实现类均含有相同的函数名和不同的函数实现。当一个实现类的对象赋给一个接口引用时,该引用可以访问实现类中实现的函数,如下所示:

SuperInterface a = new ImplmentClass_A();
a.show();

如果需要给a换一个实现类,仅需将new后面的类换掉即可,其他代码保持不变:

SuperInterface a = new ImplmentClass_B();
a.show();

但上述方法仍有缺点,如果需要更换实现类,还需要修改代码。能不能不修改代码就能更换实现类呢?Spring做到了!
所有负责所有对象的创建与管理,到底将哪个对象赋给SuperInterface a在配置文件中设置,而不需要修改代码了。
这就是Spring依赖注入的优点。

Spring特性二:面向切面编程

我们在开发一个函数的时候会发现,有些代码并不是这个函数的主要功能,但不得不去写,比如函数参数合法性的验证、日志的记录、事务管理等等。这些功能不是这个函数的主要功能,但为了增强程序的健壮性不得不去写。
而且,这些功能往往会导致重复的代码,每个函数的开头都要写一段参数合法性判断的代码,顿时感觉心好累。于是,Spring提出了面向切面编程。
我们可以把这些重复性的代码提取出来,封装到一个专门的类里面去。然后告诉Spring,某些函数执行的时候,先在函数的头或尾或中间切一刀,把刚才提取出来的代码加进去,然后再执行函数。这就是面向切面编程。

跟着柴毛毛学Spring(1)——纵观Spring相关推荐

  1. 跟着柴毛毛学Spring(3)——简化Bean的配置

    通过前面的学习.我们会感觉到对于一个有较多Bean的大项目,Spring的配置会比較复杂. 那么接下来我们就介绍怎样简化Spring的配置. 简化Spring的配置主要分为两类: 1. 自己主动装配 ...

  2. 每天学点Shiro-集成spring

    首先用Maven构建Javaweb工程,然后按下面的步骤进行: 1.  第一步肯定是pom.xml中添加依赖,包括spring,springmvc,shiro <!-- spring + spr ...

  3. 第五章 处理器拦截器详解——跟着开涛学SpringMVC

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.   ...

  4. 跟着开涛学SpringMVC 第一章源代码下载

    2019独角兽企业重金招聘Python工程师标准>>> 源代码请到附件中下载. 其他下载: 跟着开涛学SpringMVC 第一章源代码下载 第二章 Spring MVC入门 源代码下 ...

  5. 二、何为Spring Boot整合Spring Cloud?

    题语:学习方法之多思考:正向.逆向.跳跃 作者:A哥(YourBatman) wx号:fsx641385712(备注"Java群"字样) 公众号:BAT的乌托邦(ID:BAT-ut ...

  6. 跟着开涛学SpringMVC

    第一章 Web MVC简介 1.1.Web开发中的请求-响应模型: 在Web世界里,具体步骤如下: 1.  Web浏览器(如IE)发起请求,如访问http://sishuok.com 2.  Web服 ...

  7. Spring精华问答 | Spring框架有哪些主要模块?

    Spring框架是一个开源的Java平台,它提供了非常容易,非常迅速地开发健壮的Java应用程序的全面的基础设施支持.今天就让我们一起来看看关于Spring的精华问答吧. 1 Q:什么是Spring框 ...

  8. Spring精华问答 | Spring Boot有哪些优点?

    戳蓝字"CSDN云计算"关注我们哦! Spring是于2003 年兴起的一个轻量级的Java 开发框架,为了解决企业应用开发的复杂性而创建的.今天,我们一起来看看关于Spring更 ...

  9. 【Spring开发】—— Spring Core

    原文:[Spring开发]-- Spring Core 前言 最近由于一些工作的需要,还有自己知识的匮乏再次翻开spring.正好整理了一下相关的知识,弥补了之前对spring的一些错误认知.这一次学 ...

最新文章

  1. IE9正式版已完成 截图曝光
  2. 总结:C#中跨窗体传值的几种方法
  3. mysql bind param_为什么bindParam必须要指定类型?
  4. android怎么实现标题搜索,Android Toolbar上SearchView的实现
  5. flink的Table类型的变量两种输出的形式
  6. QPainter 的状态保存与恢复
  7. PHP命令注入***
  8. 悬浮球不用权限_Android 实现无需权限的悬浮球效果,可适配至Android 10
  9. Github上点赞最多的10个Python项目(2020年3月)
  10. 2-set 1823: [JSOI2010]满汉全席
  11. 提升谷歌chrome浏览器下载速度的方法
  12. fmask云检测 matlab_ENVI5.4中的云检测/掩膜工具
  13. 大话西游中的这些经典元素,注意到没?
  14. 【微信小程序】用户授权及getUserProfile接口使用
  15. 关于pyrit安装失败最新解决
  16. 365智能云打印怎么样?365小票无线订单打印机好用吗?
  17. python word2vec怎么用_小白看Word2Vec的正确打开姿势|全部理解和应用
  18. canvas实现涂鸦效果--橡皮檫和历史记录
  19. Linux 系统设置 : enable 命令详解
  20. 大一学生网页课程作业 南京介绍网页设计 学生家乡网页设计作品静态 HTML网页模板源码 html我的家乡网页作业

热门文章

  1. 在线查看相机快门次数_我是亲民_新浪博客
  2. 学计算机游戏本,2019游戏笔记本推荐_新学期游戏本准备好了吗-太平洋电脑网
  3. 从顶会论文看2022年推荐系统序列建模的趋势
  4. 上大学的四年---以此结束四年的时光
  5. servlet+javabean+jdbc+mysql基于MVC模式的课件管理系统,有三个表的增删改查和课件搜索、课件上传、课件下载功能, 具体功能请看界面上的导航条
  6. 11个经典物联网应用电路方案优选合辑
  7. Java并发编程之 Excutor
  8. 51.【Java String方法的小结】
  9. linux开机自启动程序设置方法
  10. 数据预处理之scaling