Spring——IOC(控制反轉)
一、IOC容器
1、什麼是IOC(控制反轉)
a)把對象創建和對象之間的調用過程,交給Spring進行管理
b)使用IOC目的:爲了降低耦合度
2、IOC底層
a)xml解析、工廠模式、反射
3、Spring提供的IOC容器實現的兩種方式(兩個接口)
a)BeanFactory接口:IOC容器基本實現是Spring內部接口的使用接口,不提供給開發人員進行使用(加載配置文件時候不會創建對象,在獲取對象時纔會創建對象。)
b)ApplicationContext接口:BeanFactory接口的子接口,提供更多更強大的功能,提供給開發人員使用(加載配置文件時候就會把在配置文件對象進行創建)推薦使用!
4、ApplicationContext接口的實現類(具體根據API文檔查看☺)
二、IOC容器-Bean管理
1、IOC操作Bean管理
a)Bean管理就是兩個操作:(1)Spring創建對象;(2)Spring注入屬性
2、基於XML配置文件創建對象
<!--1 配置User對象創建-->
<bean id="user" class="com.atguigu.spring5.User"></bean>
3、基於XML方式注入屬性(DI:依賴注入(注入屬性))
a)set方式注入
//(1)傳統方式: 創建類,定義屬性和對應的set方法
public class Book {
//創建屬性
private String bname;
//創建屬性對應的set方法
public void setBname(String bname) {
this.bname = bname;
}
}
<!--(2)spring方式: set方法注入屬性-->
<bean id="book" class="com.atguigu.spring5.Book">
<!--使用property完成屬性注入
name:類裏面屬性名稱
value:向屬性注入的值
-->
<property name="bname" value="Hello"></property>
<property name="bauthor" value="World"></property>
</bean>
b)有參構造函數注入
//(1)傳統方式:創建類,構建有參函數
public class Orders {
//屬性
private String oname;
private String address;
//有參數構造
public Orders(String oname,String address) {
this.oname = oname;
this.address = address;
}
}
<!--(2)spring方式:有參數構造注入屬性-->
<bean id="orders" class="com.atguigu.spring5.Orders">
<constructor-arg name="oname" value="Hello"></constructor-arg>
<constructor-arg name="address" value="China!"></constructor-arg>
</bean>
c)p名稱空間注入(瞭解即可)
<!--1、添加p名稱空間在配置文件頭部-->
<?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:p="http://www.springframework.org/schema/p" <!--在這裏添加一行p-->
<!--2、在bean標籤進行屬性注入(算是set方式注入的簡化操作)-->
<bean id="book" class="com.atguigu.spring5.Book" p:bname="very" p:bauthor="good">
</bean>
4、注入空值和特殊符號
<bean id="book" class="com.atguigu.spring5.Book">
<!--(1)null值-->
<property name="address">
<null/><!--屬性裏邊添加一個null標籤-->
</property>
<!--(2)特殊符號賦值-->
<!--屬性值包含特殊符號
a 把<>進行轉義 < >
b 把帶特殊符號內容寫到CDATA
-->
<property name="address">
<value><![CDATA[<<南京>>]]></value>
</property>
</bean>
5、注入屬性-外部bean
a)創建兩個類service和dao類
public class UserService {//service類
//創建UserDao類型屬性,生成set方法
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add() {
System.out.println("service add...............");
userDao.update();//調用dao方法
}
}
public class UserDaoImpl implements UserDao {//dao類
@Override
public void update() {
System.out.println("dao update...........");
}
}
b)在spring配置文件中進行配置
<!--1 service和dao對象創建-->
<bean id="userService" class="com.atguigu.spring5.service.UserService">
<!--注入userDao對象
name屬性:類裏面屬性名稱
ref屬性:創建userDao對象bean標籤id值
-->
<property name="userDao" ref="userDaoImpl"></property>
</bean>
<bean id="userDaoImpl" class="com.atguigu.spring5.dao.UserDaoImpl"></bean>
6、基於XML方式注入內部bean和級聯賦值
a)注入屬性-內部bean
(1)一對多關係:部門和員工
一個部門有多個員工,一個員工屬於一個部門(部門是一,員工是多)
(2)在實體類之間表示一對多關係,員工表示所屬部門,使用對象類型屬性進行表示
//部門類
public class Dept {
private String dname;
public void setDname(String dname) {
this.dname = dname;
}
}
//員工類
public class Emp {
private String ename;
private String gender;
//員工屬於某一個部門,使用對象形式表示
private Dept dept;
public void setDept(Dept dept) {
this.dept = dept;
}
public void setEname(String ename) {
this.ename = ename;
}
public void setGender(String gender) {
this.gender = gender;
}
}
(3)在spring配置文件中配置
<!--內部bean-->
<bean id="emp" class="com.atguigu.spring5.bean.Emp">
<!--設置兩個普通屬性-->
<property name="ename" value="Andy"></property>
<property name="gender" value="女"></property>
<!--設置對象類型屬性-->
<property name="dept">
<bean id="dept" class="com.atguigu.spring5.bean.Dept"><!--內部bean賦值-->
<property name="dname" value="宣傳部門"></property>
</bean>
</property>
</bean>
b)注入屬性-級聯賦值
<!--方式一:級聯賦值-->
<bean id="emp" class="com.atguigu.spring5.bean.Emp">
<!--設置兩個普通屬性-->
<property name="ename" value="Andy"></property>
<property name="gender" value="女"></property>
<!--級聯賦值-->
<property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="com.atguigu.spring5.bean.Dept">
<property name="dname" value="公關部門"></property>
</bean>
//方式二:生成dept的get方法(get方法必須有!!)
public Dept getDept() {
return dept;
}
<!--級聯賦值-->
<bean id="emp" class="com.atguigu.spring5.bean.Emp">
<!--設置兩個普通屬性-->
<property name="ename" value="jams"></property>
<property name="gender" value="男"></property>
<!--級聯賦值-->
<property name="dept" ref="dept"></property>
<property name="dept.dname" value="技術部門"></property>
</bean>
<bean id="dept" class="com.atguigu.spring5.bean.Dept">
</bean>
7、IOC 操作 Bean 管理——xml 注入集合屬性
1、注入數組類型屬性 2、注入 List 集合類型屬性 3、注入 Map 集合類型屬性
//(1)創建類,定義數組、list、map、set 類型屬性,生成對應 set 方法
public class Stu {
//1 數組類型屬性
private String[] courses;
//2 list集合類型屬性
private List<String> list;
//3 map集合類型屬性
private Map<String,String> maps;
//4 set集合類型屬性
private Set<String> sets;
public void setSets(Set<String> sets) {
this.sets = sets;
}
public void setCourses(String[] courses) {
this.courses = courses;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
<!--(2)在 spring 配置文件進行配置-->
<bean id="stu" class="com.atguigu.spring5.collectiontype.Stu">
<!--數組類型屬性注入-->
<property name="courses">
<array>
<value>java課程</value>
<value>數據庫課程</value>
</array>
</property>
<!--list類型屬性注入-->
<property name="list">
<list>
<value>張三</value>
<value>小三</value>
</list>
</property>
<!--map類型屬性注入-->
<property name="maps">
<map>
<entry key="JAVA" value="java"></entry>
<entry key="PHP" value="php"></entry>
</map>
</property>
<!--set類型屬性注入-->
<property name="sets">
<set>
<value>MySQL</value>
<value>Redis</value>
</set>
</property>
</bean>
8、在集合裏面設置對象類型值
//學生所學多門課程
private List<Course> courseList;//創建集合
public void setCourseList(List<Course> courseList) {
this.courseList = courseList;
}
<!--創建多個course對象-->
<bean id="course1" class="com.atguigu.spring5.collectiontype.Course">
<property name="cname" value="Spring5框架"></property>
</bean>
<bean id="course2" class="com.atguigu.spring5.collectiontype.Course">
<property name="cname" value="MyBatis框架"></property>
</bean>
<!--注入list集合類型,值是對象-->
<property name="courseList">
<list>
<ref bean="course1"></ref>
<ref bean="course2"></ref>
</list>
</property>
<!--第一步:在 spring 配置文件中引入名稱空間 util-->
<?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:util="http://www.springframework.org/schema/util" <!--添加util名稱空間-->
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!--添加util名稱空間-->
<!--第二步:使用 util 標籤完成 list 集合注入提取-->
<!--把集合注入部分提取出來-->
<!--1 提取list集合類型屬性注入-->
<util:list id="bookList">
<value>易筋經</value>
<value>九陰真經</value>
<value>九陽神功</value>
</util:list>
<!--2 提取list集合類型屬性注入使用-->
<bean id="book" class="com.atguigu.spring5.collectiontype.Book" scope="prototype">
<property name="list" ref="bookList"></property>
</bean>