Как написать обработчик аннотации?

292
18 ноября 2017, 09:56

У меня задача написать аннотацию подобную @Value в SpringBoot. Тоесть любое поле аннотированое @Prop("${value}") должно получить значение из properties файла. Вопрос с выгрузкой из properties файла не стоит, но с созданием самой аннотации возникли проблемы.

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Prop {
    String set();
}

Использование:

MyClass {
    @Prop("${value1}")
    private String val1;
    @Prop("${value2}");
    private Integer val2
}

Есть интерфейс который умеет получать проперти из properties файла:

public interface PropertiesLoader {
    get(String key);
}

Как реализовать логику @interface Prop?

Я так понимаю что нужно использовать Reflection API. Что-то вроде:

public class PropHandler {
    public void handle(Object obj) {
        for (Field field : obj.getClass().getFields()) {
            if (field.isAnnotationPresent(Prop.class)) {
                try {
                    final String value = field.get(obj).toString();
                    field.set(obj, new PropertiesLoader().get(value));
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Но тогда придется каждый раз писать new PropHandler().handle(myClassInstance); и в чем тогда удобство. Как правильно создать обработчик аннотации? Так что-бы я мог поставить аннотацию @Prop("${value}") и по ключу из файла значение подтянется. А то что у меня получилось не удобно, проще использовать PropertiesLoader на прямую весь профит от краткости использования аннотаций.

Помогите пожалуйста найти решение. Или понять почему решение через аннотацию здесь не нужно. Хотя Spring не брезгует... Спасибо.

Answer 1

Особенность спринга в том, что он сам управляет созданием бинов (не вы вызываете конструктор, а Spring). Поэтому он "знает" о каждом созданном в контексте объекте, может управлять его жизненным циклом, оборачивать как угодно объекты и творить свою магию через пост-процессоры.

Чтобы вам повторить это, потребуется реализовать хотя бы минимальный IoC-контейнер, который будет осведомлен о создаваемых экземплярах и имеющий возможность через рефлексию править их поля.

READ ALSO
Android: После нажатия на кнопку back не отображаются данные из предыдущей активити

Android: После нажатия на кнопку back не отображаются данные из предыдущей активити

У меня есть DishesActivity и DishActivityИз DishesActivity я попадаю в DishActivity и при нажатии на кнопку home(back) в тулбаре я попадаю на DishesActivity, но он почему-то пустой

252
<%@ include jsp:include с переменной

<%@ include jsp:include с переменной

Делаю таки образомЕсть одна страница main

213
Получение частоты звука

Получение частоты звука

Вот у меня есть3gpp файл, и я знаю путь к нему в виде String

242