构建自定义java配置注释 - 类似于自定义XML命名空间

时间:2014-10-08 14:17:27

标签: java spring spring-java-config

我们正在Spring& amp; amp; amp; amp; amp; Spring MVC。我们的框架在这​​一点上相当成熟 - 大约2年,并在我们的组织内广泛使用。我们的框架非常模块化(很像弹簧本身)。有各种模块可以单独使用或一起使用。当一起使用时,它们为最终用户提供许多益处。我们构建了一些少数自定义Spring XML命名空间(NamespaceHandlers,BeanDefinitionParsers等)。每个模块都提供自己的模块,它带来了自己的一组XML配置元素。这对我们来说都很有用,对我们来说是一个非常大的胜利。

我们现在要做的是从基于XML的配置转移到java配置。我的想法/想法是每个模块引入一组可以使用的java配置注释(类似于@EnableCaching@EnableMBeanExport注释)。我的问题是 - 即使我创建了我的注释 - 我如何" wire"如果他们在场,我可以做"东西"?这在概念上与NamespaceHandlers& BeanDefinitionParsers。我无法在任何地方找到任何关于如何入门的文档。

我已经考虑过创建一些自定义抽象基类来完成我需要他们做的事情 - 但问题是当涉及到最终用户的应用程序时 - 他们只能扩展一个类。对于我的框架中的每个模块,我需要一种灵活的方式来公开自己的最终用户应用程序可以使用的自定义配置,就像它们使用我们的XML命名空间元素一样。

以下是我们在XML中所做的一瞥(不是完整的应用程序上下文文件 - 只是与我们的自定义XML命名空间相关的一个模糊):

<atom-web:web/>
<atom-web:logging/>
<atom-web:security entitlementsProvider="XML" xmlRefreshInterval="${cache.refresh.interval.ms}"/>

<atom-profile:profile caching="IN_MEMORY" entryExpiryDelay="${cache.refresh.interval.ms}"/>

<atom-prefs:preferences backingStoreUrl="${pref.backingStore.url}"/>

<atom-content:content contentServerBaseUrl="${content.server.url}" contentServerFileUrl="${content.server.file.url}" site="${site.name}" contentTaskExecutor="contentTaskExecutor" snippetCaching="IN_MEMORY" cacheRefreshInterval="${cache.refresh.interval.ms}"/>

<bean id="contentTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" p:corePoolSize="3" p:maxPoolSize="20"/>

我想象的是某种注释 - 就像这样:

@EnableAtomWebApplication
@EnableAtomWebLogging
@EnableAtomWebSecurity(entitlementsProvider=EntitlementsProvider.XML, xmlRefreshDelay=120000)
@EnableAtomProfile(caching=CachingType.IN_MEMORY, expiryDelay=120000)
// Other annotations for rest of modules
@Configuration
public class ConfigurationClass {
   // Rest of configuration in here
}

这里的任何帮助将不胜感激。我不太确定从哪里开始,无法在任何地方找到任何文档来帮助我开始。

2 个答案:

答案 0 :(得分:3)

所以在考虑了这一点后,我想我找到了正确的起点。我想把它扔给那些可能会说“是的,这是正确的地方”或“不,你没有找到正确的地方”的人。

使用上面的例子

@EnableAtomProfile(caching=CachingType.IN_MEMORY, expiryDelay=120000)

我会为@EnableAtomProfile注释创建一个注释,如下所示:

@Retention(value=java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(value={java.lang.annotation.ElementType.TYPE})
@Documented
@Import({AtomProfileBeanDefinitionRegistrar.class})
public @interface EnableAtomProfile {
  CachingType caching() default CachingType.NONE;
  long expiryDelay default 0;
}

AtomProfileBeanDefinitionRegistrar类将实现org.springframework.context.annotation.ImportBeanDefinitionRegistrar并执行我目前正在BeanDefinitionParser

中执行的任何必要操作

答案 1 :(得分:0)

您可以定义BeanPostProcessor,基本上可以:

  • 检查每个创建的bean
  • 使用反射检查对象的类是否使用@YourAnnotation
  • 进行注释
  • 如果是,则应用一些自定义逻辑 - 例如将对象打包成其他类或其他类

参考:

  1. Spring docs on BeanPostProcessors
  2. source code for RequiredAnnotationBeanPostProcessor, which is a BeanPostProcessor which analyzes annotations