什么是Spring
?Spring:SE/EE開發的一站式框架。
? ? ?一站式框架:有EE開發的每一層解決方案。
?WEB層 :SpringMVC
? Service層 :Spring的Bean管理,Spring聲明式事務
?DAO層 :Spring的Jdbc模板,Spring的ORM模塊
為什么學習Spring
?Spring的入門(IOC)
什么IOC?
IOC:?Inversion of Control(控制反轉)。
控制反轉:將對象的創建權反轉給(交給)Spring。
下載Spring的開發包
官網:http://spring.io/
?
?docs :Spring的開發規范和API
libs :Spring的開發的jar和源碼
schema :Spring的配置文件的約束
創建web項目,引入jar包
?
創建接口和類
問題:如果底層的實現切換了,需要修改源代碼,能不能不修改程序源代碼對程序進行擴展?
將實現類交給Spring管理
在spring的解壓路徑下spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html
?
編寫測試類
編寫userDAO和userDAOImp
userDAO
public interface userDAO {public void save(); }
?userDAOImp
public class userDAOImp implements userDAO {@Overridepublic void save() {System.out.println("userDAOImp執行了......");} }
?設置spring的xml applicationContext.xml? ?可以隨意命名
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:p="http://www.springframework.org/schema/p"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"> <!--spring入門的配置--><bean id="userDAO" class="spring.learn.userDAOImp"></bean> </beans>
?最后編寫SpringDemo1對功能進行實現
package spring.learn;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class SpringDemo1 {//傳統的調用方式public void demo1(){userDAO userDAO=new userDAOImp();userDAO.save();}//Spring的方式的調用public void demo2(){//創建Spring的工廠ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");userDAO userDAO=(userDAO)applicationContext.getBean("userDAO");userDAO.save();}public static void main(String[] args) {SpringDemo1 springDemo1=new SpringDemo1();springDemo1.demo1();springDemo1.demo2();} }
結果顯示
IOC和DI(*****)
IOC:控制反轉,將對象的創建權反轉給了Spring。 DI:依賴注入,前提必須有IOC的環境,Spring管理這個類的時候將類的依賴的屬性注入(設置)進來。 面向對象的時候 依賴 Class A{}Class B{public void xxx(A a){} } 繼承:is a Class A{} Class B extends A{}
Spring的工廠類
Spring工廠類的結構圖
ApplicationContext繼承BeanFactory
BeanFactory:老版本的工廠類? ? ? ??BeanFactory:調用getBean的時候,才會生成類的實例。
?ApplicationContext:新版本的工廠類
ApplicationContext:加載配置文件的時候,就會將Spring管理的類都實例化。
ApplicationContext有兩個實現類
ClassPathXmlApplicationContext:加載類路徑下的配置文件
FileSystemXmlApplicationContext :加載文件系統下的配置文件
Bean的相關配置
<bean>標簽的id和name的配置
id :使用了約束中的唯一約束。里面不能出現特殊字符的。
? ? ? ? name :沒有使用約束中的唯一約束(理論上可以出現重復的,但是實際開發不能出現的)。里面可以出現特殊字符。
? ? ? ? ? ?Spring和Struts1框架整合的時候
? ? ? ? ? ?<bean name=”/user”?class=””/>
1Bean的生命周期的配置(了解)
? ? ? ? init-method :Bean被初始化的時候執行的方法
- destroy-method :Bean被銷毀的時候執行的方法(Bean是單例創建,工廠關閉)
Bean的作用范圍的配置(重點)
scope? ? :Bean的作用范圍?
- singleton:默認的,Spring會采用單例模式創建這個對象。
- ?prototype:多例模式。(Struts2和Spring整合一定會用到)
- ?request :應用在web項目中,Spring創建這個類以后,將這個類存入到request范圍中。
- session :應用在web項目中,Spring創建這個類以后,將這個類存入到session范圍中。
- ?globalsession :應用在web項目中,必須在porlet環境下使用。但是如果沒有這種環境,相對于session
?Spring的Bean實例化方式(了解)
Bean已經都交給Spring管理,Spring創建這些類的時候,有幾種方式:
無參構造的方式(默認)
編寫無參構造類?
public class Bean1 {public Bean1(){System.out.println("Bean1的無參構造方法執行了......");} }
<!--配置無參構造方法--><bean id="bean1" class="spring.learn.demo1.Bean1"></bean>
實現功能
public class SpringDemo1 {public static void main(String[] args) {//創建Spring的工廠ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");Bean1 bean1=(Bean1) applicationContext.getBean("bean1");} }
靜態工廠實例化方式
?配置
實例工廠實例化的方式
?配置
?Spring的屬性注入
構造方法屬性注入
編寫類
public class Car {public String name;public double price;public Car(String name,double price){this.name=name;this.price=price;}@Overridepublic String toString() {return "Car{" +"name='" + name + '\'' +", price=" + price +'}';} }
<!--構造方法的方式注入--><bean id="car" class="spring.learn.demo2.Car"><constructor-arg name="name" value="寶馬" /><constructor-arg name="price" value="800000" /></bean>
實現
public class SpringDemo2 {public static void main(String[] args) {//創建Spring的工廠ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");Car car=(Car)applicationContext.getBean("car");System.out.println(car.toString());} }
set方法方式的屬性注入
public class Car2 {public String name;public double price;public void setName(String name) {this.name = name;}public void setPrice(double price) {this.price = price;}@Overridepublic String toString() {return "Car2{" +"name='" + name + '\'' +", price=" + price +'}';} }
?配置
<!--Set方法的方式的屬性注入--><bean id="car2" class="spring.learn.demo2.Car2"><property name="name" value="奔馳" /><property name="price" value="10000000000" /></bean>
?實現方式
public class SpringDemo2 {public static void main(String[] args) {//創建Spring的工廠ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");Car2 car2=(Car2)applicationContext.getBean("car2");System.out.println(car2.toString());} }
set方法設置對象類型的屬性
public class Employee {public String name;public Car2 car2;public void setName(String name) {this.name = name;}public void setCar2(Car2 car2) {this.car2 = car2;}@Overridepublic String toString() {return "Employee{" +"name='" + name + '\'' +", car2=" + car2 +'}';} }
配置
<!--Set方法的方式的屬性注入--><bean id="car2" class="spring.learn.demo2.Car2"><property name="name" value="奔馳" /><property name="price" value="10000000000" /></bean><!--Set方法設置對象類型的屬性--><bean id="employee" class="spring.learn.demo2.Employee"><!--Value:設置普通類型的值,ref設置其他類的id或者name--><property name="name" value="zyz" /><property name="car2" ref="car2" /></bean>
實現
public class SpringDemo3 {public static void main(String[] args) {//創建Spring的工廠ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");Employee employee=(Employee)applicationContext.getBean("employee");System.out.println(employee.toString());} }
?P名稱空間的屬性注入(Spring2.5以后)
通過引入p名稱空間完成屬性的注入:
寫法:
普通屬性 p:屬性名=”值”
對象屬性 p:屬性名-ref=”值
?p名稱空間的引入
使用p名稱空間
?SpEL的屬性注入(Spring3.0以后)
? ? ?SpEL:Spring Expression Language,Spring的表達式語言。
?
集合類型屬性注入(了解)
<!-- 注入數組類型 -->
?
import java.util.Arrays;public class CollectionBean {public String arr[];public void setArr(String[] arr) {this.arr = arr;}@Overridepublic String toString() {return "CollectionBean{" +"arr=" + Arrays.toString(arr) +'}';} }
<!--注入數組類型--><bean id="collectionBean" class="spring.learn.demo2.CollectionBean"><!--數組類型的--><property name="arr"><list><value>王東</value><value>趙洪</value><value>李冠希</value></list></property></bean>
public void arrdemo1(){//創建Spring的工廠ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");CollectionBean collectionBean=(CollectionBean)applicationContext.getBean("collectionBean");System.out.println(collectionBean.toString());}
?
?
<!--注入list集合-->
import java.util.List;public class ListBean {public List list;public void setList(List list) {this.list = list;}@Overridepublic String toString() {return "ListBean{" +"list=" + list +'}';} }
<!--注入list集合--><bean id="listBean" class="spring.learn.demo2.ListBean"><property name="list"><list><value>王東</value><value>趙洪</value><value>李冠希</value></list></property></bean>
public void listdemo1(){//創建Spring的工廠ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");ListBean listBean=(ListBean)applicationContext.getBean("listBean");System.out.println(listBean.toString());}
?
注入Set集合
import java.util.Set;public class SetBean {public Set set;public void setSet(Set set) {this.set = set;}@Overridepublic String toString() {return "SetBean{" +"set=" + set +'}';} }
<!--注入Set集合--><bean id="setBean" class="spring.learn.demo2.SetBean"><property name="set"><set><value>aaa</value><value>bbb</value><value>ccc</value></set></property></bean>
public void setdemo1(){//創建Spring的工廠ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");SetBean setBean=(SetBean)applicationContext.getBean("setBean");System.out.println(setBean.toString());}
?
注入Map集合
import java.util.Map;public class MapBean {public Map map;public void setMap(Map map) {this.map = map;}@Overridepublic String toString() {return "MapBean{" +"map=" + map +'}';} }
<!--注入Map集合--><bean id="mapBean" class="spring.learn.demo2.MapBean"><property name="map"><map><entry key="aaa" value="111"/><entry key="bbb" value="222"/><entry key="ccc" value="333"/></map></property></bean>
public void mapdemo1(){//創建Spring的工廠ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");MapBean mapBean=(MapBean)applicationContext.getBean("mapBean");System.out.println(mapBean.toString());}
?
Spring的分模塊開發的配置
在加載配置文件的時候,加載多個
?
?
在一個配置文件中引入多個配置文件
?