如何实现春天依赖注入在运行时?

user1094865:

有谁知道什么技术 Spring使用实现依赖注入在运行时?它只需使用方面(AOP),或者是更复杂的东西?

john16384:

春天做了很多的事情,但是依赖注入本身实际上是一个令人惊讶的简单机制。

它开始具有可用于注射类注册表。被添加到该注册表类使用反射检查。一个DI框架将寻找相关的注释和构造,以确定如何构建类的实例以及这些课程可能需要的其他依赖。

注册表还跟踪已创建的实例,使他们能够重新使用。重复使用的实例涉及确定范围,其确定当一个实例可以被重新使用。随着单身(默认为Spring)实例可以被重新使用,不受限制。

创建具有相关类的实例,反射被用来创建一个实例。如果有需要的任何相关性,这些都是第一次创建(如果尚未创建)可能引发大量的递归创建实例的。如果有任何依赖关系无法创建或有多个可能的候选人,这个框架可以抛出一个异常,表明您的配置有问题。

一个简单的例子,假设我们有一个Injector充当类这两个注册表和创建新实例的手段类。

我们注册了几类:

injector.register(Database.class);
injector.register(EmployeeDao.class);

让我们假设数据库类没有进一步的依赖关系,并EmployeeDao对数据库的依赖关系:

class EmployeeDao {
   @Inject Database db;
} 

injector,通过反射的方式,知道EmployeeDao有依赖Database当我们问injector一个实例中EmployeeDao会发生以下情况:

EmployeeDao employeeDao = injector.getInstance(EmployeeDao.class);

如果已经存在的实例1)进行检查,EmployeeDao如果是的话则返回它。

2)如果不是,进行检查,看看有什么需要构建EmployeeDao,它需要一个这种情况Databaseinjector与递归调用自身:

Database database = injector.getInstance(Database.class);

2A)再次,如果的一个实例进行检查,Database已经可用。

2B)有为了需要构建不依赖进一步Database使injector呼叫Database.class.newInstance()和跟踪它。

图2c)一种Database实例被返回。

3)随着Database可用的情况下,injector现在可以构建EmployeeDaoEmployeeDao.class.newInstance()-与反思的帮助下,该场database与注入的Database实例。

4)EmployeeDao例如,现在已经完全注入,则返回。

这是获得类的实例的比较直接的方式,但是这是在核心DI框架,比如Spring是如何工作的。更多先进的功能,需要动态代理和使用AOP的创作,但DI本身归结为自动使用反射来构造实例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用依赖项注入在运行时确定实现

使用Google Guice在运行时注入依赖项

在运行时将接口的不同实现注入命令

如何在运行时控制OSGi中的依赖项注入

如何在运行时使用依赖注入创建新对象

如何使用简单的注入器在运行时更改依赖项

如何使用Google Guice在运行时基于注释注入接口实现

如何使用 Dagger 2 在运行时注入字段?

如何在运行时动态更改依赖项

如何在运行时更改实现

Spring如何在运行时选择接口的实现

在运行时注入值

在运行时更改注入的对象

春天 - 注册在运行时作用域bean

ASP.NET Core依赖项注入:服务在运行时使用Func委托解析

ASP.NET Core依赖注入:在运行时传递参数

温莎城堡在嵌套类中注入依赖项,根接口在运行时解析

在运行时确定Python的实现?

在运行时实现抽象方法?

使用ActivatorUtilities确定在运行时注入哪个实现

DI或Service Locator:在运行时在scala中注入实现(无静态绑定)

在运行时基于提供的依赖关系动态创建Java类的实现

当依赖项需要运行时值时,如何注入依赖项?

依赖注入可解决运行时数据的依赖

如何在运行时在 Angular 组件中注入 CSS 样式表

如何构造函数注入仅在运行时已知的字符串?(温莎古堡)

angular 2-如何在运行时导入/注入组件

如何在运行时使用dagger.android从捆绑中注入参数?

如何在运行时使用JavaScript为网页注入控件?