如何在 ApplicationContext.xml 中定义一个没有构造函数的 bean?

Posted

技术标签:

【中文标题】如何在 ApplicationContext.xml 中定义一个没有构造函数的 bean?【英文标题】:How to define a bean in ApplicationContext.xml that has no constructor? 【发布时间】:2020-03-18 06:40:17 【问题描述】:

我有课

public class DataStore 
    public String name;
    public String username;
    public String password;
    public String token;
    public String connectionString;
    public String type;
    public String scheme;

    public boolean usesBasicAuth;
    public boolean usesBearerAuth;

我需要在另一个项目中为它创建一个 bean。但我需要以某种方式填写这些字段。问题是我不能使用<constructor-arg ... />,因为没有构造函数。

下面的代码导致 BeanCreationException: "Could not resolve matching constructor"

 <bean id="dataStore"
      class="com.fressnapf.sdk.dataaccess.services.DataStore">
    <constructor-arg index="0" value="$spring.datastore.name"/>
    ...
</bean>

【问题讨论】:

解决方案:使用property,这里使用constructor-arg (docs.spring.io/spring-javaconfig/docs/1.0.0.m3/reference/html/…) 您可以使用 创建一个 bean。 注意: ->java 中的每个类都有一个由编译器自动提供的默认构造函数 @ShubhamGarg 是的,但我需要用值填充它,就是这样,我不需要 emty bean 这个bean中的所有字段都是public,所以你可以在创建bean之后设置值 @ShubhamGarg 我需要从 application.properties 中读取它们,如下所示:$spring.datastore.name 【参考方案1】:

假设,您有公共(您的 getter 和 setter)属性,并且只有“默认(无 args)构造函数”,那么您可以将配置更改为:

<bean id="dataStore" class="com.fressnapf.sdk.dataaccess.services.DataStore">
  <property name="connectionString" value="..."/>
  <!-- ... -->
</bean>

使用property 代替constructor-arg

文档(春季 4.2):https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/xsd-configuration.html

【讨论】:

【参考方案2】:

是的,有一个构造函数。

如果你没有显式地放一个,Java 会自动添加一个默认的(非参数)构造函数。

使用那个。 它将所有实例变量设置为其类型的默认值。

在您的情况下:每个 String 变量都为 null,每个布尔值都为 false。

【讨论】:

但我需要在数据存储中设置字段 所以,要么添加构造函数,要么使用setter 我使用了 setter 和 used 属性。现在它的工作

以上是关于如何在 ApplicationContext.xml 中定义一个没有构造函数的 bean?的主要内容,如果未能解决你的问题,请参考以下文章

在QGIS中如何添加天地图的WMTS

如何在表单提交后保留文本(如何在提交后不删除自身?)

如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?

在 Avkit 中如何使用这三行代码,以及如何将音乐静音”

如何在 JDBC 中启动事务?

如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?