自定义注释,如@Value

Dar*_*Var 5 spring

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

@Value("${my.property}")
Run Code Online (Sandbox Code Playgroud)

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

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

Jas*_*ues 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 />
Run Code Online (Sandbox Code Playgroud)

作为替代:

<bean class="MyDatabaseLookupProcessorImpl etc, etc. />
Run Code Online (Sandbox Code Playgroud)

更新:方法#3

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