1、什么是IoC
- IoC—Inverse of Control,控制反轉,將對象的創建權力反轉給Spring框架
- 控制反轉是為了降低程序耦合度,提高程序擴展力,達到OCP原則,達到DIP原則
- OCP開閉原則:在軟件開發過程中應當對擴展開放,對修改關閉
-
DIP依賴倒置原則:主要倡導面向抽象編程,面向接口編程,不要面向具體編程
- 所謂的反轉,是指?
- 將對象的創建權利交出去,交給第三方容器負責
- 將對象和對象之間關系的維護權交出去,交給第三方容器負責
- 如何實現IoC
-
DI(Dependency Injection):依賴注入
-
2、DI——依賴注入
-
Spring是通過依賴注入的方式來完成Bean管理的(Bean管理說的是:Bean對象的創建,以及Bean對象中屬性的賦值或者叫做Bean對象之間關系的維護)
-
什么是DI
-
依賴指的是對象和對象之間的關聯關系
-
注入指的是一種數據傳遞行為,通過注入行為來讓對象和對象產生關系
-
- DI的常見方式
- set方法注入
- 構造方法注入
- set方法注入:
- set注入,顯然,是基于set方法來完成的,底層會通過反射機制調用屬性對應的set方法然后給屬性賦值。這種方式要求屬性必須對外提供set方法。
- 請看下例:
-
//持久層 public class OrderDaoImpl implements OrderDao {@Overridepublic void saveOrder() {System.out.println("持久層:保存訂單...");} } //業務邏輯層 public class OrderServiceImpl implements OrderService {// 編寫成員屬性,一定需要提供該屬性的set方法private OrderDao orderDao;// 一定需要提供該屬性的set方法,IOC容器底層就通過屬性的set方法方式注入值public void setOrderDao(OrderDao orderDao) {this.orderDao = orderDao;}// 消息private String msg;// 年齡private int age;public void setMsg(String msg) {this.msg = msg;}public void setAge(int age) {this.age = age;}@Overridepublic void saveOrder() {System.out.println("業務層:保存訂單..."+msg+" - "+age);// 調用orderDao.saveOrder();} } <!--spring的配置文件--> <!--DI:依賴注入--> <bean id="os" class="cn.tx.service.OrderServiceImpl"><property name="orderDao" ref="od" /><property name="msg" value="你好" /><property name="age" value="30" /> </bean> <bean id="od" class="cn.tx.dao.OrderDaoImpl"></bean>
- 實現原理:
- 通過property標簽獲取到屬性名:orderDao、msg、age?
- property標簽的name是屬性名。
- ref是要注入的bean對象的id,是引用
- 通過屬性名推斷出set方法名:setOrderDao、setMsg、setAge(這里讀者可以去測試一下,當我們把set方法注釋掉后會報錯,指出沒有setter方法)
- 通過反射機制調用setOrderDao()、setMsg()、setAge()方法給屬性賦值
- 通過property標簽獲取到屬性名:orderDao、msg、age?
-
- 構造方法注入
-
通過調用構造方法來給屬性賦值。
-
如下例:
-
public class Car {// 名稱private String cname;// 金額private Double money;public Car(String cname, Double money) {this.cname = cname;this.money = money;}@Overridepublic String toString() {return "Car{" +"cname='" + cname + '\'' +", money=" + money +'}';} }//核心配置文件 <bean id="car" class="cn.tx.demo2.Car"><constructor-arg name="cname" value="大奔" /><constructor-arg name="money" value="400000" /></bean>
-
-
3、數組,集合(List,Set,Map),Properties等的注入
這里直接上代碼,首先我們先創建一個CollectionBean的對象,用來完成該案例
public class CollectionBean {// 數組private String [] strs;public void setStrs(String[] strs) {this.strs = strs;}private List<String> list;public void setList(List<String> list) {this.list = list;}private Map<String,String> map;public void setMap(Map<String, String> map) {this.map = map;}private Properties properties;public void setProperties(Properties properties) {this.properties = properties;}@Overridepublic String toString() {return "CollectionBean{" +"strs=" + Arrays.toString(strs) +", list=" + list +", map=" + map +", properties=" + properties +'}';}
}
?spring的配置文件
<!--給集合屬性注入值--><bean id="collectionBean" class="cn.tx.demo3.CollectionBean"><property name="strs"><array><value>美美</value><value>小鳳</value></array></property><property name="list"><list><value>熊大</value><value>熊二</value></list></property><property name="map"><map><entry key="aaa" value="老王"/><entry key="bbb" value="小王"/></map></property><property name="properties"><props><prop key="username">root</prop><prop key="password">123456</prop></props></property></bean>
4、關于Spring的配置文件
-
Spring引入外部屬性配置文件
-
我們這里以jdbc的信息為例,在類路徑下新建jdbc.properties文件
-
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/spring username=root password=root123
-
- ?在spring配置文件中引入context命名空間。
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"></beans>
-
-
在spring中配置使用jdbc.properties文件。
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><context:property-placeholder location="jdbc.properties"/><bean id="dataSource" class="com.powernode.spring6.beans.MyDataSource"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></bean> </beans>
-
-
- 配置多個spring的配置文件
-
主配置文件中包含其他的配置文件: <import resource="applicationContext2.xml"/>工廠創建的時候直接加載多個配置文件: ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "applicationContext.xml","applicationContext2.xml");
-
?