当前位置: 首页 > 知识库问答 >
问题:

Spring:如何给构造函数注入一个String bean?

经和歌
2023-03-14

我有一个类< code >配置:

配置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配置中注入了值。这可能吗?

共有3个答案

傅安宁
2023-03-14

如果只有一个String-type 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;
    }
}

如果有多个< code>String类型的beans,可以按名称注入。

@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名称是方法名<code>getP</code>。您可以通过@Bean(“customName”)注释进行重命名。

注意:

  • 1.9.4. 使用限定符微调基于注释的自动连线

如果要按名称表示批注驱动的注入,请不要主要使用 @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;
    }
}

这个答案是一种回退行为。名称和限定符是不同的。

  • 1.9.4. 使用限定符微调基于注释的自动连线

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

史烨
2023-03-14

您应该像这样使用< code>@Autowired:

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

或者像这样:

public class SomeC {

  @Autowired
  private String p;

}

我更喜欢第二种方法,但这会使类更难测试,因为从外部看不到依赖项,因此请谨慎使用。

金骞尧
2023-03-14

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

示例:

配置java

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

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

有些C.java

public class SomeC {
    private String p;

    @Autowired
    public SomeC(@Qualifier("p") String p) {
        this. p = p;
    }
}
 类似资料:
  • 请帮助理解在哪种情况下我应该使用构造函数注入和设置器注入。请帮我举个合适的例子。 先谢谢你。

  • 大家都知道@Autowired(@Inject etc)注释是由AutowiredAnnotationBeanPostProcessor处理的。它解析并设置用@Autowired注释的字段和setter,但构造函数呢?这是bean后处理器,这意味着它是在已经创建bean之后调用的,但是构造函数也可以标记为@Autowired,那么如何创建这样的bean呢?

  • 问题内容: 假设我有一些类似以下的课程。(为简单起见,这是一个虚构类。) 由于我使用不同的实现,并且可能想对该发送功能进行单元测试,因此我认为我应该注入in 的方法。但是我该怎么做呢? 我见过的所有我理解的Guice示例似乎都是在构造函数中进行注入的: 但是我的类在其构造函数中接受了一个参数,我不想注入该参数。那我该怎么办呢? (注意:我是一个完整的Google Guice noob。我认为我了解

  • Spring文档说: 每个类只能标记一个带注释的构造函数,但是可以注释多个非必需的构造函数。在这种情况下,每个都被认为是候选的,Spring使用最贪婪的构造函数,其依赖关系可以得到满足——也就是说,具有最多参数的构造函数。构造函数解析算法与具有重载构造函数的非注释类相同,只是将候选对象缩小为注释构造函数。 我测试了它,当我有另一个由 错误: 组织。springframework。豆。工厂BeanC

  • 我有一个接口,它在两个地方定义如下: 我的客户端实现类没有任何注释,只有必需的构造函数。在这种情况下,如何限定正确的接口实现用法?我不想使用,因为在我的例子中,将其中一个用法命名为primary在语义上是不正确的(它们在某种意义上是相等的)。我需要用相同的实现类传递相同的接口,但针对受尊敬的客户机的特定用例进行了不同的配置。我想命名一个参数就足够了,通过这个参数我将实现注入到bean创建方法中,但

  • 注入是将依赖注入对象的过程。 构造函数注入很常见。 在此过程中,依赖项作为参数注入构造函数。 请参阅下面的示例。 创建一个名为GuiceTester的java类。 GuiceTester.java import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Inj