基于XML上下文的Bean不能执行构造函数注入:没有找到默认构造函数。

问题描述 投票:0回答:1

我正在学习Spring框架(不使用Spring Boot,以便了解它的工作原理)。

我在applicationContext.xml文件中定义了这个bean。

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

这是我的DAO类

    public class XmlBasedDAO {

        private XMLJdbcConnection XMLJdbcConnection;


        public XMLJdbcConnection getXMLJdbcConnection() {
            return XMLJdbcConnection;
        }

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

这是我的ConnectionXML类。

    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;
        }
    
}

我得到了这个异常:

错误创建了在类pathresource [applicationContext.xml]中定义的名称为'xmlBasedDAO'的bean。Bean的实例化失败。

嵌套异常 isorg.springframework.beans.BeanInstantiationException: Failed toinstantiate [com.springLearning.XmlBasedDAO]: No default constructorfound; 嵌套异常是java.lang.NoSuchMethodException:com.springLearning.XmlBasedDAO。

为什么我的类中不能用这个配置定义一个构造函数?为什么只是一个setter注入就可以了?

我读了很多问题,也看了很多文档,但我没有找到这个特殊情况的答案。

java spring applicationcontext
1个回答
2
投票

在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>

你可以看看这个 教程

© www.soinside.com 2019 - 2024. All rights reserved.