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

Spring:在自动布线组件时选择构造函数

严信瑞
2023-03-14

我有一个组件如下:

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

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

@Component
class B(){

    @Autowire
    private A a;
}

在上面的自动布线中,我需要使用参数化构造函数。如何传递构造函数参数?

共有3个答案

吕德业
2023-03-14

只是用setters代替constructor。如果你想自己用新的关键字创建对象,那么这个对象将不会被容器管理。

楚俊杰
2023-03-14

有一个原型bean的概念,我认为您在您的案例中需要它@组件将创建一个单例bean,在一个地方更改它将改变注入它的所有父类。

您需要了解如何在singleton bean中注入原型bean。以https://stackoverflow.com/a/25165971/949912为例

薛弘厚
2023-03-14

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

一个构造函数使用 @Autowired 进行注释,因为:

从Spring Framework 4.3开始,如果目标bean只定义了一个构造函数,就不再需要@Autowired构造函数。如果有几个构造函数可用,那么至少要有一个被注释掉,以告诉容器必须使用哪一个。

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

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

直接来自文件:

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

文档

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

    @PostConstruct
    private void init()
    {
        a = new A(myval);
    }
}
 类似资料:
  • 我使用spring已经有一段时间了,但是今天早上我遇到了一些意想不到的行为。由于我自己无法决定这是一个理想的功能还是一个bug,所以我在这里展示它,希望我能得到一些关于为什么会发生这种情况的好解释。 简而言之,我在一个应用程序上下文中定义了多个bean,并且我使用utils创建了两个map bean:map name space,只将我的bean的一部分添加到这些map中。这两个地图有完全相同的条

  • 与属性自动装配相比,构造函数自动装配有什么特殊的优势吗……或者普通的优势。?优于迫使团队在Spring启动中使用构造函数自动装配……它有什么特殊的优势吗?两种类型的自动装配的优缺点

  • 我想知道以下解决方案之间的区别是什么,为什么使用解决方案2?有什么好处吗? 解决方案一: 解决方案2:

  • 我有一个带有自动扫描和@Component注释的Spring项目。一些组件需要使用@Autow的注入到不同的bean中。默认情况下,它是否将是作为单例创建的相同组件bean?如果是,如何将同一组件的不同实例注入不同的bean中? 附言:我知道它接近基础,听起来很一般。只是想自己说清楚。 提前致谢

  • 我在我的spring boot应用(spring Hibernate/Data/JPA/Web)中有这个类: pkg实体: pkg存储库: pkg服务: 如果我不创建任何控制器,所有工作,但如果我创建一个控制器: pkg控制器: 我得到这个错误(ConfigController中的autowired ConfigService错误): 第一个问题是:我已经注释了@Transaction的BaseS