我需要创建一种添加自定义注释的方法,例如
@Value("${my.property}")
但是,就我而言,我需要从数据库而不是属性文件中获取值。
基本上我想在容器启动时创建一个 bean,它从数据库中读取属性名称值对,然后可以将它们注入到属于其他 bean 的字段中。
我需要创建一种添加自定义注释的方法,例如
@Value("${my.property}")
但是,就我而言,我需要从数据库而不是属性文件中获取值。
基本上我想在容器启动时创建一个 bean,它从数据库中读取属性名称值对,然后可以将它们注入到属于其他 bean 的字段中。
方法#1:
一种方法是创建一个 Aspect,其切入点表达式与具有此注释的任何方法相匹配。
然后你的方面将:
AOP 启动
这是 Spring AOP 入门指南
http://www.tutorialspoint.com/spring/aop_with_spring.htm
连接点匹配
这是描述如何创建与注释匹配的连接点的参考:http: //eclipse.org/aspectj/doc/next/adk15notebook/annotations-pointcuts-and-advice.html
方法#2:
另一种方法是使用BeanFactoryPostProcessor - 这本质上是 PropertyPlaceholderConfigurer 的工作方式。
. . 实际上,我认为方法#2 听起来更像您想要的——所有处理都发生在“启动”时。. . (实际上,您甚至在启动之前就修改了 bean 配方)。. 而如果你使用 AOP,你会拦截方法调用,这对你来说可能为时已晚?
命名空间处理程序
如果您愿意,您甚至可以创建自己的 Spring命名空间处理程序以简洁的方式打开您的后处理器。例如:
<myApp:injectFromDb />
作为替代方案:
<bean class="MyDatabaseLookupProcessorImpl etc, etc. />
更新:方法#3
从 Spring 3.1 开始,还有PropertySourcesPlaceholderConfigurer,它将为您提供大部分管道,因此您可以用更少的代码实现这一点。
或者,您应该能够配置某种属性存储库 bean,然后在 SpEL 中直接在 @Value 注释中使用它。
假设您propertiesRepository
在实现以下接口的上下文中调用了 bean:
interface PropertiesRepository {
String getProperty(String propertyName);
}
然后在要注入值的bean上,您可以使用以下表达式
@Value("#{propertiesRepository.getProperty('my.property')}")
String myProperty;