0

我正在编写一个服务注册表类。此服务注册表将扫描包以查找带注释的类,然后填充一些内部映射。那么我需要的是能够使用某种方法(比方说)查询服务(通过字符串名称Object get(String name))。然后,此方法将在内部地图中搜索具有此类名称的服务并返回实例。

我现在正在做的是让这个 ServiceRegistryBean 实现ApplicationContextAwareBeanDefinitionRegistryPostProcessor并在构造上给出一个字符串(包名称)列表。

然后,一旦构建了 bean,注册表后处理器就会启动(见注释),并且注册表类将服务类作为新 bean(单例,延迟加载)添加到 spring bean 注册表中。然后,获取服务实例就像从上下文中请求一个 bean,返回单例实例一样简单。

我的问题是:春天有没有更好的方法来做到这一点?我调查过豆类工厂,但在我看来并不相同。在服务实例中支持自动装配和 DI 是必不可少的,这就是我希望 Spring 实例化它的原因。另外,我喜欢 Spring 照顾单身人士的想法。

注意:我发现,当我将 bean 创建内联时<constructor-arg>(即 bean 未命名,只是作为其他 bean 的构造函数参数传递的实例 - 在我的情况下,我将注册表作为参数传递给其他构造函数),BeanDefinitionRegistryPostProcessor接口方法(即public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry))根本不被调用!我很确定,这是我不知道的 Spring 的一些行为,但我无法为后处理器找到合适的文档。

感谢您的任何提示或见解!

4

1 回答 1

0

扫描已经支持的自定义注解,只需要添加一个include-filterto<context:component-scan>标签,即

<context:component-scan base-package="org.example">
   <context:include-filter type="annotation" expression="some.Annotation"/>
</context:component-scan>

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/beans.html#beans-scanning-filters

如果您打开,default-lazy-init我认为 DI 容器已准备好用作服务定位器注册表。

关于注释,查找时仅考虑根 bean 定义BeanFactoryPostProcessors,忽略内部 bean。

通常,扫描和注册 bean 是BeanDefinitionParsers因为您知道 bean 何时注册并且 bean 对工具可见,例如 STS Spring Bean Explorer,但使用 aBeanDefinitionRegistryPostProcessor是正确的。该接口确保在其他BeanFactoryPostProcessors运行之前定义 bean。

于 2013-05-10T15:56:00.187 回答