Spring4--课程笔记1

Spring概述:

  

  Spring框架:

  Spring 由 20 多个模块组成,它们可以分为数据访问/集成(Data Access/Integration)、Web、面向切面编程(AOP,  Aspects)、应用服务器设备管理(Instrumentation)、消息发送(Messaging)、核心容器(Core Container)和测试(Test)。 

  Spring的特点:

    1. 非侵入式:

      所谓非侵入式是指,Spring 框架的 API 不会在业务逻辑上出现,即业务逻辑是 POJO(Plain Old  Java  Objects)。由于业务逻辑中没有 Spring 的 API,所以业务逻辑可以从 Spring 框架快速的移植到其他框架,即与环境无关。

    2. 容器:

      Spring 作为一个容器,可以管理对象的生命周期、对象与对象之间的依赖关系。可以通过配置文件,来定义对象,以及设置与其他对象的依赖关系。

    3. IoC:

       控制反转(Inversion  of  Control),即创建被调用者的实例不是由调用者完成,而是由Spring 容器完成,并注入调用者。当应用了 IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。即,不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。  
    4. AOP:

       面向切面编程(AOP,Aspect Orient Programming),是一种编程思想,是面向对象编程OOP 的补充。很多框架都实现了对 AOP 编程思想的实现。Spring 也提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如日志和事务管理)进行开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。我们可以把日志、安全、事务管理等服务理解成一个“切面”,那么以前这些服务一直是直接写在业务逻辑的代码当中的,这有两点不好:首先业务逻辑不纯净;其次这些服务被很多业务逻辑反复使用,完全可以剥离出来做到复用。那么 AOP 就是这些问题的解决方案,可以把这些服务剥离出来形成一个“切面”,以期复用,然后将“切面”动态的“织入”到业务逻辑中,让业务逻辑能够享受到此“切面”的服务。

Spring与IoC:

   控制反转(IOC,Inversion of Control),是一个概念,是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,从程序代码本身反转到了外部容器。但是,需要注意,IoC 也是有局限性的,其不能使用在分布式系统中。即其所依赖的反转到的外部容器,必须要与控制权出让方同处于一个 JVM 中。

   IoC 是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式有两种:依赖注入和依赖查找。依赖注入方式应用更为广泛。  
    依赖查找:Dependency Lookup,DL,容器提供回调接口和上下文环境给组件,程序代码则需要提供具体的查找方式。比较典型的是依赖于 JNDI 系统的查找。
    依赖注入:Dependency  Injection,DI,程序代码不做定位查询,这些工作由容器自行完成。
    依赖注入 DI 是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。Spring 的依赖注入对调用者与被调用者几乎没有任何要求,完全支持 POJO 之间依赖关系的管理。 依赖注入是目前最优秀的解耦方式。依赖注入让 Spring 的 Bean 之间以配置文件的方式组织在一起,而不是以硬编码的方式耦合在一起的。
   Spring的DI的底层实现原理:

    Spring DI =  工厂  +  反射  +  配置文件  
    传统开发中的面向抽象编程,调用者与接口实现类是紧密耦合在一起的。若实现类发生改变,则必须修改原有代码:在调用者类中将实现类进行更换。但,这不符合软件开发的 OCP 原则(OCP,Open-Close Principle)。  
    OCP 原则,即开闭原则,指软件实体(类、模块、功能等)应该可以被扩展,但不可被修改。即对功能扩展是开放的,对已有代码修改是关闭的。也就是说,应该在不修改现有代码的基础上,扩展新功能。  
    若要使调用者类与接口实现类之间实现解耦,可使用工厂模式。但,这又使调用者与工厂耦合,工厂与接口实现类耦合。实现类的更换,不需要修改调用者类,但需要修改工厂,即代码仍需重新编译。  
    此时,可以通过在工厂类中使用“反射  +  配置文件”的方式来加载接口实现类。而这就是 Spring 的 IoC 的工作原理。

时间: 2024-08-02 23:30:57

Spring4--课程笔记1的相关文章

《nodejs+gulp+webpack基础实战篇》课程笔记(四)-- 实战演练

一.用gulp 构建前端页面(1)---静态构建 npm install gulp-template --save-dev 通过这个插件,我们可以像写后台模板(譬如PHP)一样写前端页面.我们首先学习一下写法. 现在我们创建一个新任务:创建一个裸的index.html文件,然后在body里面写上 ,我的年龄是:<%= age %> 下载好gulp-template,我们引用并配置 var gulp_tpl = require("gulp-template"); gp.tas

Linux操作系统及应用课程笔记 索引

