set方法函数注入
构造函数注入
set方法函数注入:解决依赖问题
我们这里有两个类User和Car,其中Car在User类中,因为Spring不是怎么自己产生对象,而是容器产生,那么如何将car注入到User中了,我们用Set方法注入。将其注入。
先建立两个类,User和Car,并在User中申明Car.两个类的源代码如下:
car:
package com.lydetails.ssm.Test; public class Car { private String name; private String color; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public Car() { } @Override public String toString() { return "Car{" + "name='" + name + '\'' + ", color='" + color + '\'' + '}'; } }
User:
package com.lydetails.ssm.Test; public class User { private String name; private Integer age; private Car car; public User() { System.out.println("User构造函数"); } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + ", car=" + car + '}'; } public void setCar(Car car) { this.car = car; } public Car getCar() { return car; } }
然后在配置文件中将两个Bean配置出来,源代码如下:
<?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="user" class="com.lydetails.ssm.Test.User" > <property name="name" value="tom"></property> <property name="age" value="19"></property> <property name="car" ref="car"></property> </bean> <bean id="car" class="com.lydetails.ssm.Test.Car"> <property name="name" value="SUV"></property> <property name="color" value="white"></property> </bean> </beans>
关键代码就是:
<property name="car" ref="car"></property>
用ref将两个Bean连接起来。
然后进行测试,源代码如下:
@Test //测试set注入 public void func4() { //加载配置文件 ApplicationContext apl = new ClassPathXmlApplicationContext("ApplicationContext.xml"); User users = (User) apl.getBean("user"); System.out.println(users); }
结果如下:
构造函数注入:
构造函数的注入就和set的构造函数相同,只需要在User类中生命构造函数
public User(String name, Integer age, Car car) { this.name = name; this.age = age; this.car = car; }
然后在配置文件中进行配置
<bean id="user2" class="com.lydetails.ssm.Test.User" > <constructor-arg name="name" value="constour"></constructor-arg> <constructor-arg name="age" value="100"></constructor-arg> <constructor-arg name="car" ref="car"></constructor-arg> </bean>
就可以使用了,但是问题来了,构造函数不止一种,比如如下
public User(Car car,String name, Integer age) { this.name = name; this.age = age; this.car = car; }
构造函数中了逻辑发生了改变,那么你执行配置文件的时候,执行构造注入是没有顺序的,所以不能标明你使用的哪个构造函数,为了解决这个问题,就需要使用构造函数注入中的index属性,标识构造函数的顺序,源代码如下:
<bean id="user2" class="com.lydetails.ssm.Test.User" > <constructor-arg name="name" value="constour" index="1"></constructor-arg> <constructor-arg name="age" value="100" index="2"></constructor-arg> <constructor-arg name="car" ref="car" index="0"></constructor-arg> </bean>
不过这时候问题又来了,就是参数的类型,你要对参数的类型进行控制啊,比如下面这个构造函数,第二个参数传入的是一个Integer类型:
public User(Car car,Integer name, Integer age) { this.name = name+""; this.age = age; this.car = car; }
那么也需要在配置文件中标出:
<bean id="user2" class="com.lydetails.ssm.Test.User" > <constructor-arg name="name" value="8888" index="1" type="java.lang.Integer"></constructor-arg> <constructor-arg name="age" value="100" index="2"></constructor-arg> <constructor-arg name="car" ref="car" index="0"></constructor-arg> </bean>最终结果如下:
构造函数注入的总结:
index:表示参数位置
type:表示参数类型
其他类型注入基本不会用,就不介绍了