Java 可自定义@Autowired
假设我有一个带注释的bean属性设置器,如下所示:Java 可自定义@Autowired,java,spring,inversion-of-control,autowired,Java,Spring,Inversion Of Control,Autowired,假设我有一个带注释的bean属性设置器,如下所示: public class Foo { ... @Autowired public void setBar(Bar bar) { ... } public interface SomeResolverInterface<T> { public T resolve(Class<T> beanClass); } public class BarResolver implements SomeRes
public class Foo {
...
@Autowired
public void setBar(Bar bar) {
...
}
public interface SomeResolverInterface<T> {
public T resolve(Class<T> beanClass);
}
public class BarResolver implements SomeResolverInterface<Bar> {
@Override
public Bar resolve(Class<Bar> beanClass) {
if(someCondition) {
return someBean;
} else {
return anotherBean;
}
}
...
Springframework将像往常一样查找匹配的条属性。然而,我想截取默认的bean解析过程,自己添加一点“魔力”。我想介绍这样一个解析器:
public class Foo {
...
@Autowired
public void setBar(Bar bar) {
...
}
public interface SomeResolverInterface<T> {
public T resolve(Class<T> beanClass);
}
public class BarResolver implements SomeResolverInterface<Bar> {
@Override
public Bar resolve(Class<Bar> beanClass) {
if(someCondition) {
return someBean;
} else {
return anotherBean;
}
}
...
公共接口SomeResolutionrInterface{
公共T类解析(beanClass类);
}
公共类BarResolver实现了SomeResolvePrinterface{
@凌驾
公共酒吧解析(beanClass类){
如果(某些条件){
归还一些豆子;
}否则{
返回另一个bean;
}
}
...
我知道我总是可以引入某种包装bean,并将解析逻辑移到其中,但我更喜欢一种更通用的方法,使用上面描述的解析程序,使Foo
完全独立于解析逻辑
Springframework中有没有一种方法可以实现这样的效果?根据您的描述,您似乎只需要在启动时执行额外的逻辑(自动布线)。有几种方法可以解决这个问题(从最坏到最好):
- AOP-坏主意,通过拦截每个调用引入运行时开销
- 自定义范围-请参阅:在运行时也可以工作,这也是一个坏主意
- -定义两个匹配的bean,并根据活动配置文件仅启用一个。非常干净,仅在启动时引入开销
@Configuration
-在Java中定义bean有一个额外的好处,即可以完全控制如何创建bean:
正如您在本例中所看到的,我们有三种类型的Bar
Bean:someBean
,anotherBean
和primaryBean
。前两种也可以使用@Bean
或通过组件扫描@Service
进行配置。但为了实现自动连接,最后一个primaryBean
标记为de>@Primary
。这种方式比其他两种方式更可取
这是我推荐的解决方案,因为解析逻辑是干净的、可维护的和可读的。在这种情况下,基于Java的@Configuration
非常出色。虽然我从未尝试过,但我认为您可以考虑通过
AnnotationConfigUtils
或者看看
AutowiredAnnotationBeanPostProcessor
并查看它是否允许逻辑的简单扩展/可插拔性除了Tomasz提供的@Configuration
选项外,您还可以使用简单的FactoryBean
。只需实现接口并声明FactoryBean。在getObject()
方法中执行自定义逻辑