学习spring ioc的几点建议

写在前面的话
Spring 是一个轻量级的企业级应用开发框架,经年累月的迭代spring已经包含了很多模块。其中包括springBoot,springframework,springdata,springcloud,博主想写一点关于spring全家桶的东西包括spring全家桶技术应用,如何看spring官网学习,如何看spring的源码。但是写博客是个技术活,而且东西比较多,希望我可以坚持下来每天写一点。
本文是基于spring5的知识分析,比如后面的源码、比如官网。如果你看到的源码和官网和博文有出入可能是spring更新了,但是如果时间相差不大讲道理更新的也不多。
认识spring官网
https://spring.io/ 是spring的官网首页,图1

?
红色标记处有四个连接分别是:
projects :spring公司所有的项目,好比apache公司也有很多项目,比如经典的tomcat、struts2、ibatis。点击project可以浏览到spring公司所有的项目,每个项目的文档都非常详细。
guides:教程,比如spring webscocket,spring提供了一个demo,包含了代码供你学习
blog:spring公司每次发布新版本会在这里发布一下博客
search:搜索,站内搜索,博主没用过,猜的。
那么作为学习者该如何通过spring官网来学习spring呢?博主的建议是通过projects这个入口找到对应文档来学习。那么有的程序猿哥哥就会抱怨自己英文水平不好(有道翻译了解一下)。
springIOC文档
点击projects可以看到spring项目所有的项目,那么的IOC的文档在哪里呢?图2

上图可以看到在spring framework项目的介绍里包含了一个叫做dependency injection的模块,也就是依赖注入(DI),所谓的依赖注入就是我们常常说的IOC,关于IOC和DI到底有什么联系?下文有解释。继而点开spring framework连接,看到图3:

Features是介绍springframework项目的所有特性,也可以理解他所包含的模块,其中红色标记地方可以知道我们的DI和AOP的文档包含在Core technologies(核心技术)里面。当然下面还有springMVC和spring webflux的文档,这些我会后续的文章中来分析。点击Core technologies链接图4:
文档一共有9个目录,其中第一个目录就是springIOC的文档,第五个是AOP的文档。现在你可以开始看官方文档来学习springIOC技术了。
关于IOC的一些概念
什么是IOC?
inversion of Contro
控制反转:对对象的实例化控制权反转给容器,是一种编程目标或者标准。比如我们平常对于一个对象的实例化一般是通过手动去new,这样对象的实例化控制权是由应用程序控制的。所谓的反转,即把这种权利反转给一个容器,而应用程序只需要提供对象的类型即可。
为什么要用IOC
第一:对象的实例化不是一件简单的事情,比如对象的关系比较复杂,依赖关系往往需要程序员去维护,这是一件非常头疼的事。
第二:解耦,由容器去维护具体的对象
第三:托管了类的产生过程,比如我们需要在类的产生过程中做一些处理,最直接的例子就是代理,如果有容器程序可以把这部分过程交给容器,应用程序则无需去关心类是如何完成代理的
IOC和DI的关系
诚如前面说的IOC是一种编程目标或者标准,那么如何实现这个目标或者标准呢?可以使用DI(依赖注入)或者DL(依赖查找)当然还有其他的比如依赖拖拽。这就好比你需要找一个女朋友,标准是什么呢?女的活的?那么实现了这些标准的女生有哪些呢?什么刘亦菲啊,唐嫣啊等等。这里的IOC相当于女的活的 ,DI和DL相当于刘亦菲唐嫣 在spring当中实现IOC的这个目标用的就是DI这个技术,至于DL本文不讨论,反正他也能实现IOC
什么是DI
如上文所说DI的全称dependency injection,依赖注入
依赖:对象之间的依赖关系,比如类User中有一个Order类的属性如此我们认为User依赖了Order。
注入:容器把依赖对象填充到被依赖对象的过程叫做注入,比如容器把Order实例化,然后把Order通过各种方式 填充到User类中Order属性的过程叫做注入。这里的各种方式 分为两种方式分别是构造方法注入和setter注入,以后我会详细介绍。
容器 :如何理解容器呢?顾名思义,你可以理解他就是一个能够容纳对象的器皿。在程序中可以体现为一个集合对象,在spring当中这个集合对象就是一个map,后面会详细介绍。
spring的编码风格
为什么会有这个标题?spring不是采用java的语法吗?为什么还有编码风格一说,其实不难理解。比如基于java语法去描述一些元数据可以有多种方法。xml、properties、annotation等等。
举个栗子:程序定义了一个类User
public class User{
private String id;
private String name;
}
?

