Продолжаем тему метапрограммирования и поговорим о том, как реализовать паттерн проектирования Dependency Injection (DI) с использованием рефлексии. DI позволяет нам разделить зависимости и упростить управление ими, что делает код более чистым и тестируемым.
Пример: Простой контейнер для Dependency Injection
В этом примере мы создадим простой контейнер, который будет автоматически связывать зависимости на основе аннотаций. Для этого нам понадобятся:
1. Аннотация @Inject для пометки полей, которые мы хотим внедрить.
2. Контейнер для обработки аннотаций и создания объектов.
Шаг 1: Создаем аннотацию
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface Inject {}
Шаг 2: Создаем классы с зависимостями
class Service {
public void serve() {
System.out.println("Service is working!");
}
}
class Client {
@Inject
private Service service;
public void doSomething() {
service.serve();
}
}
Шаг 3: Реализуем контейнер для Dependency Injection
import java.lang.reflect.Field;
class DIContainer {
public static void inject(Object obj) {
Class<?> clazz = obj.getClass();
for (Field field : clazz.getDeclaredFields()) {
if (field.isAnnotationPresent(Inject.class)) {
try {
field.setAccessible(true); // Делаем поле доступным
Object dependency = field.getType().getDeclaredConstructor().newInstance(); // Создаем экземпляр зависимости
field.set(obj, dependency); // Внедряем зависимость
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
Шаг 4: Используем наш контейнер
public class Main {
public static void main(String[] args) {
Client client = new Client();
DIContainer.inject(client); // Внедряем зависимости
client.doSomething(); // Вывод: Service is working!
}
}
Как это работает?
1️⃣ Мы создаем аннотацию
@Inject, чтобы пометить поля, которые должны быть внедрены.2️⃣ В классе
Client поле service помечено этой аннотацией.3️⃣ Контейнер
DIContainer проходит по полям класса, ищет аннотацию @Inject, и, если находит, создает объект зависимости и устанавливает его в поле.4️⃣ Когда мы вызываем метод
doSomething, объект Service успешно внедрен, и мы можем использовать его методы.#Java #Метапрограммирование #DependencyInjection
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3❤1