转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6774310.html 

 

一:Spring是什么

Spring的主要作用是作为对象的容器。

传统编程中,我们需要调用其他类的方法时,都是需要new一个对象,然后通过 对象.fun() 调用方法的。这样的话,一个类中又引用其他类,耦合度非常高。如果日后需要调整、修改时,比如:更换一个成员对象。则需要重新修改源代码。还有,某些对象会被重复创建,十分消耗内存,比如:Service层调用DAO层方法时重复创建。即使是用单例模式解决了对象重复问题,但也引入了新的问题——项目大时,多个DAO则每个DAO书写重复的单例模式代码,十分繁琐。

Spring诞生的初期目的,就是为了解决以上问题的。Spring是一个对象的容器,我们不需要自己创建对象,而是直接从spring中获取即可。

1:首先,我们定义了多个Java类,在Spring中,一般称之为bean。每个类都有自己的业务,比如:一个XXX_DAO就是负责对数据库表XXX进行操作的bean。

2:然后,通过配置文件,把每个bean的信息填写好,这样就告诉了Spring:有这些类。

3:然后,在代码中,需要获取对象时,通过Spring的 ApplicationContext对象.getBean("id")方法获取一个对象即可。

内部工作流程:Spring框架读取配置文件,解析里面配置的bean并用单例模式创建对象,然后保存在ApplicationContext中,相当于一个对象池。

然后,代码中getBean("id")时,就是从对象池根据ID获取到一个单例模式的对象来使用。

二:IOC与DI

学Spring的同学,首先接触的概念中都会有“控制反转”和“依赖注入”,并且往往被忽悠得头昏脑转。这里我给大家简明的讲解。

IOC:控制反转。什么是“控制”?这里的控制是指:对象的创建由谁来控制,传统编程时是由程序员在代码来显式创建,就是我们说的new一个对象。什么是“反转”?造成众多学习者迷惑的地方就在这里:反转?从原先的方向反转给相反方向? NO,并不是!这里应该叫“转移”更加合适。意思是:对象创建从代码中创建“转移”到了Spring容器中创建。怎么创建?就是上面我们说到的内部工作流程:Spring读取配置文件—单例模式创建对象—代码中getBean获取对象。

DI:依赖注入。什么是“依赖”?依赖是对象关系的一种,比如说类A中有成员属性是类B对象,那么类A对象就依赖类B对象。依赖的存在有什么影响呢?影响耦合,影响编译。比如:类A中有成员对象b。那么A和B就是耦合的,体现在编译时:编译A时,解析到成员b是类B对象,那么就要先解析类B,然后再接着解析类A。也就是说,类A不能独自编译。怎么解决呢?在下面“面向接口编程”有讲。什么是“注入”?注入,就是赋值,把类A中依赖的类B对象赋值。控制反转把对象的创建权交给了Spring,那么对于有依赖关系的对象的创建就要靠“依赖注入”来实现了——Spring把众多对象独立创建,然后根据依赖关系,把被依赖的对象赋值给依赖对象的成员属性,形象地称之为“注入”。

一句话:控制反转与依赖注入的意思就是:把对象交给Spring来创建、管理(IOC),Spring独立地创建每一个对象后,根据对象之间的依赖关系,把被依赖的对象赋值给依赖对象的成员属性(DI)【其实就是组装一个对象的过程】。

三:面向接口编程

上面我们提到,Spring“独立”地创建对象。我们知道,如果类A中有类B对象作为成员的话,类A是不能独立编译、独立创建的,怎样才能让他们解耦呢?没错,把类B对象改为B接口(把类中包含的其他类对象改为接口,就是面向接口编程)即可。这样,创建类A时就无需依赖类B了。还有一点:扩展性。根据“开闭原则”,项目开发完后,营运过程中需要进行扩展、更换组件类时,应该尽量少地对源代码进行改动。接口就提供了这样的功能,我们只需在配置文档中修改被依赖的对象为另一个接口实现类即可,由Spring进行动态组装。

四:AOP

AOP:面向切面编程。

什么是“切面”?我的理解是:在多个类当中都会出现的功能代码,就体现了一个切面。比如说:ABCD四个类,每个类当中都有登录权限验证的代码。那么,登录权限验证就是一个切面。切面是形象说法,如下图:

纵向排列的多个矩形是多个业务类,分别负责不同业务。其中,每个业务类都涉及到了相同的功能:日志、事务管理、权限验证等。这些功能处于一个横切各业务类的平面上,可以合而为一。

面向切面编程,就是:提取出多个业务类当中共同的部分,组成一个切面,然后在各个业务类执行到该部分(我们称之为“切点”)时,就执行切面上的代码。而不是在多个业务类中重复编写相同的功能代码。

五:Spring重点使用

Spring是一个十分强大的框架,功能繁多。一般开发时,用得最多的有以下几个:

1:对象托管:IOC与DI的使用

