文档章节

简化你的 Java 对象依赖关系

空谷幽兰_
 空谷幽兰_
发布于 2016/04/21 17:36
字数 1019
阅读 151
收藏 3

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

前言

以上这段是引用自维基百科的解释。在采用面向对象方法设计的系统中,所有的对象通过彼此间的合作,最终实现业务逻辑。所谓的控制反转,即是将我们代码里面需要实现的依赖对象创建及销毁工作交给一个容器来实现。Spring 框架的 IOC 是比较知名,也是应用较广泛的一个实现。之前花了段时间研究了下它的代码,然后为了好玩儿,自己造了一个简单轮子。

可能会有人问,你为什么又重复造轮子呢,已经有 Spring 框架可以用啦。我倒不认为重复造轮子是不好的,知道怎么造轮子,并且把轮子造出来对解决开发中遇见的问题是非常有帮助的。因为你知道它怎么实现的,自然就知道去哪里找解决问题的办法。我认为学习一个技术,不仅仅止步于用得熟练,更应该深究其原理和实现,从中得到启发就更好了。先透露下,我后面会再分享另外一个轮子叫 sunflower-mvc,很轻量级的一个框架,也会加入一些最佳实践,非常适合写 API应用。下面就进入今天的主题:

实现

今天我们要使用的方法便是依赖注入中的基于注解和set函数的方式。大致分为以下几个步骤:

  1. 定义注解类;
  2. 扫描指定包路径下的类;
  3. 分析注解和依赖关系并创建对象,注入依赖;
  4. BeanFactory 开放获取类实例的函数;

定义注解类

首先,我们定义两个注解@Bean@Resource,前者用于标注一个对象需要容器管理,后者用于标注所依赖的对象。注解@Bean的值不允许为空,@Resource的值可以为空(则使用字段名称)。至于关于注解的语法,请自行查询相关资料。

扫描类

然后就是扫描指定包下的类,这段代码比较长,从 Spring 源码中直接拿过来复用的。总结来说,通过递归扫描指定包路径下的文件把你要进行依赖注入的所有Class加入一个Set集合中,后面会遍历这个集合并分析每个类的依赖关系。

依赖注入

接下来是分析注解和依赖并创建对象,注入依赖。

遍历类集合,如果检测到有@Bean注解则实例化对象存放到Map中,然后继续扫描该类下的所有field,如果发现@Resource注解则记录依赖值Map中。 然后遍历依赖关系Map,进行依赖注入。

BeanFactory

再提供一个函数用于从工厂中获取Bean对象。

测试

在com.mlongbo.sunflower.ioc.bean包中定义两个Bean: 最后再写个例子单元测试下:

结尾

至此,大功告成~ 如果有错误和需要完善的地方还请指正,也欢迎你到Github参与讨论。完整代码请查看 GitHub仓库

点击 {链接},访问项目主页。


扫描二维码,关注我。

内容大多会是后端技术、前端工程、DevOps,偶尔会有一些大数据相关,会推荐一些好玩的东西。希望你会喜欢~

长按二维码关注我

一切,源于喜欢。

© 著作权归作者所有

空谷幽兰_
粉丝 23
博文 26
码字总数 17072
作品 0
海淀
程序员
私信 提问
[敏捷JAVA读书笔记-java基础部分] 第一章

今年年初到海淀图书城购买了一个Agile Java(敏捷java),匆匆翻看了几章就束之高阁,最近在班车上无事可做,拿出来重读一下,一方面学一下TDD,一方面梳理一下自己的JAVA基础知识,读书的时间...

穿越星辰
2010/05/13
84
0
依赖、关联、聚合和组合及其之间区别的简单理解

在java以及其他的面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖、关联、聚合、组合、继承、实现。他们的耦合度依次增强。 1. 依赖(Dependence) 依赖关系的定义为:对于两...

嘿嘿嘿IT
03/21
0
0
Spring源码剖析开篇:Spring概述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/73033273 欢迎阅读完整的专栏博客内容:Spring源码解析 本文首发于我的个人公众号:...

你的猫大哥
2017/06/11
0
0
对JDBC的支持 之 7.1 概述

概述 JDBC回顾 传统应用程序开发中,进行JDBC编程是相当痛苦的,如下所示: //cn.javass.spring.chapter7. TraditionalJdbcTest @Test public void test() throws Exception { Connection co...

heroShane
2014/02/27
0
0
第三章 spring-bean之DefaultSingletonBeanRegistry(3)

前言 SingletonBeanRegistry是一个非常重要的接口,用于注册,获得,管理singleton对象。 SingletonBeanRegistry目前唯一的实现是DefaultSingletonBeanRegistry,DefaultSingletonBeanRegis...

鸟菜啊
2018/07/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

编程语言王国的唯一王者

在撰写本文前,我搜索了“我应该学习哪种编程语言”这个词条,发现会产生5.17亿个结果。而每个页面都在滔滔不绝地介绍某种语言相对于其他语言的优势,其中90%会推荐Python或JavaScript。 恕...

京东云技术新知
23分钟前
3
0
Dota2锁区steam下载国际服办法

Dota2锁区steam下载国际服办法 直接访问Dota2的steam地址下载即可 http://store.steampowered.com/app/570/Dota_2/?cc=us...

我爱吃炒鸡
26分钟前
2
0
多个参数拼接成的字符串转成json对象,参数循序会变

太坑爹了。 生成签名方法要根据参数排序,然后多个参数拼接成字符串传递到服务端,转为JSON对象,传入签名算法API中,JSON对象的参数顺序和字符串里面的参数顺序不一致,导致生成的签名一直和...

太猪-YJ
27分钟前
2
0
Aspose.Cells for .NET v19.6发布上线!支持绘图切片机功能!

Aspose.Cells for .NET是一个Excel电子表格编程API,可加快电子表格管理和处理任务。通过集成API,开发人员可以执行的一些基本任务,如管理多个工作表,从头创建电子表格内容和样式,从不同数...

mnrssj
30分钟前
1
0
泛型

1、泛型接口的定义和基本使用 (定义泛型接口) package com.yxs.demo.dao;public interface Demo<T> { public abstract void show(T t);} (2)、泛型接口的实现 泛型接口的是是实现有...

一对二
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部