什么是DI
DI是Dependency Injection的简称,翻译过来就是“依赖注入”。熟悉java开发的同学都会接触到这个概念,在spring、guice等框架中均是一个基本概念。依赖注入所作的事情就是,在程序运行时为类的变量赋予实例。DI解决了代码分层开发,层次之间的代码解耦问题。与DI相伴生的概念是IOC,他们是同一事物的不同方面的阐述。
如何实现DI
如果我们编写的代码中,没有为类的变量创建实例,那么就要想办法在程序运行时为变量赋值。我目前能想到的方法就是利用java的reflect机制,利用反射在类加载过程中为变量赋值。对于一个项目工程,我们设计时知道哪些类的变量需要注入实例,而选择在类加载时为其创建指定的实例并赋值给特定的变量,但是这样会出现因人而异,导致代码设计的混乱,代码的质量太差而且不可复用。如何让程序自己知道哪些类的哪些变量需要进行DI,最好的方法就是做标记,java提供的Annotation技术能够很好的完成这个任务。利用注解,我们可以为变量打上标记,java程序能够识别这些注解,java的反射机制提供了获取注解的API,我们可以很好利用这点。利用java的反射和注解技术,我们可以在程序运行时对指定的package路径下的被标记的一些类进行加载,在加载过程中创建实例对象赋给被标记的变量。这种方式,将其完善就可以复用,其就形成一套框架技术。
示例
简单的代码模拟实现java的DI。
简单的注解:
@Target(ElementType.TYPE)
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MyComponent {
}