前言:
我们知道,一个bean类需要为每一个变量写get和set方法。在Spring的bean.xlm中,可以通过set方法来完成property的注入,所以要在类中提供对应的set方法。
注意,属性和set以及property是这样对应的关系。
attribute | set function | property |
---|---|---|
favoriteFood | setFavoriteFood | favoriteFood |
name | setName | name |
set方法的名字不能任意取,不然配置文件会读取失败。比如,对于表中第二个name属性,如果把set方法写成setNameT,则会出错。
下面,我们创建一个Book类,其中有name和price两个属性、空参和有参构造,以及get和set方法,来验证property的注入。
首先,创建Book的bean类
package com.kiong.spring6;
public class Book {
private String name;
private double price;
public Book(String name, double price) {
this.name = name;
this.price = price;
}
public Book() {
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void printInfo(){
System.out.println("图书"+name+"的价格是"+price+"元.");
}
}
接着,编写beanBook.xml
<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!---->
<bean id="book" class="com.kiong.spring6.Book">
<property name="name" value="《理想国》"></property>
<property name="price" value="29.8" ></property>
</bean>
</beans>
最后,编写测试类TestBook,运行测试
package com.kiong.spring6;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestBook {
@Test
public void testBookSetter(){
ApplicationContext context =
new ClassPathXmlApplicationContext("beanBook.xml");
Book book = (Book) context.getBean("book");
book.printInfo();
}
}
最终运行结果如下。这说明,在beanBook.xml中,成功把“《理想国》”和“29.8”通过set方法传入。
过程中,遇到一个错误:
WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'book' defined in class path resource [beanBook.xml]: Failed to instantiate [com.kiong.spring6.Book]: No default constructor found
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'book' defined in class path resource [beanBook.xml]: Failed to instantiate [com.kiong.spring6.Book]: No default constructor found
解决办法:
一开始没有写默认的无参构造函数,写上即可。这提醒我们,用property给实体类的属性赋值时,要给实体类加上空构造器。