Spring架構
什麼是Spring
Spring是分層得javaSE輕量級開源架構,以IOC(Inverse of Control 控制反轉)和AOP(Aspect Oriented Programming面向切面程式設計為核心)
Spring是衆多優秀設計模式得組合(工廠,單例,代理,擴充卡,包裝器,觀察者)
分層:
JavaEE的三層結構:web層、業務層、資料通路層(持久層、內建層)
Struts是web層基于MVC設計模式架構
Mybatis,Hibernate是持久的一個ORM的架構
一站式:
Spring架構有對三層的每層解決方案
web層:Spring MVC
持久層:JDBC Template
業務層: Spring的Bean管理
Spring的好處:
友善解耦,簡化開發
Spring就是一個大工廠,可以将所有對象和依賴關系維護,交給Spring管理
AOP程式設計的支援
Spring提供面向切面程式設計,可以友善的實作對程式進行權限攔截、運作監控等功能
聲明式事務的支援
隻需要通過配置就可以完成對事務的管理,而無需手動程式設計
友善程式的測試
Spring對Junit4支援,可以通過注解友善的測試Spring程式
友善內建各種優秀架構 Spring不排斥各種優秀的開源架構,其内部提供了對各種優秀架構(如:Struts、
Hibernate、MyBatis、Quartz等)的直接支援
Spring 對JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠端調用等),都提供了封裝,降低JavaEE API的使用難度
1、建立Bean的三種方式
Bean元素:使用鈣元素描述需要Spring容器管理的對象
class屬性:被管理對象的完整類型名
name屬性:給被管理的對象起個名字,獲得對象時根據該名稱獲得對象
id屬性:與name屬性的作用相同
<?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">
<!--使用預設的構造方法建立-->
<bean id="UserService" class="com.wm.impl.UserServiceimpl"></bean>
<!--使用普通的工廠中的方法建立對象-->
<!--使用工廠中的靜态方法建立-->
<bean id="userService" factory-bean="userServiceFactory" factory-method="getUserService"></bean>
</beans>
了解:
這三種建立的方式的各有特點,也都有相似的地方,最重要的是了解屬性的意思,id是指管理對象的名字,其實指的就是在我們測試的時候調用的對象的名字,
class是我們被管理對象的名字,也就是我們new的類,其中factory-bean 是指靜态方法中的類名,factory-method見名知意指的是這個類下的方法,然後後期在測試的時候就可以通過id名直接進行類的執行個體化,不用再new對象,這也是我們使用Spring架構的意義!!!
2、Spring中的依賴注入
依賴注入: 能注入的資料: 基本類型和String 其他bean類型(在配置檔案中或者注解配置過的bean) 複雜類型/集合類型
注入的方式:
第一種:使用構造函數提供
第二種:使用set方法提供
第三種:使用注解提供
構造方法注入
使用的标簽:constructor-arg 标簽出現的位置:bean标簽的内部
标簽中的屬性: type:用于指定要注入的資料的資料類型,該資料類型也是構造函數中某個或某些參數的類型 index:用于指定要注入的資料給構造函數中指定索引位置的參數指派。索引的位置是從0開始 name:用于指定給構造函數中指定名稱的參數指派
value:用于提供基本類型和String類型的資料 ref:用于指定其他的bean類型資料。它指的就是在spring的Ioc核心容器中出現過的bean對象
優勢: 在擷取bean對象時,注入資料是必須的操作,否則對象無法建立成功。 弊端: 改變了bean對象的執行個體化方式,使我們在建立對象時,如果用不到這些資料,也必須提供。
set方法注入
涉及的标簽:property 出現的位置:bean标簽的内部
标簽的屬性: name:用于指定注入時所調用的set方法名稱 value:用于提供基本類型和String類型的資料 ref:用于指定其他的bean類型資料。它指的就是在spring的Ioc核心容器中出現過的bean對象
優勢: 建立對象時沒有明确的限制,可以直接使用預設構造函數 弊端: 如果有某個成員必須有值,則擷取對象是有可能set方法沒有執行。
複雜類型的注入
list array set map propertioes等結構集合的注入
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">
<property name="cname" value="法拉利"></property>
<property name="id" value="1002"></property>
<property name="name" value="rose"></property>
<property name="password" value="123"></property>
<property name="car" ref="carBean" ></property>
<bean id="collectionDemo" class="com.wm.pojo.CollectionDemo">
<!--數組-->
<property name="arr">
<array>
<value>123</value>
<value>213</value>
<value>123</value>
</array>
</property>
<property name="list" >
<!--list集合 有序可重複-->
<list>
<value>jack</value>
<value>jak</value>
<value>tom</value>
<ref bean="user"></ref>
</list>
</property>
<property name="set">
<!--set集合 無序不可重複-->
<set>
<value>jack</value>
<value>jak</value>
<value>tom</value>
<ref bean="user"></ref>
</set>
</property>
<property name="map">
<!--map集合是以鍵值對得形式存儲-->
<map>
<entry key="username" value="jack"></entry>
<entry key-ref="user" value-ref="user"></entry>
</map>
</property>
<property name="properties">
<!--properties類對象-->
<props>
<prop key="username">root</prop>
<prop key="password">123456</prop>
<prop key="url">jdbc:mysql:///db_name</prop>
<prop key="DriverClassName">com.mysql.cj.jdbc.driver</prop>
</props>
</property>
</bean>
最後題詩一首
秋名山上行人稀
幾輛賽車較高低
當年車技今猶在
不見當年老司機