04 Spring的依赖注入
Posted 金子开发者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了04 Spring的依赖注入相关的知识,希望对你有一定的参考价值。
依赖注入: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 方法的方式
涉及的标签:
property
属性:
name:找的是类中 set 方法后面的部分
ref:给属性赋值是其他 bean 类型的
value:给属性赋值是基本数据类型和 string 类型的
实际开发中,此种方式用的较多。
优势:创建对象时没有明确的限制,可以直接使用默认构造函数
弊端:如果有某个成员必须有值,则获取对象是有可能set方法没有执行。
集合属性注入
顾名思义,就是给类中的集合成员传值,它用的也是set方法注入的方式,只不过变量的数据类型都是集合。
我们这里介绍注入数组,List,Set,Map,Properties。具体代码如下:
Car3.java
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); } }
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> <!--集合属性注入--> <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>
SpringTest.java
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(); } }
复杂类型的注入/集合类型的注入
用于给List结构集合注入标签:
list array set
用于Map结构集合注入的标签:
map props
结构相同,标签可以互换
你喜欢的代码:点击下载
以上是关于04 Spring的依赖注入的主要内容,如果未能解决你的问题,请参考以下文章
Spring 在没有 @Autowired 注释的构造函数中注入依赖项
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段