Spring:在自动装配组件时选择构造函数

时间:2017-05-05 10:11:33

标签: java spring javabeans autowired spring-bean

我有一个组件如下:

@Component
class A(){
    private s;
    public A(){}
    public A(String s){this.s=s;}
}

这是另一个类我在哪里自动连接上述类:

@Component
class B(){

    @Autowire
    private A a;
}

在上面的自动装配中,我需要使用参数化构造函数。我怎样才能传递构造函数args?

3 个答案:

答案 0 :(得分:0)

我认为你需要一个原型bean的概念。 @Component将创建一个单独的bean,并且在一个地方更改它将在注入它的所有父类中发生变化。

您需要了解如何在singleton bean中注入原型bean。 按照这个例子 https://stackoverflow.com/a/25165971/949912

答案 1 :(得分:0)

你不能,至少不能通过@Autowired中的B,但还有其他方法可以做到:

将参数连接到A的构造函数:

一个构造函数使用@Autowired because注释:

  

从Spring Framework 4.3开始,@ Autowired构造函数不再存在   如果目标bean只定义了一个构造函数,则必需。如果好几个   建造者是可用的,至少有一个必须注释教   它必须使用的容器。

@Component
class A(){
    private s;
    public A(){}

    @Autowired
    public A(@Value("${myval}") String s){this.s=s;}
}

A公开为@Bean

直接来自the docs

@Configuration
public class AppConfig {
    @Bean
    public A a(@Value("${myval}") String s) {
        return new A(s);
    }
}

使用初始化回调

A中构造B

Docs

@Component
class B(){
    private A a;
    @Value("${myval}")
    private String myval;

    @PostConstruct
    private void init()
    {
        a = new A(myval);
    }
}

答案 2 :(得分:-1)

只使用setter而不是构造函数。 如果您想使用 new 关键字自行创建对象,则此对象将不会由容器管理。