我需要创建一种方法来添加自定义注释,例如
@Value("${my.property}")
但是,在我的情况下,我需要从数据库中获取值,而不是属性文件。
基本上我想在容器启动时创建一个bean,它从数据库中读取属性名称值对,然后将它们注入属于其他bean的字段中。
答案 0 :(得分:7)
方法#1:
一种方法是使用切入点表达式创建一个Aspect,该表达式匹配具有此注释的任何方法。
您的方面将是:
AOP Kickstart
以下是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,它将为您提供大部分管道,因此您可以使用更少的代码实现此目的。
答案 1 :(得分:0)
或者,您应该能够配置一种属性存储库bean,然后在Spel中直接在@Value注释中使用它。
假设您的上下文中有一个名为propertiesRepository
的bean,它实现了以下接口:
interface PropertiesRepository {
String getProperty(String propertyName);
}
然后在要注入值的bean上,可以使用以下表达式
@Value("#{propertiesRepository.getProperty('my.property')}")
String myProperty;
答案 2 :(得分:0)