自定义注释,如@Value

时间:2013-10-11 11:02:53

标签: spring

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

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

但是,在我的情况下,我需要从数据库中获取值,而不是属性文件。

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

3 个答案:

答案 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的工作原理。

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

。 。实际上我认为方法#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)

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

我知道这是一个老问题,但是我没有找到确切的解决方案。因此,请在此处进行记录。

我已经在不同的forum上回答了相同的问题。

请参阅此answer,以获取针对您问题的确切解决方案。