我正在学习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注入就可以了?
我读了很多问题,也看了很多文档,但我没有找到这个特殊情况的答案。
在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>
你可以看看这个 教程