5

我需要创建一种添加自定义注释的方法,例如

@Value("${my.property}")

但是,就我而言,我需要从数据库而不是属性文件中获取值。

基本上我想在容器启动时创建一个 bean,它从数据库中读取属性名称值对,然后可以将它们注入到属于其他 bean 的字段中。

4

3 回答 3

9

方法#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 的工作方式。

  • 它将查看您的 bean 定义,并获取底层类。
  • 然后它将使用反射检查类中的注释。
  • 它将更新 bean 定义以包括根据注释中的值注入属性。

. . 实际上,我认为方法#2 听起来更像您想要的——所有处理都发生在“启动”时。. . (实际上,您甚至在启动之前就修改了 bean 配方)。. 而如果你使用 AOP,你会拦截方法调用,这对你来说可能为时已晚?

命名空间处理程序

如果您愿意,您甚至可以创建自己的 Spring命名空间处理程序以简洁的方式打开您的后处理器。例如:

<myApp:injectFromDb />

作为替代方案:

<bean class="MyDatabaseLookupProcessorImpl etc, etc. />

更新:方法#3

从 Spring 3.1 开始,还有PropertySourcesPlaceholderConfigurer,它将为您提供大部分管道,因此您可以用更少的代码实现这一点。

于 2013-10-11T11:05:23.897 回答
0

您可以通过在应用程序环境本身中注入数据库配置来使用 @Value 注释。

我知道这是一个老问题,但我没有找到确切的解决方案。所以在这里记录一下。

我已经在不同的论坛上回答了同样的问题。

请参阅此答案以获取您的问题的确切解决方案。

于 2020-05-14T09:17:20.507 回答
0

或者,您应该能够配置某种属性存储库 bean,然后在 SpEL 中直接在 @Value 注释中使用它。

假设您propertiesRepository在实现以下接口的上下文中调用了 bean:

interface PropertiesRepository {
    String getProperty(String propertyName);
}

然后在要注入值的bean上,您可以使用以下表达式

@Value("#{propertiesRepository.getProperty('my.property')}")
String myProperty;
于 2017-09-04T10:09:13.870 回答