有谁知道什么技术 Spring使用实现依赖注入在运行时?它只需使用方面(AOP),或者是更复杂的东西?
春天做了很多的事情,但是依赖注入本身实际上是一个令人惊讶的简单机制。
它开始具有可用于注射类注册表。被添加到该注册表类使用反射检查。一个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
,它需要一个这种情况Database
。在injector
与递归调用自身:
Database database = injector.getInstance(Database.class);
2A)再次,如果的一个实例进行检查,Database
已经可用。
2B)有为了需要构建不依赖进一步Database
使injector
呼叫Database.class.newInstance()
和跟踪它。
图2c)一种Database
实例被返回。
3)随着Database
可用的情况下,injector
现在可以构建EmployeeDao
:EmployeeDao.class.newInstance()
-与反思的帮助下,该场database
与注入的Database
实例。
4)EmployeeDao
例如,现在已经完全注入,则返回。
这是获得类的实例的比较直接的方式,但是这是在核心DI框架,比如Spring是如何工作的。更多先进的功能,需要动态代理和使用AOP的创作,但DI本身归结为自动使用反射来构造实例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句