我想创建一个自定义接口来注入这样的属性。。。
interface Property<T> { T get(); }
然后我想设置 get()
使用自定义注解调用,如。。。
@interface Key { String name(); String fallback() default ""; }
然后在我的应用程序中使用这个,比如。。。
@key(name = "my.string.property", fallback = "some default value")
Property<String> myStringProperty;
@key(name = "my.number.property", fallback = "1")
Property<Integer> myNumberProperty;
我们之所以要这样做,而不是使用 @Value
注解是用一个新的propertychanged事件将这些对象挂接到预先存在的系统事件中,该事件可以更新 get()
方法(我们还将在运行分布式系统时持久化这些更新,该系统可以随时创建新节点),并且还将在我们的uis系统管理页面中公开这些属性。
我已经设法让这项工作的领域与我的自定义注解注解使用 ReflectionUtils#doWithFields
从我自己实现的 BeanPostProcessor#postProcessBeforeInitialization
. 这更像是一种黑客行为,因为spring做了所有的注入,然后我们通过反射来更新字段,所以在注解构造函数param时这不起作用。我用了这个指南,https://www.baeldung.com/spring-annotation-bean-pre-processor.
所以我的问题是,有没有一种方法可以为spring实现一个工厂对象,在这里我可以编写代码来读取注解,并在此基础上注入一个实现,这样我就不需要使用反射,无论我在哪里注入,它都能工作,因为它将是springs正常注入生命周期的一部分?
1条答案
按热度按时间eivgtgni1#
因此,我找到了一种方法来实现beandefinitionregistrypostprocessor,使用org.reflections lib查找属性对象上的所有键注解。
然后,我可以为每个键创建一个自定义bean定义,然后使用该键作为限定符进行注册,以允许spring注入我的所有属性对象。
所以第一件事就是将限定符注解添加到我的键注解中。
下一步是创建beandefinitionregistrypostprocessor接口的实现,它将bean定义注册到要在运行时注入的属性接口的具体实现、构造函数参数和通过使用反射扫描包找到的键注解中的限定符
(这是将反射的使用从在我的bean中设置对象改为仅使用它来动态查找键/属性并使其可供注入的关键)
最后,我发现这对我来说是可行的,但是可能有更好的方法来创建一个spring可以触发的工厂,而不是使用反射库,因为这不是最快的