1. 设计注解
- 定义一个用于标识需要注入对象的注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface InjectObject {
}
@Retention(RetentionPolicy.RUNTIME)
表示该注解在运行时可用,这样框架在运行时可以通过反射获取到注解信息。
@Target(ElementType.FIELD)
表示该注解只能用于字段上,说明我们将在类的字段上标识需要注入的对象。
2. 实现依赖注入框架
- 创建一个容器来管理对象实例
import java.util.HashMap;
import java.util.Map;
public class ObjectContainer {
private static final Map<Class<?>, Object> objectMap = new HashMap<>();
public static <T> void register(Class<T> clazz, T instance) {
objectMap.put(clazz, instance);
}
public static <T> T get(Class<T> clazz) {
return (T) objectMap.get(clazz);
}
}
ObjectContainer
类使用一个 Map
来存储已注册的对象实例,register
方法用于向容器中注册对象,get
方法用于从容器中获取对象。
- 实现依赖注入逻辑
import java.lang.reflect.Field;
public class DependencyInjector {
public static void inject(Object target) {
Class<?> clazz = target.getClass();
for (Field field : clazz.getDeclaredFields()) {
if (field.isAnnotationPresent(InjectObject.class)) {
field.setAccessible(true);
try {
Class<?> fieldType = field.getType();
Object instance = ObjectContainer.get(fieldType);
if (instance != null) {
field.set(target, instance);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
DependencyInjector
类的 inject
方法接收一个目标对象。
- 通过反射获取目标对象的所有字段,检查是否有
InjectObject
注解。
- 如果有,尝试从
ObjectContainer
中获取该字段类型对应的实例,并通过反射将实例注入到目标对象的字段中。
3. 使用示例
- 定义一些示例类
public class ExampleService {
public void sayHello() {
System.out.println("Hello from ExampleService!");
}
}
public class ExampleController {
@InjectObject
private ExampleService exampleService;
public void doSomething() {
if (exampleService != null) {
exampleService.sayHello();
}
}
}
- 使用框架进行依赖注入
public class Main {
public static void main(String[] args) {
ExampleService service = new ExampleService();
ObjectContainer.register(ExampleService.class, service);
ExampleController controller = new ExampleController();
DependencyInjector.inject(controller);
controller.doSomething();
}
}
- 在
main
方法中,先注册 ExampleService
到 ObjectContainer
中。
- 创建
ExampleController
实例,并调用 DependencyInjector.inject
方法进行依赖注入。
- 最后调用
controller.doSomething
方法,此时 exampleService
字段应该已经被正确注入。