XML 基于上下文的 bean 无法执行构造函数注入:未找到默认构造函数

XML Context based bean cannot perform constructor injection : No default constructor found

我正在学习 Spring 框架(没有 Spring 引导,以便了解它是如何在引擎盖下工作的)。

我在 applicationContext.xml 文件中定义了这个 beans:

    <bean id="connectionXML" class="com.springLearning.ConnectionXML"/>
    <bean id="xmlBasedDAO" class="com.springLearning.XmlBasedDAO">
        <property name="XMLJdbcConnection" ref="connectionXML" />
    </bean>

这是我的 DAO class:

    public class XmlBasedDAO {

        private XMLJdbcConnection XMLJdbcConnection;


        public XMLJdbcConnection getXMLJdbcConnection() {
            return XMLJdbcConnection;
        }

        public void setXMLJdbcConnection(XMLJdbcConnection XMLJdbcConnection) {
            this.XMLJdbcConnection = XMLJdbcConnection;
        }
}

这是我的 ConnectionXML class:

    public class ConnectionXML implements XMLJdbcConnection {
       @Override
       public void connect() {
           System.out.println("Connected");
       }
   }

它实现了这个接口:

    public interface XMLJdbcConnection {
        void connect();
    }

现在使用 setter 注入(如上所示),一切正常

但这就是问题所在:如果我像这样切换到定义的构造函数注入:

    public class XmlBasedDAO {

        private XMLJdbcConnection XMLJdbcConnection;

        public XmlBasedDAO(XMLJdbcConnection XMLJdbcConnection) {
            this.XMLJdbcConnection = XMLJdbcConnection;
        }

        public XMLJdbcConnection getXMLJdbcConnection() {
            return XMLJdbcConnection;
        }
    
}

我遇到了这个异常:

Error creating bean with name 'xmlBasedDAO' defined in class path resource [applicationContext.xml]: Instantiation of bean failed;

nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.springLearning.XmlBasedDAO]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.springLearning.XmlBasedDAO.

为什么我不能用这个配置在 class 中定义构造函数?为什么只需要 setter 注射就能起作用?

我也阅读了很多问题和文档,但我没有找到针对这个特定案例的答案。

在 Spring 中,您可以使用构造函数注入或 Setter 注入来执行 DI。

<constructor-arg>标签用于构造函数注入

<property>标签用于setter注入

您没有更改构造函数注入的 xml,您可以这样做:

<bean id="connectionXML" class="com.springLearning.ConnectionXML"/>
<bean id="xmlBasedDAO" class="com.springLearning.XmlBasedDAO">
    <constructor-arg>
     <ref bean="connectionXML"/> 
    </constructor-arg>  
</bean>

你可以看看这个tutorial