这是一个奇特的用例,因此需要一些耐心才能理解,并且可能需要奇特的解决方案。
上下文
我正在制作一个与 Spring 一起使用的库,该库对上下文中存在的特定 bean 实例执行自动操作,由@Bean
方法创建,而不是由@ComponentScan
. 如果可能的话,bean 应该不是通过类型区分,而是通过其他方式区分,最好是工厂方法上的注释。
这是理想的情况。例如,假设有 2 种 bean 生产方法:
@Bean
public SomeType makeSome() {...}
@Bean
@Special
public SomeOtherType makeOther() {...}
在这里,第二个 bean 是特殊的,因为@Special
创建它的方法上的注释。但任何使其可区分的机制都是一种选择。
然后,我想以某种方式只获得特殊的豆子。
警告
我知道如果所有 bean 都实现相同的接口,我可以按类型注入它们。但这应该尽可能透明,需要对现有应用程序进行尽可能少的更改。
潜在的方法
这是我想到的两种广泛的方法:
1)进入注册bean的过程,并将bean实例透明地包装到某种容器中(我很确定这部分是可行的)。例如
public void registerBean(Object bean, ApplicationContext ctx) {
ctx.register(bean); //do the usual
ctx.register(new Wrapper(bean); //register it wrapped as well
}
然后,注入所有类型的 bean Wrapper
。这里的问题显然是重复...或者我可以动态生成一个代理实例来实现一个Wrapper
接口,所以它可以同时充当原始 bean和包装器。我确实说过我也可以接受异国情调的解决方案,不是吗?
2) Spring 已经将 bean候选者与实际注册的 bean 区分开来(例如@ComponentScan
,可以通过包、注释等过滤候选者)。我希望也许可以进入这个过程并获得候选描述符,这些描述符仍然包含一些有用的元数据(如他们的工厂方法),这将允许我以后区分这些 bean 实例。