文档章节

springIOC概念快速入门

1#~~
 1#~~
发布于 2016/11/17 18:36
字数 915
阅读 22
收藏 0
点赞 0
评论 0

我的学习方式是,学习一个东西,得有一个整体的框架,不然,我会受不了总是模仿着demo程序而不知道这个黑箱子里头到底是什么鬼的状态,这样简直让人抓狂。如果,你也像我这样,建议多看一些博客,有个总体的概览。这篇文章,讲解我在初学spring时,哪些令我抓狂的概念。

  1. 依赖
  2. 工厂与容器

这就是这里要围绕讲解的两个内容。

                                                                                                                

为什么要理解依赖。刚接触spring,我们最开始接触的术语,应该是 “控制反转ioc(inversion of control”);

具体怎么理解控制反转,我觉得即使解释也很难理解。有些书里也说了,某某人提出了一个更容易理解的概念。ioc=ID(injection dependency )依赖注入。意思是说,一个类中,依赖于其他类的“关系”,采用注入的形式,而不是采用 在“”类中自己编码实现“”的形式 来完成依赖关系。

依赖注入:组件之间的依赖关系由容器在运行期决定 ,由容器动态的将某种依赖关系注入到组件之中 。 

依赖:依赖是一种 域对象 间的关系。与之相似的概念有 “关联”,"聚合”等。深入学习,可以去看 《UML统一建模语言指南》。这里举一些例子来讲解。

//这里不是依赖
public class Cat{
	Foot foot;
	Head head;
	Body body;	//组合
}
public class ClassOne{
	List<Student> studentList;	//聚合
	String className;
}
public class Order{
	String orderId;
	Product product;
	Int num;
	Customer customer; //关联
}

好吧,这几个跟依赖没有关系。

public class StudentService{
	StudentDao dao = new StudentDaoImpl();
	public Student getStudentById(int id){
		dao.getStudentById(id);				//依赖
	}
}

这是依赖的一种,spring中的依赖不完全等同于UML中的依赖,它将泛化的关系也当做依赖关系。

主要想要表达的是:

  1. 依赖,是一种域对象之间的(引用)关系。
  2. 依赖,在没有ioc概念出现之前,是通过手动的在类中创建如上例中,dao的创建,且dao的实现必须是确定的。
  3. spring中,依赖通过“容器”来注入。(实际上其他很多ioc容器也都使用反射来实现依赖注入)

                                                                                                                                                

你可能听到这么一句话,spring就是一个大的工厂。那么,代码层面上,是怎么体现工厂的特性的呢。

首先来回顾下,我们以前用过的工厂。

session=SessionFactory.open();
someObj=(AType)applicationContext.getBean("beanName");
object=beanFactory.getBean(object.Class);

public  class MyFactory{
	public person createPerson(){
		person=new Person();
		returne person;
	}
}
persn=(new MyFactory()).createPerson();

无非就是一个工厂的类,加一个工厂方法(静态或非静态,有参数或无参,但一定都有返回值);

而常说的spring中的ioc容器,也就是一个工厂,一个容器。

说是工厂,所以接口必须定义成:

public interface BeanFactory{
	<T> getBean(args...)       //这就是我要的工厂方法
}

而说是容器,是因为一个工厂,必须有原料啊。但这个接口并没有装原料的地方啊。

而我们常用的类是ClassPathXMLAppliactionContext ,这个是这个工厂接口的某一级子类。

public class ClassPathXMLAppliactionContext{
	Map BeanMap;			//一些实体
	Map BeanDefination;		//实体的依赖关系的描述信息
	<T> getBean(args...)	//采用上述两种材料来组装出目标的 Bean;
}

然而,这个容器中,不仅包含了生产实体的原材料,还包含一些环境,所以名称中叫Context也是有环境的意义在里面的吧。

© 著作权归作者所有

共有 人打赏支持
1#~~
粉丝 0
博文 2
码字总数 1274
作品 0
深圳
Docker容器的快速入门

Docker容器的快速入门 Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 ...

zhaoliang1131 ⋅ 2017/01/19 ⋅ 0

从零到专业,程序员快速入门Python的3种方法!

Python作为一门网红编程语言,这一阵子也红的发紫。 有不少的程序员表示,对这门编程语言非常感兴趣。所谓人生苦短,人生苦短我用python。 从零到专业,程序员快速入门Python的3种方法! 不过...

W3Cschool ⋅ 2017/12/19 ⋅ 0

我是如何学习git

一开始学习git的时候,网上的git教程很多,看得人眼花缭乱,不知道如何下手。现在对git已经很熟悉了,回过头来总结一下学习方法。 一般官方文档是最全面,但是不一定适合快速上手。我们可以学...

好好编程 ⋅ 2017/11/14 ⋅ 0

机器学习 人工智能 博文链接汇总

