您的位置:首页 > 编程语言 > Java开发

Spring学习--依赖注入的方式

2017-02-28 15:57 309 查看
Spring 依赖注入:

属性注入(最常使用)

构造函数注入

工厂方法注入(很少使用,不推荐)

属性注入:通过 setter 方法注入 Bean 的属性值或依赖的对象 , 使用<property> 元素 , 使用 name 属性指定 Bean 的属性名称 , value 属性或 <value> 子节点指定属性值。

<?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="person" class="com.itdjx.spring.dependency.injection.Person">
<property name="name" value="张三" />
<property name="age" value="23" />
<property name="sex" value="男" />
</bean>

</beans>


package com.itdjx.spring.dependency.injection;

/**
* 属性注入
*
* @author Wáng Chéng Dá
* @create 2017-02-28 15:14
*/
public class Person {

private String name;

private String sex;

private int age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}


package com.itdjx.spring.dependency.injection;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* 依赖注入main
*
* @author Wáng Chéng Dá
* @create 2017-02-28 15:16
*/
public class MainIOC {

public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationConfig.xml");
Person person = (Person) app.getBean("person");
System.out.println(person);
}
}


控制台输出:

Person{name='张三', sex='男', age=23}
构造函数注入:通过构造函数注入 Bean 的属性值或依赖的对象 , 它保证了 Bean 实例在实例化后就可以使用。构造函数注入在 <constructor-arg> 元素里声明属性 , 没有 name 属性。

<?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="person" class="com.itdjx.spring.dependency.injection.Person">
<property name="name" value="张三" />
<property name="age" value="23" />
<property name="sex" value="男" />
</bean>

<bean id="car" class="com.itdjx.spring.dependency.injection.Car">
<constructor-arg value="BaoMa"/>
<constructor-arg value="HuaChen"/>
<constructor-arg value="230000"/>
</bean>

</beans>


package com.itdjx.spring.dependency.injection;

/**
* 构造器注入
*
* @author Wáng Chéng Dá
* @create 2017-02-28 15:32
*/
public class Car {

private String brand;

private String address;

private double price;

private int maxSpeed;

public Car(String brand, String address, double price) {
this.brand = brand;
this.address = address;
this.price = price;
}

public Car(String brand, String address, int maxSpeed) {
this.brand = brand;
this.address = address;
this.maxSpeed = maxSpeed;
}

public Car(String brand, double price, int maxSpeed) {
this.brand = brand;
this.price = price;
this.maxSpeed = maxSpeed;
}

public Car() {
}

@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", address='" + address + '\'' +
", price=" + price +
", maxSpeed=" + maxSpeed +
'}';
}
}


package com.itdjx.spring.dependency.injection;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* 依赖注入main
*
* @author Wáng Chéng Dá
* @create 2017-02-28 15:16
*/
public class MainIOC {

public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationConfig.xml");
Person person = (Person) app.getBean("person");
System.out.println(person);

Car car = (Car) app.getBean("car");
System.out.println(car);
}
}


控制台输出:

Person{name='张三', sex='男', age=23}
Car{brand='BaoMa', address='HuaChen', price=0.0, maxSpeed=230000}

通过控制台输出我们看到 IOC 容器初始化调用的构造函数出现的匹配问题,匹配不到咱们想要调用的构造函数。这时候我们就得继续给 <constructor-arg> 中添加新的属性。分为:按索引匹配入参(index),按类型匹配入参(type) , 可混合使用,也可同时使用。

<?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="person" class="com.itdjx.spring.dependency.injection.Person">
<property name="name" value="张三" />
<property name="age" value="23" />
<property name="sex" value="男" />
</bean>

<bean id="car" class="com.itdjx.spring.dependency.injection.Car">
<constructor-arg value="BaoMa"/>
<constructor-arg value="HuaChen"/>
<constructor-arg value="230000"/>
</bean>

<bean id="car2" class="com.itdjx.spring.dependency.injection.Car">
<constructor-arg value="BaoMa" index="0"/>
<constructor-arg value="HuaChen" index="1"/>
<constructor-arg value="230000" index="2"/>
</bean>

<bean id="car3" class="com.itdjx.spring.dependency.injection.Car">
<constructor-arg value="BaoMa" index="0"/>
<constructor-arg value="HuaChen" index="1"/>
<constructor-arg value="230000" index="2" type="double"/>
</bean>

<bean id="car4" class="com.itdjx.spring.dependency.injection.Car">
<constructor-arg value="BaoMa" index="0"/>
<constructor-arg value="HuaChen" index="1"/>
<constructor-arg value="230" type="int"/>
</bean>

</beans>


package com.itdjx.spring.dependency.injection;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* 依赖注入main
*
* @author Wáng Chéng Dá
* @create 2017-02-28 15:16
*/
public class MainIOC {

public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationConfig.xml");
Person person = (Person) app.getBean("person");
System.out.println(person);
System.out.println("----------------------");

Car car = (Car) app.getBean("car");
System.out.println(car);
System.out.println("----------------------");

car = (Car) app.getBean("car2");
System.out.println(car);
System.out.println("----------------------");

car = (Car) app.getBean("car3");
System.out.println(car);
System.out.println("----------------------");

car = (Car) app.getBean("car4");
System.out.println(car);
System.out.println("----------------------");
}
}


控制台输出:

Person{name='张三', sex='男', age=23}
----------------------
Car{brand='BaoMa', address='HuaChen', price=0.0, maxSpeed=230000}
----------------------
Car{brand='BaoMa', address='HuaChen', price=0.0, maxSpeed=230000}
----------------------
Car{brand='BaoMa', address='HuaChen', price=230000.0, maxSpeed=0}
----------------------
Car{brand='BaoMa', address='HuaChen', price=0.0, maxSpeed=230}
----------------------

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: