我有一个班级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注入值。这可能吗?
答案 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 名称被视为默认限定符值。