IoC容器Autofac(3) - 理解Autofac原理,我实现的部分Autofac功能(附源码)

简介:

上篇文章中,举了一个Autofac的简单例子,园友eflay反应:

“虽然对autofac架构原理还是完全不懂,不过基本是明白ioc的用途了,会从已注册的类中找出符合接口的类来调用构造函数进行构造”

所以这篇文章,还是针对上次的例子,不引用Autofac,完全使用自己写的FakeAutofac, 也让Demo运行起来.

由于本篇文章和以前文章关联度很高,源代码也是从以前的演化过来的。没有看过以前文章的园友,麻烦移步这里, 下载第二篇的源代码,思考一下如何实现例子中Autofac使用到的功能。

IoC容器Autofac(1) -- 什么是IoC以及理解为什么要使用Ioc

IoC容器Autofac(2) - 一个简单示例(附demo源码)

这里是本文相关的源代码 AutofacDem0(1).zip, 源代码主要涉及的知识有反射,泛型,委托。

这篇文章本人没有把握能够把所有的东西都讲的非常浅显易懂, 不过好在有源代码, 代码量不大,加有很多注释,大家可以对比理解一下。

如果对源代码有任何建议和问题,可以留言或者写在评论里,我尽量回复和解答。

 

阅读目录:

一. 开始前的分析

二. 实现过程中遇到的一些难点

三. 总结

一、开始前的分析

我们主要使用到了Autofac中的类和方法:

类ContainerBuilder中的方法:

RegisterType<T>()//注册类型T

AsImplementedInterfaces()//表示注册的类型,以接口的方式注册

Build()//创建一个容器

 

接口IContainer的方法:

Resolve<T>()//从容器中取出一个T类型的实例

 

这里是类图:

二、实现过程中遇到的一些难点

注册类型可以使用集合类来保存,当需要某种类型的实例的时候,可以使用反射调用构造函数直接构造该类型的实例。

这样看起来还蛮简单的,但是还有一些难点, 大家在看源代码的过程中,可以带着这些问题看看是如何解决这些问题的。

1. 如何实现AsImplementedInterfaces()方法?

这个方法的作用是,指定注册类型以接口形式存在, 比如,

当我运行了下面代码后

builder.RegisterType<ListMovieFinder>().AsImplementedInterfaces(); //以类ListMovieFinder的接口IMovieFinder注册

那么我使用 Resolve<IMovieFinder>()要获取一个接口实例的时候,会返回一个ListMovieFinder的实例

 

2. 如何实现对同一个类型的注册,后面的覆盖前面的注册, 如源代码中:

builder.RegisterType<ListMovieFinder>().AsImplementedInterfaces();
builder.RegisterType<DBMovieFinder>().AsImplementedInterfaces();

 后面的DBMovieFinder会覆盖掉ListMovieFinder的注册

这样,当我调用 Resolve<IMovieFinder>()要获取一个接口实例的时候,会返回一个DBMovieFinder的实例

3.当用反射调用构造函数的时候,如果构造函数中有参数,这些参数也由Autofac构造。

比如,当我们Resolve<MPGMovieLister>()想获取MPGMovieLister实例的时候, MPGMovieLister的构造函数需要一个IMovieFinder类型的参数,如何这个参数也由Autofac创建?

 

 三、总结

源代码只是模仿Autofac的一部分功能,只能算是Autofac现有功能中的九牛一毛了。

直接使用别人写好的框架,自然是最简单不过的。 但是通过自己动手写源代码模仿Autofac的实现,自己学到更多,同时写非常感谢那些做开源框架和产品的开发者。

感谢园友eflay, 因为这个,我才有了这个想法,期间几次想放弃写这篇文章,但是"知其然还要知其所以然"的想法又让我坚持了下去。

 

希望源代码和文章能够对大家有所帮助。

本文相关源代码: AutofacDem0(1).zip

相关文章:

IoC容器Autofac(2) - 一个简单示例(附demo源码)

IoC容器Autofac(1) -- 什么是IoC以及理解为什么要使用Ioc

理解为什么要使用Ioc

分析Autofac如何实现Controller的Ioc(Inversion of Control)



本文转自JustRun博客园博客,原文链接:http://www.cnblogs.com/JustRun1983/archive/2013/03/24/2978597.html,如需转载请自行联系原作者


目录
相关文章
|
6月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
6月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
673 2
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
11月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
291 18
|
运维 持续交付 虚拟化
深入解析Docker容器化技术的核心原理
深入解析Docker容器化技术的核心原理
387 1
|
6月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
730 6
|
6月前
|
监控 Linux 调度
【赵渝强老师】Docker容器的资源管理机制
本文介绍了Linux CGroup技术及其在Docker资源管理中的应用。通过实例演示了如何利用CGroup限制应用程序的CPU、内存和I/O带宽使用,实现系统资源的精细化控制,帮助理解Docker底层资源限制机制。
613 6