Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构建自定义java配置注释-类似于自定义XML命名空间_Java_Spring_Spring Java Config - Fatal编程技术网

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

构建自定义java配置注释-类似于自定义XML命名空间,java,spring,spring-java-config,Java,Spring,Spring Java Config,我们正在Spring和SpringMVC之上构建一个框架。我们的框架在这一点上已经相当成熟——大约有2年的历史,并且在我们的组织中被广泛使用。我们的框架非常模块化,很像spring本身。有各种模块可以单独使用或一起使用。当一起使用时,它们为最终用户提供了许多好处。我们已经构建了一些定制的SpringXML名称空间名称空间处理程序、BeanDefinitionParser等。每个模块都提供自己的名称空间,并引入了自己的一组XML配置元素。这一切对我们来说都很好,对我们来说是一场巨大的胜利 我们现在

我们正在Spring和SpringMVC之上构建一个框架。我们的框架在这一点上已经相当成熟——大约有2年的历史,并且在我们的组织中被广泛使用。我们的框架非常模块化,很像spring本身。有各种模块可以单独使用或一起使用。当一起使用时,它们为最终用户提供了许多好处。我们已经构建了一些定制的SpringXML名称空间名称空间处理程序、BeanDefinitionParser等。每个模块都提供自己的名称空间,并引入了自己的一组XML配置元素。这一切对我们来说都很好,对我们来说是一场巨大的胜利

我们现在要做的是从基于XML的配置转移到java配置。我的想法是让每个模块引入一组java配置注释,这些注释可以使用类似于@EnableCaching、@EnableBeanexport注释的东西。我的问题是,即使我创建了我的注释,我如何连接它们,以便如果它们存在,我可以做一些事情?这在概念上类似于NamespaceHandler和BeanDefinitionParser。我在任何地方都找不到关于如何开始的文档

我曾考虑过创建一些定制的抽象基类,这些基类完成了我需要它们完成的任务——但问题是,当涉及到最终用户的应用程序时,它们只能扩展单个类。我需要为框架中的每个模块提供一种灵活的方式,以公开最终用户应用程序可以使用的自己的自定义配置,就像它们使用我们的XML名称空间元素一样

下面是关于我们在XML中所做工作的一瞥—不是完整的应用程序上下文文件—只是其中有关自定义XML名称空间的一个简介:

我设想的是一组注释-类似于这样:

@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;
}
@EnableTomWebApplication @启用Web日志 @EnableAtomWebSecurityentitlementsProvider=AuthenticationsProvider.XML,xmlRefreshDelay=120000 @EnableAtomProfilecaching=CachingType.IN_内存中,expireydelay=120000 //其余模块的其他注释 @配置 公共类配置类{ //其余的配置在这里 } 这里的任何帮助都将不胜感激。我不太确定从哪里开始,在任何地方都找不到帮助我开始的文档。

您可以定义一个BeanPostProcessor,它基本上可以:

检查创建的每个bean 使用反射检查对象的类是否用@YourAnnotation注释 如果是,则应用一些自定义逻辑-例如,将对象打包到其他类或其他东西中 参考:


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

用我上面的例子

@EnableAtomProfile(caching=CachingType.IN_MEMORY, expiryDelay=120000)
我将为@enableTomProfile注释创建如下注释:

@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;
}

AtomProfileBeanDefinitionRegistrator类将实现并执行我目前在我的

中正在做的任何必要的工作,这些工作可能会起作用,但它并不是真正正确的解决方案。与@Configuration类没有任何联系。Spring中必须有某种方法与@Configuration类相结合,以添加您自己的自定义注释或处理—就像Spring支持自定义XML名称空间—它直接构建在框架中。实际上,我越想它,就越意识到这不起作用。在生命周期中使用BeanPostProcessor太晚了。配置类/bean定义解析器的目的是能够动态地创建新bean并将其添加到应用程序上下文中。如果您在一个bean中,并且在一个bean后处理器中执行,那么在上下文中引入新的bean定义就太晚了。我可能误解了。我认为这些注释是为了调整现有bean的配置,而不是为了创建一些新的bean。不用担心,您的回答确实让我思考了一下。我感谢你的回应!您关于实现自定义ImportBeanDefinitionRegistrator的提示让我省去了几个小时的沮丧-谢谢!