javascript
Spring DI(依赖注入)
DI依賴注入
- IoC(Inversion Of Control)控制翻轉,Spring反向控制應用程序所需要使用的外部資源
- DI(Dependency Injection)依賴注入,應用程序運行依賴的資源由Spring為其提供,資源進入應用程序的方式稱為注入
- 站在spring角度就是ioc,站在應用程序角度就是di
- 可以理解為Spring提供的給對象賦值的功能
IoC與DI的關系:IoC與DI是同一件事站在不同角度看待問題
set注入:
-
名稱:property
-
類型:標簽
-
歸屬:bean標簽
-
作用:使用set方法的形式為bean提供資源
格式:
<bean><property/></bean>基本屬性:
<!--property: 調用set方法注入參數/屬性值name: 屬性名稱value: 注入的值--> <property name="propertyName" value="propertyValue" ref="beanId"/>- name:對應bean中的屬性名,要求該屬性必須提供可訪問的set方法(嚴格規范為此名稱是set方法對應名稱)
- value:設定非引用類型屬性對應的值,不能與ref同時使用
- ref:設定引用類型屬性對應bean的id ,不能與value同時使用
- 注意:一個bean可以有多個property標簽
- Set注入,包裝類型也會被看做是普通的數據類型去用,都用value,注入對象用ref,其他用value
演示:
public interface UserDao {void save(); } public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("UserDao執行");} } public class UserServiceImpl implements UserService {// 添加引用類型和非引用的變量private UserDao userDao;private int num;private String version;// 1、對需要注入的變量添加set方法public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void setNum(int num) {this.num = num;}public void setVersion(String version) {this.version = version;}@Overridepublic void save() {System.out.println("UserService執行" + num + version);userDao.save();} } <?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--><bean id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl"><!--將要注入的引用類型的變量通過property實行進行注入,對應的name是注入的變量名,ref是bean的id,Integer也是非引用--><!--引用類型用ref 其他都用value--><property name="userDao" ref="userDao"/><property name="num" value="1998"/><property name="version" value="itzhuzhu"/></bean><!--2、將要注入的資源聲明為bean--><bean id="userDao" class="com.itzhuzhu.service.dao.impl.UserDaoImpl"/> </beans>構造器注入
-
名稱:constructor-arg
-
類型:標簽
-
歸屬:bean標簽
-
作用:使用構造方法的形式為bean提供資源,兼容早期遺留系統的升級工作
-
格式:
- 基本屬性:
? name:對應bean中的構造方法所攜帶的參數名
? value:設定非引用類型構造方法參數對應的值,不能與ref同時使用
其他屬性:
<constructor-arg index="arg-index" type="arg-type" ref="beanId"/>- ref:設定引用類型構造方法參數對應bean的id ,不能與value同時使用
- type :設定構造方法參數的類型,用于按類型匹配參數或進行類型校驗
- index :設定構造方法參數的位置,用于按位置匹配參數,參數index值從0開始計數
- 注意:一個bean可以有多個constructor-arg標簽
集合類型數據注入:
-
名稱:array,list,set,map,props
-
類型:標簽
-
歸屬:property標簽 或 constructor-arg標簽
-
作用:注入集合數據類型屬性
-
格式:
演示:
public class BookDaoImpl implements BookDao {private ArrayList al;private Properties properties;private int[] arr;private HashSet hs;private HashMap hm ;public void setAl(ArrayList al) {this.al = al;}public void setProperties(Properties properties) {this.properties = properties;}public void setArr(int[] arr) {this.arr = arr;}public void setHs(HashSet hs) {this.hs = hs;}public void setHm(HashMap hm) {this.hm = hm;}public void save() {System.out.println("book dao running...");System.out.println("ArrayList:"+al);System.out.println("Properties:"+properties);for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}System.out.println("HashSet:"+hs);System.out.println("HashMap:"+hm);} }配置文件
<bean id="userDao" class="com.itzhuzhu.dao.impl.UserDaoImpl"/><bean id="userService" class="com.itzhuzhu.Service.impl.UserServiceImpl" p:bookDao-ref="bookDao" p:userDao-ref="userDao"/><bean id="bookDao" class="com.itzhuzhu.dao.impl.BookDaoImpl"><property name="al"><list><value>itzhuzhu</value><value>666666</value></list></property><property name="properties"><props><prop key="name">itzhuzhu123</prop><prop key="value">666666</prop></props></property><property name="arr"><array><value>12345</value><value>666666</value></array></property><property name="hs"><set><value>itzhuzhu</value><value>666666</value></set></property><property name="hm"><map><entry key="name" value="itzhuzhu123"/><entry key="value" value="666666"/></map></property></bean>UserServiceImpl調用BookDao的save();
使用p命名空間簡化配置
-
名稱:p:propertyName,p:propertyName-ref
-
類型:屬性
-
歸屬:bean標簽
-
作用:為bean注入屬性值
-
格式:
- 注意:使用p命令空間需要先開啟spring對p命令空間的的支持,在beans標簽中添加對應空間支持
演示:
<bean id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl" p:userDao-ref="userDao"p:bookDao-ref="bookDao"/>C標簽代替構造方法
SpEL
Spring提供了對EL表達式的支持,統一屬性注入格式
-
類型:屬性值
-
歸屬:value屬性值
-
作用:為bean注入屬性值
-
格式:
-
注意:所有屬性值不區分是否引用類型,統一使用value賦值
-
所有格式統一使用 value=“********”
-
常量 #{10} #{3.14} #{2e5} #{‘itcast’}
-
引用bean #{beanId}
-
引用bean屬性 #{beanId.propertyName}
-
引用bean方法 beanId.methodName().method2()
-
引用靜態方法 T(java.lang.Math).PI
-
運算符支持 #{3 lt 4 == 4 ge 3}
-
正則表達式支持 #{user.name matches‘[a-z]{6,}’}
-
集合支持 #{likes[3]}
-
演示:
<bean id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl"><property name="userDao" value="#{userDao}"/><property name="bookDao" value="#{bookDao}"/><property name="num" value="#{666666666}"/><property name="version" value="#{'itzhuzhu'}"/> 字符加單引號</bean>properties文件
Spring提供了讀取外部properties文件的機制,使用讀取到的數據為bean的屬性賦值
操作步驟
1.準備外部properties文件
2.開啟context命名空間支持
xmlns:context=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xds"3.加載指定的properties文件
<context:property-placeholder location="classpath:filename.properties"/> <context:property-placeholder location="classpath:*.properties"/>4.使用加載的數據
<bean id="userDao" class="com.itzhuzhu.service.impl.UserDaoImpl"><!--name是對應的屬性名,value是對應配置文件的屬性名--><!--<property name="propertyName" value="${propertiesName}"/>--><property name="userName" value="${username}"/><property name="password" value="${password}"/></bean>-
注意:如果需要加載所有的properties文件,可以使用*.properties表示加載所有的properties文件
-
注意:讀取數據使用${propertiesName}格式進行,其中propertiesName指properties文件中的屬性名
import導入配置文件
-
名稱:import
-
類型:標簽
-
歸屬:beans標簽
-
作用:在當前配置文件中導入其他配置文件中的項
-
格式:
基本屬性:
resource:加載的配置文件名 <import resource=“applicationContext-user.xml"/>? resource:加載的配置文件名
- Spring容器加載多個配置文件
-
Spring容器中的bean定義沖突問題
-
同id的bean,后定義的覆蓋先定義的
-
導入配置文件可以理解為將導入的配置文件復制粘貼到對應位置
-
導入配置文件的順序與位置不同可能會導致最終程序運行結果不同
-
ApplicationContext
ApplicationContext是一個接口,提供了訪問spring容器的API
ClassPathXmlApplicationContext是一個類,實現了上述功能
ApplicationContext的頂層接口是BeanFactory
BeanFactory定義了bean相關的最基本操作
ApplicationContext在BeanFactory基礎上追加了若干新功能
對比BeanFactory
BeanFactory創建的bean采用延遲加載形式,使用才創建
ApplicationContext創建的bean默認采用立即加載形式
FileSystemXmlApplicationContext
可以加載文件系統中任意位置的配置文件,而ClassPathXmlApplicationContext只能加載類路徑下的配置文件
BeanFactory
Resource res = new ClassPathResource("applicationContext.xml"); BeanFactory bf = new XmlBeanFactory(res); UserService userService = (UserService)bf.getBean("userService");第三方資源配置
阿里數據源方案Druid
總結
以上是生活随笔為你收集整理的Spring DI(依赖注入)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java位运算求幂,程序员必学:快速幂算
- 下一篇: matlab图像信息熵交叉熵,【机器学习