Spring入門01
阿新 • • 發佈:2020-08-09
一、Spring簡單案例
1、搭建Spring基本專案
匯入基本jar包:context core beans expression
與apache的logging,老版本還需要匯入log4j
建立spring配置檔案
<?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"> <!-- 將User物件交給Spring管理 --> <!-- Bean元素:使用該元素描述需要Spring容器管理的物件 class屬性:被管理物件的完整類名 name屬性:給被管理的物件起名字,獲得物件時根據該名稱獲得物件,名稱可以重複,可以使用特殊字元 id:與name屬性一模一樣(名稱不可重複,不能使用特殊字元) 結論:儘量使用name屬性--> <bean name="user" class="domain.User"></bean> </beans>
配置查詢約束:\spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
建立測試案例
import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;import domain.User; public class Demo1 { /** * IOC:Inverse of Control 反轉控制 * 將我們建立物件的方式反轉了 * 以前物件的建立是由我們開發人員自己維護,包括依賴關係也是自己注入 * 使用了spring之後,物件建立以及依賴關係可以由spring完成建立以及注入 * 反轉控制就是反轉了物件的建立方式,從我們自己建立反轉給了程式(spring) * * DI:Dependency Injection 依賴注入 * 實現IOC思想需要DI做支援 * 注入方式:set方法注入 * 構造方法注入 * 欄位注入 * 注入型別: * 值型別注入 8大基本資料型別 * 引用型別注入 將依賴的物件注入 * * ApplicationContext&BeanFactory(過時) * * BeanFactory介面:spring原始介面,針對原始介面實現類功能較為單一 * BeanFactory介面實現類的容器:每次在獲得物件時才會建立物件 * * ApplicationContext * 每次容器啟動時就會建立容器中配置的所有物件,提供更多功能 * web開發中使用ApplicationContext完成 * 在資源匱乏的環境可以使用BeanFactory * 從類路徑下載入配置檔案:ClassPathXmlApplicationContext * 從硬碟絕對路徑下載入配置檔案:FileSystemXmlApplicationContext("d:/xx.xx") * */ @Test public void func1() { //1、建立容器物件 ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); //2、向容器要user User user = (User) context.getBean("user"); //列印一下User System.out.println(user); } @Test public void func2() { } }
2、Bean元素進階配置
scpoe屬性:
singleton(預設值):單例物件,被標識為單例的物件在spring容器中只存在一個例項
prototype:多例原型,被標識為多例的物件,每次在獲得才會建立。每次建立都是新的物件。
request:web環境下,物件與request生命週期一致
session:web環境下,物件與session生命週期一致
<bean name="user" class="domain.User" scope="prototype"></bean>
<bean name="user" class="domain.User" scope="singleton"></bean>
生命週期屬性:
init-method 初始化方法:配置一個方法作為物件生命週期初始化方法,spring會在物件建立後立即呼叫
destory-method銷燬方法:配置一個方法作為生命週期的銷燬方法,spring容器在關閉並銷燬所有容器中的物件之前呼叫
<bean name="user" class="domain.User" init-method="init" destroy-method="destory"></bean>
3、spring建立物件的方式
方式一、
空參構造(主要方式)
<!-- 建立方式1:空參構造建立 (主要方式) --> <bean name="user" class="domain.User"></bean>
方式二、靜態工廠
public class UserFactory { public static User Create() { System.out.println("靜態工廠方式"); return new User(); } }
<!-- 建立方式2:靜態工廠建立 呼叫UserFactory的Create方法建立user2物件,放入容器 --> <bean name="user2" class="domain.UserFactory" factory-method="Create"></bean>
方式三、例項工廠
public User Create2() { System.out.println("例項工廠工廠方式"); return new User(); }
<!-- 方式3:例項工廠 呼叫UserFactory物件的Create2方法建立名為user3的物件,放入容器 --> <bean name="user3" factory-bean="userFactory" factory-method="Create2"></bean> <bean name="userFactory" class="domain.UserFactory"></bean>
Spring的分模組配置
<!-- 匯入其他配置檔案 --> <import resource="CreateObjDemo/applicationContext.xml"/>
3、spring的屬性注入
一、set方式注入
<!-- set注入方式 --> <bean name="user" class="domain.User"> <!-- 值型別注入 --> <property name="name" value="zhangsan"></property> <property name="age" value="20"></property> <!-- 引用型別注入,注入的是下面配置的car物件 --> <property name="Mycar" ref="car"></property> </bean> <!-- car物件 --> <bean name="car" class="domain.Car"> <property name="name" value="蘭博基尼"></property> <property name="color" value="紅色"></property> </bean>
二、建構函式注入
<!--建構函式注入 --> <bean name="user2" class="domain.User"> <!-- name屬性:建構函式的引數名 index屬性:建構函式的引數索引 type屬性:建構函式的引數型別 --> <constructor-arg name="name" index="0" type="java.lang.String" value="李四"></constructor-arg> <constructor-arg name="age" index="1" type="java.lang.Integer" value="25"></constructor-arg> <constructor-arg name="car" index="2" ref="car"></constructor-arg> </bean>
三、p名稱空間注入
<!-- p名稱空間,走set方法 1、匯入p名稱空間 xmlns:p="http://www.springframework.org/schema/p" 2、使用p:屬性完成注入 --> <bean name="user3" class="domain.User" p:name="王五" p:age="22" p:Mycar-ref="car"></bean>
四、spel注入
<!-- spel注入:Spring Expression Language (Spring表示式語言) --> <bean name="user4" class="domain.User"> <property name="name" value="#{user.name}"></property> <property name="age" value="#{user.age}"></property> <property name="Mycar" ref="car"></property> </bean>
五、複雜型別注入(array、list、map、Properties)
<!-- 複雜型別注入 --> <bean name="lmp" class="domain.Lmp"> <!--Array陣列注入 --> <property name="arr"> <array> <value>tom</value> <value>jack</value> <ref bean="user2"/> </array> </property> <!-- list集合注入 --> <property name="list"> <list> <value>zhangsan</value> <value>lisi</value> <ref bean="user3"/> </list> </property> <!-- map集合注入 --> <property name="map"> <map> <entry key="school" value="清華"></entry> <entry key-ref="user" value-ref="car"></entry> </map> </property> <!-- Properties型別注入 --> <property name="pro"> <props> <prop key="school">北大</prop> <prop key="name">張三</prop> </props> </property> </bean>
public class Lmp { private Object arr[]; private List list; private Map map; private Properties pro; public Object[] getArr() { return arr; } public void setArr(Object[] arr) { this.arr = arr; } public List getList() { return list; } public void setList(List list) { this.list = list; } public Map getMap() { return map; } public void setMap(Map map) { this.map = map; } public Properties getPro() { return pro; } public void setPro(Properties pro) { this.pro = pro; } @Override public String toString() { return "Lmp [arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", pro=" + pro + "]"; } }
一二三四五案例全部配置
<?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" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- set注入方式 --> <bean name="user" class="domain.User"> <!-- 值型別注入 --> <property name="name" value="zhangsan"></property> <property name="age" value="20"></property> <!-- 引用型別注入,注入的是下面配置的car物件 --> <property name="Mycar" ref="car"></property> </bean> <!-- car物件 --> <bean name="car" class="domain.Car"> <property name="name" value="蘭博基尼"></property> <property name="color" value="紅色"></property> </bean> <!--建構函式注入 --> <bean name="user2" class="domain.User"> <!-- name屬性:建構函式的引數名 index屬性:建構函式的引數索引 type屬性:建構函式的引數型別 --> <constructor-arg name="name" index="0" type="java.lang.String" value="李四"></constructor-arg> <constructor-arg name="age" index="1" type="java.lang.Integer" value="25"></constructor-arg> <constructor-arg name="car" index="2" ref="car"></constructor-arg> </bean> <!-- p名稱空間,走set方法 1、匯入p名稱空間 xmlns:p="http://www.springframework.org/schema/p" 2、使用p:屬性完成注入 --> <bean name="user3" class="domain.User" p:name="王五" p:age="22" p:Mycar-ref="car"></bean> <!-- spel注入:Spring Expression Language (Spring表示式語言) --> <bean name="user4" class="domain.User"> <property name="name" value="#{user.name}"></property> <property name="age" value="#{user.age}"></property> <property name="Mycar" ref="car"></property> </bean> <!-- 複雜型別注入 --> <bean name="lmp" class="domain.Lmp"> <!--Array陣列注入 --> <property name="arr"> <array> <value>tom</value> <value>jack</value> <ref bean="user2"/> </array> </property> <!-- list集合注入 --> <property name="list"> <list> <value>zhangsan</value> <value>lisi</value> <ref bean="user3"/> </list> </property> <!-- map集合注入 --> <property name="map"> <map> <entry key="school" value="清華"></entry> <entry key-ref="user" value-ref="car"></entry> </map> </property> <!-- Properties型別注入 --> <property name="pro"> <props> <prop key="school">北大</prop> <prop key="name">張三</prop> </props> </property> </bean> </beans>
public class User { public User() { } public User(String name,Integer age,Car car) { this.name=name; this.age=age; this.Mycar=car; } private String name; private Integer age; private Car Mycar; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Car getMycar() { return Mycar; } public void setMycar(Car mycar) { Mycar = mycar; } @Override public String toString() { return "User [name=" + name + ", age=" + age + ", Mycar=" + Mycar + "]"; } }
public class Car { private String name; private String color; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } @Override public String toString() { return "Car [name=" + name + ", color=" + color + "]"; } }
4、配置Spring容器生命週期
<!-- 配置Spring容器隨專案的啟動而建立,隨專案的關閉而銷燬 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 指定載入Spring配置檔案的位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>