现在需要把这个类在理论上和数据库中的一张表关联起来,程序改如何体现呢?
?可以定义一个xml用来描述类和表之间的关系,比如hibernate和mybatais就是典型
?可以定义一个properties文件来描述类和表之间的关系
?可以自定义annotation来描述类和表之间的关系,hibernate和mybatis也有这样做
?可以约定好规则,比如类名就是表明,字段名就是字段名,即约定俗成
栗子举完了,回到正题-spring中到底有几种编码风格呢?
Schema-based AOP Support
即所谓的xml风格
Java-based Container Configuration
确切的说是spring3之后才支持的一种风格,即利用java代码编程式风格,简称javaconfig技术
Annotation-based Container Configuration
即所谓的注解风格的编程风格(基于注解的编程风格需要借助xml,javaconfig技术开启支持)
如何选择
这三种风格在spring官网都有相应的文档说明,举个图5栗子吧

?
? ??
这三种风格到底孰优孰劣呢?这个问题就好比问java和php到底哪门语言好?又好比问苍某人的视频和吉尺某人的视频哪个好看一样。知道的人都知道这个和个人的观影心情以及个人审美有关系。但是博主经年累月的开发过程中对xml已经深恶痛绝,只要能不使用xml便不使用。故而后面的文章中大部分代码都是采用注解+javaconfig技术来实现。
再来看看spring官网对于这几种风格如何评价的呢?图6栗子:

?
上面这个栗子是spring官网在解释注解风格编程方式的第一段文字。非常醒目的标题:Are annotations better than XML for configuring Spring?在配置Spring时,注释优于XML吗?下面他做了详细的比较,甚至可以三者混合使用,实际开发中经常都是混合使用的,看不懂的同学有道翻译了解一下。
spring hello world
文档的缺陷
如果你对上面的基本概念都有了了解,可以来尝试采用maven开发一个spring应用程序了,如果对于maven不熟悉,可以自己学一下。
但是在开发一个spring hello程序之前有个很大的问题,pom文件中我们该加入哪些依赖?
这里maven的依赖和上文提到spring中对象依赖不是一个东西
maven的依赖可以理解为jar
?

回到刚刚的问题,如果你想开发一个spring的hello world,我们应该加入哪些依赖呢?spring5提供的文档是一个连接入口图7:

?

点进去之后你可以根据情况选择通过spring官网去帮你构建一个项目,但是他是基于springboot,这点很烦,作为一个新手可能我还不需要用springboot:,图8

?
我找遍了spring5的官网没有看到一个不基于springboot的hello world的demo。那么怎么办?我早些看过spring4的文档,在spring4的springframework的首页注意是首页 和spring4springframework的文档中都有关于如何用maven来构建一个hello world的说明。
springframework首页和spring文档说明
说明是spring framework首页?顾名思义,就是你点spring framework这个项目看到首页,如上面的图7。spring文档?具体的模块,具体的技术文档如上面的图4。
如何看spring4 的文档?图9

?

spring4的文档和5还是有区别的,个人跟喜欢5的文档,比较清晰。
回到正题,在spring4的文档中有一段非常重要的话
If you are using Maven for dependency management you don’t even need to supply the logging dependency explicitly. For example, to create an application context and use dependency injection to configure an application, your Maven dependencies will look like this
?
意思是如果你需要配置依赖注入的程序,仅仅需要加入一个spring-context的依赖便可以了图10

?

为什么加入这个依赖就可以呢?引用spring4文档中的一句话
The Context (spring-context) module builds on the solid base provided by the Core and Beans modules
意思我们的context依赖了bean和core,对于了解过spring的程序员来说,就能解释上面为什么加context一个依赖便可以完成配置依赖注入的问题了。
spring4更适合入门阅读
个人觉得spring5的文档如果你不熟悉springboot可能读来意义不大。举个栗子吧,如上文说的spring三种编码风格,其实在spring5当中的体现比较不直观,但是spring4体现的非常直观,一目了然,引用spring4文档中的一句话
XML-based metadata is not the only allowed form of configuration metadata. The Spring IoC container itself is totally decoupled from the format in which this configuration metadata is actually written. These days many developers choose Java-based configuration for their Spring applications
?
意思spring利用xml来配置元数据,但是不是唯一的一种形式,还运行我们使用java-based(上文所说的javaconfig技术)来配置应用程序。
还有更加直观的说明
?
?