第0部分  软件的安装与配置 Linux下软件的安装与配置 第1部分*   绪论 第2部分*  Linux的安装过程 第3部分   系统Shell和常用命令 Shell文件相关常用命令及参数总结 Linux下常用命令 第4部分  VI编辑器 Linux下vi编辑器的使用 <<学习vi和vim编辑器>>1 <<学习vi和vim编辑器>>2 第5部分  Shell脚本 Shell入门之脚本管理 Shell入门之测试操作 Shell入门之条件循环 Shell入门之

Andrew Ng机器学习课程笔记(五)之应用机器学习的建议

Andrew Ng机器学习课程笔记(五)之 应用机器学习的建议 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7368472.html 前言 学习了Andrew Ng课程,开始写了一些笔记,现在写完第5章了,先把这5章的内容放在博客中,后面的内容会陆续更新! 这篇博客主要记录了Andrew Ng课程第五章应用机器学习的建议,主要介绍了在测试新数据出现较大误差该怎么处理,这期间讲到了数据集的分类,偏差,方差,学习曲线等概念,帮

JAVA课程笔记_1

一 课程内容 set path查看路径信息:当编译一个程序或命令时,先从当前目录查找,如果没有,按path中的路径按顺序查找,先找到后就不查找后面的路径了. 可以将目录加入环境变量,set path="复制的路径" 可以在.java程序中编写多个类,当编译时,每个类生成各自的字节码文件. 由于多个类的字节码文件不利于管理,使用bin目录下的jar命令可以将多个字节码文件打包成jar包发布给其他程序员使用. 使用方法:先在命令提示符下输入jar,会出现使用方法和实例.Jar打包两个cla

Django开发BBS---51网络课程笔记(目录)

这是51cto中bbs课程中的一个项目,这里写一下每节的目录: Django开发BBS---51网络课程笔记(1) 这部分主要介绍了数据库的搭建及站点管理 http://4440271.blog.51cto.com/4430271/1663863 Bootstrap开发 这不分主要讲前端的设计 http://4440271.blog.51cto.com/4430271/1663934 Django开发BBS---51网络课程笔记(2) 这部分主要讲view与前端的衔接部分 http://4440

跟我学《JavaScript高程3》第三讲,课程笔记

跟我学<JavaScript高程3> 第三讲:第4章 课程制作:bling,兴哥,5年Java,3年前端 课程知识:JavaScript.Html.Css 课程目标:前端体系课程,逐步深入,找到一份前端工作    课程大纲:本书目录结构 适合人群:前端初学者,可以0基础,但要认真,踏实 课程回顾 1.数据类型:5种基本类型,1中复杂类型. 2.操作符:需要注意运算优先级,算关逻条赋逗. 3.语句:if-else.for.for-in.while 4.函数:函数定义,目前的两种方法 补充:变量在

【课程笔记】需求挖掘与分析

*…* 产品定位与分析有三部分内容:需求分析.用户调研.市场分析. 下面是前两部分内容的课程笔记,整理成思维导图.

(转)妙味课堂—JavaScrip中级课程笔记

DOM基础概念.操作 DOM的概念及节点类型 childNodes children nodeType attributes 子节点和兄弟节点的操作 firstChild firstElementChild lastChild.lastElementChild nextSibling.previousSibling 父节点 parentNode offsetParent 元素位置宽高 offsetLeft.offsetTop offsetWidth.offsetHeight getPos() 操

Android网络项目课程笔记-----Volley框架

Volley 问题原因: Android4.x版本和2.x对AsyncTask的机制不同 2.x之中,同时执行5个,4.x同时只有一个 解决思路: 1) 使用Thread + Handler 注意: 使用线程池 2) 定制AsyncTask线程池 3) 开源框架Volley 1. 检查网络 2. 退出 3. 总结 有待改进 做的比较好的 商业级项目: 1) 稳定性   不要轻易FC    运行时异常 2) 用户体验:流畅(性能)/美观 3) 可扩展性 4) 可读性 5) 异常流程:提示 + 指导

Android网络项目课程笔记-----计划

目标:好用 充分:1) 角色完整 产品经理   灵魂 美工  交互设计师 开发   架构师 开发者 测试 小部分用户 2) 运营推广 基础:能用 必须: 1) API   框架 2) 模块(一个功能集合) * 3) 业务流程 4) bug 具备解决大部分中等难度bug的能力 5) 自学新技术的能力 6) 阅读代码 不合格:1) 做不了,有难度.需要很长时间 2) 只是做了,对过程负责.对结果不负责 3) 只是掌握了某个功能的基本实现方法,一旦出了bug, 解决效率很低 4) 没做过,没把握 合格