2013-05-10 58 views
0

我在写一个服务注册表类。此服务注册表将扫描注释类的包,然后填充一些内部映射。然后,我需要的是能够使用某种方法(例如Object get(String name))查询服务(按字符串名称)。然后该方法将搜索内部映射以获取具有此名称的服务并返回实例。通过Spring实例化任意类

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

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

我的问题是:春天有没有更好的方法来做到这一点?我已经研究过豆制品工厂,但它在我看来并不相同。在服务实例中支持自动布线和DI是必不可少的,这就是为什么我希望Spring实例化它。另外,我喜欢春天照顾单身人士的想法。

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

谢谢你的任何提示或见解!

回答

0

正在扫描,它已经支持的自定义注释,你只需要添加一个include-filter<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容器已准备就绪用作服务定位器注册表。

关于本说明,在查找BeanFactoryPostProcessors时只考虑了根bean的定义,忽略了内部bean。

通常情况下,扫描和注册beans是由BeanDefinitionParsers完成的,因为您知道何时bean已注册,bean是否可用于工具,如STS Spring Bean Explorer,但使用BeanDefinitionRegistryPostProcessor是正确的。该界面确保在其他BeanFactoryPostProcessors运行之前定义bean。

+0

感谢您的回答,但我担心,我有理由拥有实际的注册表类,而不是使用Spring发现服务(其中之一是,该库应该支持非Spring部署,并且注释本身有一些其他的元数据关联,这需要考虑) – 2013-05-10 18:03:08

+0

好吧,我忘了笔记。 – 2013-05-10 19:01:34