我正在编写服务注册表类。此服务注册表将扫描包注释类,然后填充一些内部映射。我需要的是能够使用某种方法(通过字符串名称)查询服务(比如Object get(String name)
)。然后,此方法将在内部映射中搜索具有此类名称的服务并返回实例。
我现在正在做的是使用此ServiceRegistryBean实现ApplicationContextAware
和BeanDefinitionRegistryPostProcessor
以及构造中给出的字符串(包名称)列表。
然后,只要构造bean,注册表后处理器就会启动(请参阅注释),注册表类将服务类作为新bean(singleton,lazy loaded)添加到spring bean注册表中。然后,获取服务实例就像从上下文请求bean一样简单,返回单例实例。
我的问题是:Spring有更好的方法吗?我看过豆工厂,但在我看来并不一样。在服务实例中支持自动布线和DI是必不可少的,这就是我希望Spring实例化它的原因。另外,我喜欢春天照顾单身人士的想法。
注意:我发现,当我在<constructor-arg>
中内联bean创建时(也就是说,bean没有被命名,只是作为其他bean的构造函数参数传递的实例 - 在我的情况下,我'将注册表作为参数传递给其他构造函数),BeanDefinitionRegistryPostProcessor
接口方法(即public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
)根本不被调用!我很确定,这是我不知道的Spring的一些行为,但我无法为后处理器找到适当的文档。
感谢您提供任何提示或见解!
答案 0 :(得分:0)
扫描已经支持的自定义注释,您只需要添加include-filter
到<context:component-scan>
标记,即
<context:component-scan base-package="org.example">
<context:include-filter type="annotation" expression="some.Annotation"/>
</context:component-scan>
如果您打开default-lazy-init
,我认为DI容器已准备好用作服务定位器注册表。
关于注释,在查找BeanFactoryPostProcessors
时只考虑根bean定义,忽略内部bean。
通常,扫描和注册bean是由BeanDefinitionParsers
完成的,因为您知道bean何时被注册并且bean对于工具是可见的,例如STS Spring Bean Explorer,但使用BeanDefinitionRegistryPostProcessor
是正确的。该接口确保在其他BeanFactoryPostProcessors
运行之前定义bean。