原文地址:https://blog.51cto.com/14760318/2482862

时间: 2024-10-12 19:31:38

学习spring ioc的几点建议的相关文章

菜鸟学习spring IOC有感

 一.spring IOC思想引入 事实上对于刚開始学习的人来说,在学习IOC的时候确实有点困难,主要是掌握其思想方面存在一丢丢的障碍,可是假设可以跨过这个障碍,则可以高速掌握当中的思想了.单从字面上来讲,事实上IOC(反向控制)指的就是控制方向发生了变化.我们常常会遇到这句话:"实现必须依赖抽象,而不是抽象依赖实现."尽管这句话表达了反向控制的概念,可是对于刚開始学习的人来讲,确实不是非常好理解.接下来我们就通过一些实例去理解这些内容的含义. 首先我们创建两个类,一个用于连接数据

学习Spring IoC

1:Spring IoC: Spring IoC是实现Object依赖关系之间松散耦合的机制.要在运行时实现对象的松散耦合和动态绑定,对象依赖项将由其他汇编器对象注入.Spring IoC容器是将依赖项注入对象并使其可供我们使用的程序.我们已经了解了如何使用Spring Dependency Injection在我们的应用程序中实现IoC. Spring IoC容器类的一部分org.springframework.beans和org.springframework.context包.Spring

记录学习Spring(IOC/DI)

根据自己学习的Spring做一些记录,主要是为了方便自己查阅复习. 一.介绍Spring Spring是一个基于IOC和AOP的结构J2EE系统的轻量级框架; 轻量级主要变现为不需要任何的容器就可以直接运行;  IOC 反转控制 是Spring的基础,Inversion Of Control ; 也就是创建对象由以前的程序员自己new 构造方法来调用,变成了交由Spring创建对象 ; DI 依赖注入 Dependency Inject. 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接

Spring框架学习之IOC(一)

Spring框架学习之IOC 先前粗浅地学过Spring框架,但当时忙于考试及后期实习未将其记录,于是趁着最近还有几天的空闲时间,将其稍微整理一下,以备后期查看. Spring相关知识 spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器.可单独使用,通常也与其他框架整合使用,例如SSH.SSM. IOC:控制反转 控制权由对象本身转向容器:由容器根据配置文件去创建实例并创建各个实例之间的依赖关系.等同于DI依赖注入 A

Spring学习之Ioc控制反转(2)

开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------------------------------开始啦啦啦啦啦------------------------------------------------------------------------------- 上一篇博文简单的演示了如何用Spring框架创建bean,注入bean,并使用到

Spring Ioc学习(一)

包含内容:什么是Ioc,作用,bean的创建,方式,配置,集合,作用域,不同作用与的bean依赖等 Ioc控制反转(Inversion of Control) 也被叫作DI依赖注入(Dependency Injection).在程序设计中经常使用到组合的形式,就是在一个类中使用到其他类的对象.Ioc就是用来当这个类实例化时,它里面所使用到的相关对象也会被实例化.实例化的方式有①构造器参数②方法参数③属性. Spring容器启动是通过BeanFactory或ApplicationContext读取

学习spring容器IOC(3)之依赖和依赖注入

学习开涛跟我学spring3 http://jinnianshilongnian.iteye.com/ 为什么要应用依赖注入,应用依赖注入能给我们带来哪些好处呢? 1.动态替换Bean依赖对象,程序更灵活:替换Bean依赖对象,无需修改源文件:应用依赖注入后,由于可以采用配置 文件方式实现,从而能随时动态的替换Bean的依赖对象,无需修改java源文件: 2.更好实践面向接口编程,代码更清晰:在Bean中只需指定依赖对象的接口,接口定义依赖对象完成的功能,通过容 器注入依赖实现: 3.更好实践优

[原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Spring学习之Ioc控制反转(1)

开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------------------------------开始啦啦啦啦啦------------------------------------------------------------------------------- 从开始接触spring起,听到最多的就是Ioc(控制反转)和AOP(面向切面编程