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"?>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"> id="user" class="com.lydetails.ssm.Test.User" > name="name" value="tom"> name="age" value="19"> name="car" ref="car"> id="car" class="com.lydetails.ssm.Test.Car"> name="name" value="SUV"> name="color" value="white">
关键代码就是:
用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; }
然后在配置文件中进行配置
id="user2" class="com.lydetails.ssm.Test.User" >
name="name" value="constour">
name="age" value="100">
name="car" ref="car">
就可以使用了,但是问题来了,构造函数不止一种,比如如下
public User(Car car,String name, Integer age) { this.name = name; this.age = age; this.car = car; }
构造函数中了逻辑发生了改变,那么你执行配置文件的时候,执行构造注入是没有顺序的,所以不能标明你使用的哪个构造函数,为了解决这个问题,就需要使用构造函数注入中的index属性,标识构造函数的顺序,源代码如下:
id="user2" class="com.lydetails.ssm.Test.User" >
name="name" value="constour" index="1">
name="age" value="100" index="2">
name="car" ref="car" index="0">
不过这时候问题又来了,就是参数的类型,你要对参数的类型进行控制啊,比如下面这个构造函数,第二个参数传入的是一个Integer类型:
public User(Car car,Integer name, Integer age) { this.name = name+""; this.age = age; this.car = car; }
那么也需要在配置文件中标出:
id="user2" class="com.lydetails.ssm.Test.User" >
name="name" value="8888" index="1" type="java.lang.Integer">
name="age" value="100" index="2">
name="car" ref="car" index="0">
最终结果如下:
构造函数注入的总结:
index:表示参数位置
type:表示参数类型
其他类型注入基本不会用,就不介绍了