У меня задача написать аннотацию подобную @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 не брезгует... Спасибо.
Особенность спринга в том, что он сам управляет созданием бинов (не вы вызываете конструктор, а Spring). Поэтому он "знает" о каждом созданном в контексте объекте, может управлять его жизненным циклом, оборачивать как угодно объекты и творить свою магию через пост-процессоры.
Чтобы вам повторить это, потребуется реализовать хотя бы минимальный IoC-контейнер, который будет осведомлен о создаваемых экземплярах и имеющий возможность через рефлексию править их поля.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
У меня есть DishesActivity и DishActivityИз DishesActivity я попадаю в DishActivity и при нажатии на кнопку home(back) в тулбаре я попадаю на DishesActivity, но он почему-то пустой