一尘不染

有没有办法@Autowire一个需要构造函数参数的bean?

spring

我正在使用Spring 3.0.5,并为类成员尽可能多地使用@Autowire注释。我需要自动装配的bean之一需要其构造函数的参数。我浏览了Spring文档,但似乎找不到任何有关如何注释构造函数参数的参考。

在XML中,我可以将其用作bean定义的一部分。@Autowire注释是否有类似的机制?

例如:

@Component
public class MyConstructorClass{

  String var;
  public MyConstructorClass( String constrArg ){
    this.var = var;
  }
...
}


@Service
public class MyBeanService{
  @Autowired
  MyConstructorClass myConstructorClass;

  ....
}

在此示例中,如何在MyBeanService中使用@Autowire批注指定“ constrArg”的值?有什么办法吗?

谢谢,


阅读 1219

收藏
2020-04-12

共1个答案

一尘不染

你需要@Value注释。

一个常见的用例是使用"#{systemProperties.myProp}"样式表达式分配默认字段值 。

public class SimpleMovieLister {

  private MovieFinder movieFinder;
  private String defaultLocale;

  @Autowired
  public void configure(MovieFinder movieFinder, 
                        @Value("#{ systemProperties['user.region'] }"} String defaultLocale) {
      this.movieFinder = movieFinder;
      this.defaultLocale = defaultLocale;
  }

  // ...
}

请参阅: 表达式语言>注释配置

更清楚地说:在你的方案中,你将连接两个类,MybeanService和MyConstructorClass,如下所示:

@Component
public class MyBeanService implements BeanService{
    @Autowired
    public MybeanService(MyConstructorClass foo){
        // do something with foo
    }
}

@Component
public class MyConstructorClass{
    public MyConstructorClass(@Value("#{some expression here}") String value){
         // do something with value
    }
}

更新:如果你需要几个MyConstructorClass具有不同值的不同实例,则应使用Qualifier批注

2020-04-12