Spring 5--IOC容器管理(一)
阿新 • • 發佈:2021-01-09
一、IOC容器
1、什麼是IOC--控制反轉
- 把物件建立和物件之間的呼叫過程,交給Spring進行管理
- 使用IOC目的:為了降低耦合度
2、IOC底層
-
xml解析、工廠模式、反射
3、Spring提供的IOC容器實現的兩種方式(兩個介面)
- BeanFactory介面:IOC容器基本實現是Spring內部介面的使用介面,不提供給開發人員進行使用(載入配置檔案時候不會建立物件,在獲取物件時才會建立物件。
- ApplicationContext介面:BeanFactory介面的子介面,提供更多更強大的功能,提供給開發人員使用(載入配置檔案時候就會把在配置檔案物件進行建立)推薦使用。
二、IOC操作Brean管理
1、什麼是Bean管理(Bean管理的兩個操作)
- Spring建立物件
- Spring注入屬性
2、Bean管理操作的兩種方式
- 基於xml配置檔案方式實現
- 基於註解方式實現
3、基於xml方式
a) 基於xml方式建立物件
<!--建立物件 id:唯一標識 class:類的全路徑--> <bean id="user" class="com.spring.User"></bean>
//實體類
public class User { public void add(){ System.out.println("add++++++++++++"); } }
//通過類載入xml建立物件
@Test public void testAdd(){ ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");//獲取xml檔案,預設獲取無參構造方法建立物件 User user=context.getBean("user", User.class); user.add(); }
b)基於xml物件注入屬性(DI:依賴注入)
方式一:通過set方式注入
public class User { private String name;public void setName(String name) { this.name = name; } }
xml配置:property中 name對於屬性名 value對應屬性值
<!--set注入--> <bean id="user" class="com.spring.User"> <property name="name" value="李四"></property> </bean>
方式二:有參構造方式注入
public class User { private String name; //有參構造方法 public User(String name) { this.name = name; } }
<!--通過有參構造注入--> <bean id="user" class="com.spring.User"> <constructor-arg name="name" value="王二麻子"></constructor-arg> </bean>
方式三:p名稱空間注入(瞭解即可)
<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" <!--在這裡加入一行--> xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--p空間注入--> <bean id="user" name="com.spring.User" p:bname="小名"> </bean>
注入空值和特殊符號
<!--設定空值--> <bean id="course" class="com.spring.bean.Course"> <property name="cname"> <null/> </property> </bean> <!--設定特殊符號 1、通過轉義 2、使用<![CDATA[值]]> --> <bean id="course" class="com.spring.bean.Course"> <property name="cname"> <value><![CDATA[<<南京>>]]]></value> </property> </bean>
注入屬性--外部bean
public class UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void add(){ System.out.println("service ++++++++++"); userDao.update(); } } public interface UserDao { public abstract void update(); } public class UserDaoImpl implements UserDao { @Override public void update() { System.out.println("hana"); } }
<!--外部bean注入--> <bean id="userService" class="com.spring.service.UserService" > <property name="userDao" ref="userDaoImpl"></property> </bean> <bean id="userDaoImpl" class="com.spring.dao.UserDaoImpl" ></bean>
注入屬性--內部bean和級聯賦值
a)內部bean賦值
public class Emp { private String Ename; private String gender; private dept dept; public void setEname(String ename) { Ename = ename; } public void setGender(String gender) { this.gender = gender; } public void setDept(dept dept) { this.dept = dept; } public void add(){ System.out.println("ename="+Ename+"gender="+gender+"dept="+dept); } } public class dept { private String dname; public void setDname(String dname) { this.dname = dname; } @Override public String toString() { return "dept{" +"dname='" + dname + '\'' +'}'; } }
<!--內部bean注入--> <bean id="emp" class="com.spring.bean.Emp" > <property name="ename" value="小明"></property> <property name="gender" value="男"></property> <property name="dept"> <bean id="dept" class="com.spring.bean.dept" > <property name="dname" value="技術部"></property> </bean> </property> </bean>
b)級聯賦值
<!--級聯賦值 方式一--> <bean id="emp" class="com.spring.bean.Emp"> <property name="ename" value="小花"></property> <property name="gender" value="女"></property> <property name="dept" ref="dept"></property> </bean> <bean id="dept" class="com.spring.bean.dept"> <property name="dname" value="財務部"></property> </bean> <!--級聯賦值 方式二(需給dept屬性設定get方法)--> <bean id="emp" class="com.spring.bean.Emp" > <property name="ename" value="小花"></property> <property name="gender" value="女"></property> <property name="dept" ref="dept"></property> <property name="dept.dname" value="人事部"></property> </bean> <bean id="dept" class="com.spring.bean.dept"></bean>
xml注入集合屬性
public class Stu { private String[] cour; private List<String> list; private Map<String,String> map; private Set<String> set; private List<Course> listcour; //設定陣列屬性 public void setCour(String[] cour) { this.cour = cour; } //設定list集合屬性 public void setList(List<String> list) { this.list = list; } //設定map集合屬性 public void setMap(Map<String, String> map) { this.map = map; } //設定set集合屬性 public void setSet(Set<String> set) { this.set = set; } //設定list實體類屬性 public void setListcour(List<Course> listcour) { this.listcour = listcour; } public void add() { System.out.println("Stu{" + "cour=" + Arrays.toString(cour) + ", list=" + list + ", map=" + map + ", set=" + set + ", listcour=" + listcour + '}'); } }
<!--集合屬性注入--> <bean id="stu" class="com.spring.bean.Stu"> <!--陣列注入--> <property name="cour" > <array> <value>java</value> <value>資料庫</value> </array> </property> <!--list注入--> <property name="list"> <list> <value>張三</value> <value>小三</value> </list> </property> <!--map注入--> <property name="map"> <map> <entry key="神仙" value="天上"></entry> <entry key="閻王" value="地下"></entry> </map> </property> <!--set注入--> <property name="set"> <set> <value>ORACLE</value> <value>MYSQL</value> </set> </property> <!--list實體類注入--> <property name="listcour"> <list> <ref bean="cusor1"></ref> <ref bean="cusor2"></ref> </list> </property> </bean> <bean id="cusor1" class="com.spring.bean.Course"> <property name="cname" value="Spring5"></property> </bean> <bean id="cusor2" class="com.spring.bean.Course"> <property name="cname" value="Spring6"></property> </bean>
把集合注入部分提取出來
public class Book { private List<String> list; public void setList(List<String> list) { this.list = list; } public void add(){ System.out.println(list); } }
1、在spring配置檔案中引入空間名稱util
<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" xmlns:util="http://www.springframework.org/schema/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:list id="listbook"> <value>小花</value> <value>小明</value> <value>小紅</value> </util:list> <bean id="book" class="com.spring.bean.Book"> <property name="list" ref="listbook"/> </bean> </beans>