2:AOP应用:Spring实现的AOP

3:事务管理:把Hibernate等ORM框架的数据库操作事务进行管理,进一步减轻工作量

后续博文陆续围绕上述三个方面展开学习。

Spring学习笔记一:基础概念的更多相关文章

  1. Docker:学习笔记(1)——基础概念

    Docker:学习笔记(1)——基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...

  2. OpenFlow Switch学习笔记(一)——基础概念

    OpenFlow Switch v1.4.0规范是在2013年10月14号发布,规范涵盖了OpenFlow Switch各个组件的功能定义.Controller与Switch之间的通信协议Open F ...

  3. Elasticserach学习笔记-01基础概念

    本文系本人根据官方文档的翻译,能力有限.水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸. 原文出处:https://www.elastic.co/guide/en/e ...

  4. 【miscellaneous】 GStreamer应用开发手册学习笔记之基础概念介绍

    第3章. 基础概念介绍 本章将介绍GStreamer的基本概念. 理解这些概念对于你后续的学习非常重要,因为后续深入的讲解我们都假定你已经完全理解了这些概念. 3.1. 元件(Elements) 元件 ...

  5. Spring 学习笔记 IoC 基础

    Spring IoC Ioc 是什么 IoC -- Inversion of Control(控制反转)什么是控制?什么是反转? 控制反转了什么? 在很早之前写项目不用 Spring 的时候,都是在 ...

  6. [Spring学习笔记 4 ] AOP 概念原理以及java动态代理

    一.Spring IoC容器补充(1) Spring IoC容器,DI(依赖注入): 注入的方式:设值方法注入setter(属性注入)/构造子注入(构造函数传入依赖的对象)/字段注入Field(注解) ...

  7. Spring学习笔记1——基础知识 (转)

    1.在java开发领域,Spring相对于EJB来说是一种轻量级的,非侵入性的Java开发框架,曾经有两本很畅销的书<Expert one-on-one J2EE Design and Deve ...

  8. Spring学习笔记1——基础知识

    1.在java开发领域,Spring相对于EJB来说是一种轻量级的,非侵入性的Java开发框架,曾经有两本很畅销的书<Expert one-on-one J2EE Design and Deve ...

  9. Spring学习笔记之基础、IOC、DI(1)

    0.0 Spring基本特性 Spring是一个开源框架:是基于Core来架构多层JavaEE系统 1.0 IOC 控制反转:把对象的创建过程交给spring容器来做. 1.1 application ...

  10. Centos7安装gitlab11 学习笔记之基础概念、部署安装、权限管理、issue管理

    一.基础介绍 1.简介 一个基于GIT的源码托管解决方案 基于rubyonrails开发 集成了nginx postgreSQL redis sidekiq等组件 2.安装要求 2g内存以上,有点占内 ...

随机推荐

  1. java.lang.ThreadLocal类

    一.概述        ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也 ...

  2. 超人前传第一至十季/全集Smallville迅雷下载

    超人前传 第一至十季 Smallville Season 1-10 (2001-2010)本季看点:CW台的长寿剧<超人前传>在以帅哥靓女征服观众了这么多年后,也终于进入尾声,该剧将于今年 ...

  3. android之lint警告This Handler class should be static or leaks might occur

    更新到adt2.0的开发者们可能会在handler上发现这么一条警告:This Handler class should be static or leaks might occur . 首先在ADT ...

  4. [转]mysql在已有无分区表增加分区,mysql5.5才有,可以是innodb_file_per_table关闭状态.

    FROM : http://blog.csdn.net/sunvince/article/details/7752662 mysql5.1的时候新增的partition,解决了比较简单的shardin ...

  5. APPLE框架之高效便捷的Repository解决方案

    原文地址:http://perfy315.iteye.com/blog/1460226 Spring Data JPA 转至:http://note.sdo.com/u/855924134/n/P15 ...

  6. 第十章 dubbo线程模型

    一 netty的线程模型 在netty中存在两种线程:boss线程和worker线程. 1 boss线程 作用: accept客户端的连接: 将接收到的连接注册到一个worker线程上 个数: 通常情 ...

  7. 解决ASP.NET中的各种乱码问题

    解决ASP.NET中的各种乱码问题 阅读目录 开始 页面显示乱码问题 AJAX提交的数据乱码问题 JavaScript中正确的URL编码方式 ASP.NET中正确的URL编码方式 正确的URL编码方式 ...

  8. QMUI UI库 控件 弹窗 列表 工具类 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. jquery ajax跨域

    JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问 方法一: jsonp之 getJSON js var ...

  10. C#与Visual Basic的异与同

    C#是一种高级程序设计语言,是一种安全.稳定.简单.优雅的编程语言,它与Visual Basic有很多相同的地方,同时也有很多不同的地方.我们今天这篇博客本着学习C#的原则,着重介绍一下C#与Visu ...