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

标签 spring constructor autowired spring-annotations spring-bean

我正在使用 Spring 3.0.5 并尽可能为我的类(class)成员使用 @Autowire 注释。我需要 Autowiring 的 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”的值?有没有办法做到这一点?

谢谢,

埃里克

最佳答案

您需要 @Value注释。

A common use case is to assign default field values using "#{systemProperties.myProp}" style expressions.

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;
  }

  // ...
}

参见: Expression Language > Annotation Configuration


更清楚地说:在您的场景中,您将连接两个类,MybeanServiceMyConstructorClass,如下所示:

@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 实例,您应该 use Qualifier annotations

关于spring - 有没有办法 @Autowire 需要构造函数参数的 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6739566/

相关文章:

java - 尝试将 spring boot war 部署到 tomcat8 时 Unresolved 循环引用?

spring - 如何使用gradle将angular 4与Spring MVC集成?

c++ - 如何从具有不同构造函数的父类(super class)访问子类的成员?

c++ - SFINAE 上的默认参数值

java - 使用 @Autowired setter Autowiring 给出 NullPointerException

spring - 有没有一种方法可以重新加载 Spring Boot 应用程序而无需在 STS 上重新运行应用程序?

Java spring 框架表单验证

C++ 在父类(super class)构造函数中运行依赖于子类重写的大量变量的代码的正确方法是什么?

symfony - 无法 Autowiring "App\Controller\BlogController::edit()": it references class "App\Entity\Blog" but no such service exists 的参数 $blog

java - @Autowired 不注入(inject) Mongodb 存储库或服务 -nullPointerException-