Я играю с идеей использовать подобный подход, который могут сделать классы @Configuration
, который может лениво создавать bean-компоненты с вызовами методов @Bean
и возвращать существующие объекты, если они уже были вызваны. Это делается с помощью прокси CGLib.
Одна интересная особенность заключается в том, что он работает даже при вызове метода сам по себе:
@Configuration
class Config {
@Bean ClassA beanA() {
return new ClassA(beanB());
}
@Bean ClassB beanB() {
return new ClassB();
}
}
Теперь, в моем случае использования, не касающемся конфигурации Spring, я хочу использовать эту возможность для ленивого создания произвольных графов объектов (которые не должны быть Spring Beans), вызывая метод Bean-компонента Builder , который создаст объекты, если они еще не вызваны, и вернет существующие объекты, если они уже были вызваны. А также я хочу использовать возможность самостоятельного вызова методов в одном экземпляре. До сих пор я не мог этого сделать.
Как я могу создавать и улучшать Spring Beans (как прокси-серверы CGLib) , чтобы они могли самостоятельно вызывать методы , аналогично классам @Configuration
, но с моими собственными советами по обработке лени и кеширование?
РЕДАКТИРОВАТЬ: более подробно
Результат, в конце концов, должен выглядеть аналогично приведенному выше примеру конфигурации, но это будет обычный синглтон-компонент Spring:
@Component
@MyBuilder // or some other custom annotation
class MyObjectGraphBuilder {
@Builder ClassA objectA() {
return new ClassA(objectB());
}
@Builder ClassB objectB() {
return new ClassB();
}
}
С добавленной возможностью вызывать исходный метод только один раз и кэшировать результат для любого последующего вызова (, особенно самовывоз ). Выше приведен только пример, таких компонентов может быть много, и они могут быть сложными с перекрестными зависимостями между ними.
Кэширование результатов вызова метода является простым (может быть сделано AOP), но мне нужна возможность самовывоза, которая обычно не поддерживается Spring, если это не класс @Configuration
.
Я подумал, что Spring делает это, улучшая классы @Configuration
bean-компонентами с помощью собственных прокси-серверов CGlib. Тем не менее, это включает в себя много копирования и настройки (например, ConfigurationClassEnhancer, ConfigurationClassPostProcessor и т. Д.), И до сих пор мне не повезло на самом деле заставить его работать с моим пользовательским Post Processor и Enhancer (код слишком длинный, но это в основном копия из упомянутых классов и написание моих пользовательских методов перехватчиков). Поэтому я пытаюсь выяснить, существует ли другой способ.