Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可自定义@Autowired_Java_Spring_Inversion Of Control_Autowired - Fatal编程技术网

Java 可自定义@Autowired

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

假设我有一个带注释的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;
    }
  }

  ...
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()
方法中执行自定义逻辑