Spring:如何将String bean注入构造函数?

时间:2017-01-10 14:09:36

标签: java spring spring-mvc

我有一个班级Config

Config.java

public class Config {
    private final String p = "Prop";

    @Bean
    public String getP(){return p;}
}

如何将其注入某个构造函数,即:

public class SomeC {
    private String p;

    public SomeC(String p) {
        this. p = p;
    }
}

我希望此字符串p从Config注入值。这可能吗?

3 个答案:

答案 0 :(得分:11)

您必须为bean命名,然后在自动装配引用该名称时使用@Qualifier注释。

示例:

<强> Config.java

public class Config {
    private final String p = "Prop";

    @Bean(name="p")
    public String getP(){return p;}
}

<强> SomeC.java

public class SomeC {
    private String p;

    @Autowired
    public SomeC(@Qualifier("p") String p) {
        this. p = p;
    }
}

答案 1 :(得分:0)

你应该像这样使用@Autowired

@Autowired
public SomeC(String p){
  this.p = p;
}

或者像这样:

public class SomeC {

  @Autowired
  private String p;

}

我更喜欢第二种方法,但是这使得类更难以测试,因为从外部看不到依赖关系,所以请谨慎使用。

答案 2 :(得分:0)

如果只有一个 String 类型的 bean,你可以不做任何更改。按类型注入是可用的。

@Configuration
public class Config {
    private final String p = "Prop";

    @Bean
    public String getP() {
        return p;
    }
}
@Component
public class SomeC {

    private String p;

    public SomeC(String p) {
        this.p = p;
    }
}

如果有多个String类型的bean,可以按名称注入。

@Configuration
public class Config {
    private final String p = "Prop";
    private final String q = "AnotherProp";

    @Bean
    public String getP() {
        return p;
    }
    
    @Bean
    public String getQ() {
        return q;
    }
}
@Component
public class SomeC {

    @Resource(name = "getP")
    private String p;

默认 bean 名称是方法名称 getP。 您可以通过 @Bean("customName") 注释重命名。

注意:

<块引用>

如果您打算通过名称来表达注解驱动的注入,请不要主要使用 @Autowired (snip)。而是使用 JSR-250 @Resource 注释

<块引用>

@Resource 仅支持带有单个参数的字段和 bean 属性 setter 方法。

通过限定符注入可用于构造函数注入。

@Configuration
public class Config {
    private final String p = "Prop";
    private final String q = "AnotherProp";

    @Bean
    @Qualifier("p")
    public String getP() {
        return p;
    }

    @Bean
    @Qualifier("q")
    public String getQ() {
        return q;
    }
}
@Component
public class SomeC {

    private String p;

    public SomeC(@Qualifier("p") String p) {
        this.p = p;
    }
}

This answer 是一种后备行为。名称和限定符是不同的。

<块引用>

对于回退匹配,bean 名称被视为默认限定符值。