115 [入门问题] [TensorFlow] [深度学习] [好玩儿的算法应用实例] [聊天机器人] [神经网络] [机器学习] [机器学习算法应用实例] [自然语言处理] [数据科学] [Python] [Java] [机器学习--初...

aliceyangxi1987 ⋅ 2017/05/13 ⋅ 0

《Linux云计算从入门到精通》系列实战笔记全放送

为了方便Linux云计算爱好者的学习查看,马哥Linx云计算团队特别整理了《Linux云计算从入门到精通》年度重磅大放送,囊括了整个学习过程的学习精华,内容全部由马哥Linux云计算学员撰写,欢迎...

898009427 ⋅ 2017/11/21 ⋅ 0

spring技术内幕读书笔记之IoC容器的学习

第一篇:概念和设计原理 IoC容器的实现作为Spring的核心内容之一非常有必要拿来研究一下 1、概念 IoC(Inversion of Control,控制反转)必须思考的问题:哪些方面的控制被反转了? 对于这个...

CTO搬砖达人 ⋅ 2017/08/03 ⋅ 0

服务器端多线程异步处理的问题,希望大牛路过来看看

最近老是看到服务器端多线程异步处理很流行,但是我只是有一个模糊的概念,有没有可以快速入门的小服务器端源码,主要含有多线程异步处理的场景,麻雀虽小但五脏俱全的那种

mubing_s ⋅ 2013/05/03 ⋅ 4

Swift 1.1语言第7章 函数和闭包

Swift 1.1语言第7章 函数和闭包 在编程中,随着处理问题的越来越复杂,代码量飞速增加。其中,大量的代码往往相互重复或者近似重复。如果不采有效方式加以解决,代码将很难维护。为了解决这个...

大学霸 ⋅ 2014/10/16 ⋅ 0

大数据怎样才能踏入进去?年薪60万大数据架构师教你如何入门!

1.Linux基础和分布式集群技术 学完此阶段可掌握的核心能力: 熟练使用Linux,熟练安装Linux上的软件,了解熟悉负载均衡、高可靠等集群相关概念,搭建互联网高并发、高可靠的服务架构; 学完此...

董黎明 ⋅ 06/09 ⋅ 0

spring Aspect 疑问

spring Aspect 是不是只对springIOC注册的bean生效,还有那些情况下 切面无效?

铽忒 ⋅ 06/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Greys Java在线问题诊断工具

Greys是一个JVM进程执行过程中的异常诊断工具。 在不中断程序执行的情况下轻松完成JVM相关问题排查工作 目标群体 有时候突然一个问题反馈上来,需要入参才能完成定位,但恰恰没有任何日志。回...

素雷 ⋅ 20分钟前 ⋅ 0

git从远程仓库拉取代码的常用指令

一种(比较麻烦的)拉代码的方法 git clone //克隆代码库,与远程代码库的主干建立连接,如果主干已经在就不用再clone啦,克隆路径为当前路径下的新创建的文件夹 git checkout -b //本地建立...

Helios51 ⋅ 35分钟前 ⋅ 0

005. 深入JVM学习—Java堆内存参数调整

1. JVM整体内存调整图解(调优关键) 实际上每一块子内存区域都会存在一部分可变伸缩区域,其基本流程:如果内存空间不足,则在可变的范围之内扩大内存空间,当一段时间之后,内存空间不紧张...

影狼 ⋅ 39分钟前 ⋅ 0

内存障碍: 软件黑客的硬件视图

此文为笔者近日有幸看到的一则关于计算机底层内存障碍的学术论文,并翻译(机译)而来[自认为翻译的还行],若读者想要英文原版的论文话,给我留言,我发给你。 内存障碍: 软件黑客的硬件视图...

Romane ⋅ 今天 ⋅ 0

SpringCloud 微服务 (七) 服务通信 Feign

壹 继续第(六)篇RestTemplate篇 做到现在,本机上已经有注册中心: eureka, 服务:client、order、product 继续在order中实现通信向product服务,使用Feign方式 下面记录学习和遇到的问题 贰 or...

___大侠 ⋅ 今天 ⋅ 0

gitee、github上issue标签方案

目录 [TOC] issue生命周期 st=>start: 开始e=>end: 结束op0=>operation: 新建issueop1=>operation: 评审issueop2=>operation: 任务负责人执行任务cond1=>condition: 是否通过?op3=>o......

lovewinner ⋅ 今天 ⋅ 0

浅谈mysql的索引设计原则以及常见索引的区别

索引定义:是一个单独的,存储在磁盘上的数据库结构,其包含着对数据表里所有记录的引用指针. 数据库索引的设计原则: 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索...

屌丝男神 ⋅ 今天 ⋅ 0

String,StringBuilder,StringBuffer三者的区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 首先说运行速度,或者说是, 1.执行速度 在这方面运行速度快慢为:StringBuilder(线程不安全,可变) > StringBuffer...

时刻在奔跑 ⋅ 今天 ⋅ 0

java以太坊开发 - web3j使用钱包进行转账

首先载入钱包,然后利用账户凭证操作受控交易Transfer进行转账: Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/Credentials credentials = Wallet......

以太坊教程 ⋅ 今天 ⋅ 0

Oracle全文检索配置与实践

Oracle全文检索配置与实践

微小宝 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部