依赖注入: Dependency Injection. 它是 spring 框架核心 IoC 的具体实现.
我们的程序在编写时, 通过控制反转, 把对象的创建交给了 spring, 但是代码中不可能出现没有依赖的情况.
IoC 解耦只是降低他们的依赖关系, 但不会消除. 例如: 我们的业务层仍会调用持久层的方法.
那这种业务层和持久层的依赖关系, 在使用 spring 之后, 就让 spring 来维护了.
简单的说, 就是坐等框架把持久层对象传入业务层, 而不用我们自己去获取.
构造函数注入
顾名思义, 就是使用类中的构造函数, 给成员变量赋值. 注意, 赋值的操作不是我们自己做的, 而是通过配置的方式, 让 spring 框架来为我们注入. 具体代码如下:
Car.java
- package com.itzn.model;
- import java.util.Date;
- public class Car {
- private String name;
- private long price;
- private Date buyDate;
- public Car(String _name, long _price, Date _buyDate) {
- name = _name;
- price = _price;
- buyDate = _buyDate;
- }
- public void MyStr() {
- System.out.println("name=" + name + ",price=" + price + ",buyDate=" + buyDate);
- }
- }
bean.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="car" class="com.itzn.model.Car">
- <constructor-arg name="_name" value="逍客"></constructor-arg>
- <constructor-arg name="_price" value="200000"></constructor-arg>
- <constructor-arg name="_buyDate" ref="now"></constructor-arg>
- </bean>
- <bean id="now" class="java.util.Date"></bean>
- </beans>
SpringTest.java
- public class SpringTest {
- public static void main(String[] args) {
- ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
- Car car=(Car) ac.getBean("car");
- car.MyStr();
- }
- }
使用构造函数的方式, 要求:
类中需要提供一个对应参数列表的构造函数.
constructor-arg
属性:
index: 指定参数在构造函数参数列表的索引位置
type: 指定参数在构造函数中的数据类型
name: 指定参数在构造函数中的名称 用这个找给谁赋值
======= 上面三个都是找给谁赋值, 下面两个指的是赋什么值的 ==============
value: 它能赋的值是基本数据类型和 String 类型
ref: 它能赋的值是其他 bean 类型, 也就是说, 必须得是在配置文件中配置过的 bean
优势: 在获取 bean 对象时, 注入数据是必须的操作, 否则对象无法创建成功.
弊端: 改变了 bean 对象的实例化方式, 使我们在创建对象时, 如果用不到这些数据, 也必须提供.
set 方法注入
顾名思义, 就是在类中提供需要注入成员的 set 方法. 具体代码如下:
Car2.java
- package com.itzn.model;
- import java.util.Date;
- public class Car2 {
- private String name;
- private long price;
- private Date buyDate;
- public void setName(String name) {
- this.name = name;
- }
- public void setPrice(long price) {
- this.price = price;
- }
- public void setBuyDate(Date buyDate) {
- this.buyDate = buyDate;
- }
- public void MyStr() {
- System.out.println("name=" + name + ",price=" + price + ",buyDate=" + buyDate);
- }
- }
bean.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="car" class="com.itzn.model.Car">
- <constructor-arg name="_name" value="逍客"></constructor-arg>
- <constructor-arg name="_price" value="200000"></constructor-arg>
- <constructor-arg name="_buyDate" ref="now"></constructor-arg>
- </bean>
- <bean id="now" class="java.util.Date"></bean>
- <!--set 注入 -->
- <bean id="dasauto" class="com.itzn.model.Car2">
- <property name="name" value="朗逸"></property>
- <property name="price" value="150000"></property>
- <property name="buyDate" ref="now"></property>
- </bean>
- </beans>
SpringTest.java
- package com.itzn.test;
- import com.itzn.model.Car;
- import com.itzn.model.Car2;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class SpringTest {
- public static void main(String[] args) {
- ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
- Car car=(Car) ac.getBean("car");
- Car2 car2=(Car2) ac.getBean("dasauto");
- car.MyStr();
- car2.MyStr();
- }
- }
使用 set 方法的方式
- package com.itzn.model;
- import java.util.*;
- public class Car3 {
- private String[] myStrs;
- private List<String> myList;
- private Set<String> mySet;
- private Map<String,String> myMap;
- private Properties myProps;
- public void setMyStrs(String[] myStrs) {
- this.myStrs = myStrs; }
- public void setMyList(List<String> myList) {
- this.myList = myList; }
- public void setMySet(Set<String> mySet) {
- this.mySet = mySet; }
- public void setMyMap(Map<String, String> myMap) {
- this.myMap = myMap; }
- public void setMyProps(Properties myProps) {
- this.myProps = myProps; }
- public void MyStr() {
- System.out.println(Arrays.toString(myStrs));
- System.out.println(myList);
- System.out.println(mySet);
- System.out.println(myMap);
- System.out.println(myProps);
- }
- }
- <?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="car" class="com.itzn.model.Car">
- <constructor-arg name="_name" value="逍客"></constructor-arg>
- <constructor-arg name="_price" value="200000"></constructor-arg>
- <constructor-arg name="_buyDate" ref="now"></constructor-arg>
- </bean>
- <bean id="now" class="java.util.Date"></bean>
- <!--set 注入 -->
- <bean id="dasauto" class="com.itzn.model.Car2">
- <property name="name" value="朗逸"></property>
- <property name="price" value="150000"></property>
- <property name="buyDate" ref="now"></property>
- </bean>
- <!-- 集合属性注入 -->
- <bean id="autos" class="com.itzn.model.Car3">
- <!-- 在注入集合数据时, 只要结构相同, 标签可以互换 -->
- <!-- 给数组注入数据 -->
- <property name="myStrs">
- <set>
- <value > 一汽大众 </value>
- <value > 上海大众 </value>
- <value > 一汽奥迪 </value>
- </set>
- </property>
- <!-- 注入 list 集合数据 -->
- <property name="myList">
- <array>
- <value > 奔驰 </value>
- <value > 宝马 </value>
- <value > 奥迪 </value>
- </array>
- </property>
- <!-- 注入 set 集合数据 -->
- <property name="mySet">
- <list>
- <value > 丰田 </value>
- <value > 本田 </value>
- <value > 日产 </value>
- </list>
- </property>
- <!-- 注入 Map 数据 -->
- <property name="myMap">
- <props>
- <prop key="dasauto"> 大众迈腾 </prop>
- <prop key="aodi">A6L</prop>
- </props>
- </property>
- <!-- 注入 properties 数据 -->
- <property name="myProps">
- <map>
- <entry key="keyA" value="aaa">
- </entry>
- <entry key="keyB">
- <value>bbb</value>
- </entry>
- </map>
- </property>
- </bean>
- </beans>
- package com.itzn.test;
- import com.itzn.model.Car;
- import com.itzn.model.Car2;
- import com.itzn.model.Car3;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class SpringTest {
- public static void main(String[] args) {
- ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
- Car car=(Car) ac.getBean("car");
- Car2 car2=(Car2) ac.getBean("dasauto");
- Car3 car3=(Car3) ac.getBean("autos");
- car.MyStr();
- car2.MyStr();
- car3.MyStr();
- }
- }
来源: http://www.bubuko.com/infodetail-3344943.html