+-

假设我有一个带注释的bean属性设置器,如下所示:
public class Foo {
...
@Autowired
public void setBar(Bar bar) {
...
}
Springframework将像往常一样查找匹配的Bar属性.但是,我想拦截默认的bean解析过程并自己添加一些“魔法”.我想介绍一个像这样的解析器:
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;
}
}
...
我知道我总是可以引入某种包装bean并将解析逻辑移到这里但是我更喜欢使用上述解析器的更通用的方法来使Foo完全独立于解析逻辑.
Springframework中是否有办法实现这样的目标?
最佳答案
根据您的描述,您似乎只需要在启动时执行其他逻辑(自动装配).有几种方法可以解决这个问题(从最差到最好):
> AOP – 糟糕的主意,通过拦截每个调用来引入运行时开销
>自定义范围 – 请参阅:Custom spring scopes?也适用于运行时,也是一个坏主意
> @Profile – 定义两个匹配的bean,并仅根据活动的配置文件启用一个.非常干净,只在启动时引入开销
> @Configuration – 在Java中定义bean有一个额外的好处,就是可以完全控制它们的创建方式:
@Configuration
public class Config {
@Autowired
private Bar someBean;
@Autowired
private Bar anotherBean;
@Bean
@Primary
public Bar primaryBean() {
if(someCondition) {
return someBean;
} else {
return anotherBean;
}
}
}
正如您在本例中所看到的,我们有三个Bar类型的bean:someBean,anotherBean和primaryBean.前两个也可以使用@Bean配置,也可以使用@Service进行组件扫描.但是为了使自动装配成为可能,最后一个primaryBean被标记为@Primary.这样,它将优于其他两个.
这是我推荐的解决方案,因为解析逻辑是干净,可维护和可读的.恕我直言,这是基于Java的@Configuration真正闪耀的情况.
点击查看更多相关文章
转载注明原文:java – 可自定义@Autowired - 乐贴网