第一种:构造器参数注入
第二种:setter方法属性注入(setter方法的规范需要符合JavaBean规范)
第三种:接口注入
注意:Spring 框架规范中通过配置文件配置的方式.只支持构造器参数注入和setter方法属性注入,不支持接口注入 !
测试构造器参数注入:
新建一个类,生成构造器
//目标,构造器参数注入,new car直接将参数的值直接赋值 public class Car { private Integer id; private String name; private Double price; //有参构造 public Car(Integer id, String name, Double price) { this.id = id; this.name = name; this.price = price; } //取值要用getter public Integer getId(){ return this.id; } public String toString() { return "Car [id=" + id + ", name=" + name + ", price=" + price + "]"; } }
配置容器中的bean写法:<>
<!-- 构造器注入属性的值 --> <bean id="car" class="com.igeek.xmlpropertydi.Car"> <!--constructor-arg:告诉spring容器,要调用有参构造方法了,不再调用默认的构造方法了 new Car(1,"宝马",99999d) 参数第一组:定位属性 * index:根据索引定位属性,0表示第一个位置 * name:根据属性参数名称定位属性 * type:根据属性数据类型定位属性 参数第二组:值 * value:简单的值,字符串 * ref:复杂的(由spring容器创建的bean对象) --> <!-- <constructor-arg index="0" value="1"/> --> <constructor-arg index="0" name="id" value="1"/> <!-- <constructor-arg name="name" value="宝马1代"/> --> <constructor-arg name="name" > <value>宝马2代</value> </constructor-arg> <constructor-arg type="java.lang.Double" value="99999d"/> </bean>
测试构造器生成对象:
@Test public void test(){ //spring容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //获取car Car car =(Car) applicationContext.getBean("car"); System.out.println(car); }
测试setXxx方法属性注入property:
创建Person类,设置属性,setget方法:
public class Person { private Integer id; private String name; private Car car; //必须提供setter属性方法 public void setId(Integer id) { this.id = id; } public void setName(String name) { this.name = name; } public void setCar(Car car) { this.car = car; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", car=" + car + "]"; } }
配置spring容器中的bean写法:------->property
<!-- setter方法属性注入:调用默认构造器,相当于new Person() --> <bean id="person" class="com.igeek.xmlpropertydi.Person"> <!-- property:专门进行setter属性注入用的标签 。 * name:setter方法的属性的名字,例如SetXxx-那么name的属性值为xxx。 * value:简单的值 * ref:bean的名字,对象的引用 --> <property name="id" value="1001"/> <property name="name" value="Tom"/> <!-- <property name="car" ref="car"/> --><!--等同于--> <property name="car"> <ref bean="car"/> </property> </bean>
测试set注入bean属性:
@Test public void test1(){ //spring容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //获取人 Person person=(Person)applicationContext.getBean("person"); System.out.println(person); }
引入P命名空间:为简化set方法属性依赖注入
需要引入p名称空间:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" 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">
对比 set---->preporty与p命名写法
<!-- p命名空间写法--> <bean id="person2" class="com.igeek.xmlpropertydi.Person" p:id="1002" p:name="关羽" p:car-ref="car"/> <!-- property写法--> <bean id="person" class="com.igeek.xmlpropertydi.Person"> <!-- property:专门进行setter属性注入用的标签 。 * name:setter方法的属性的名字,例如SetXxx-那么name的属性值为xxx。 * value:简单的值 * ref:bean的名字,对象的引用 --> <property name="id" value="1001"/> <property name="name" value="Tom"/> <!-- <property name="car" ref="car"/> --><!--等同于--> <property name="car"> <ref bean="car"/> </property> </bean>