框架,即framework。框架通常是成熟的,不斷升級的軟件。是對特定應用領域中的應用系統的部分設計和實現的總體結構。java
由於軟件系統發展到今天已經很複雜了,特別是服務器端軟件,涉及到的知識,內容,問題太多。在某些方面使用別人成熟的框架,就至關於讓別人幫你完成一些基礎工做,你只須要集中精力完成系統的業務邏輯設計。並且框架通常是成熟,穩健的,他能夠處理系統不少細節問題,好比,事務處理,安全性,數據流控制等問題。還有框架通常都通過不少人使用,因此結構很好,因此擴展性也很好,並且它是不斷升級的,你能夠直接享受別人升級代碼帶來的好處。spring
① Spring自身JAR包:spring-framework-4.0.0.RELEASE\libs目錄下express
spring-beans-4.0.0.RELEASE.jar編程
spring-context-4.0.0.RELE2ASE.jar數組
spring-core-4.0.0.RELEASE.jar安全
spring-expression-4.0.0.RELEASE.jar服務器
② commons-logging-1.1.1.jar① File->New->Spring Bean Configuration Fileapp
② 爲文件取名字 例如:applicationContext.xml框架
package cn.edu.hbuas.entity; public class Person { private Integer id; private String name; public Person() { } public Person(Integer id, String name) { super(); this.id = id; this.name = name; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + "]"; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = 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="person" class="cn.edu.hbuas.entity.Person" > <property name="id" value="111"></property> <property name="name" value="小明"></property> </bean> </beans>
package cn.edu.hbuas.main; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.edu.hbuas.entity.Person; public class TestBySpring { public static void main(String[] args) { // TODO Auto-generated method stub ApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml"); Person person=(Person)ac.getBean("person"); System.out.println(person); } }
反轉控制的思想徹底顛覆了應用程序組件獲取資源的傳統方式:反轉了資源的獲取方向——改由容器主動的將資源推送給須要的組件,開發人員不須要知道容器是如何建立資源對象的,只須要提供接收資源的方式便可,極大的下降了學習成本,提升了開發的效率。這種行爲也稱爲查找的被動形式。ide
傳統方式: 我想吃飯 我須要買菜作飯
反轉控制: 我想吃飯 張口就行
IOC的另外一種表述方式:即組件以一些預先定義好的方式(例如:setter 方法)接受來自於容器的資源注入。相對於IOC而言,這種表述更直接。
總結: IOC 就是一種反轉控制的思想, 而DI是對IOC的一種具體實現。
IOC容器在最底層實質上就是一個對象工廠.
1)在經過IOC容器讀取Bean的實例以前,須要先將IOC容器自己實例化。
2)Spring提供了IOC容器的兩種實現方式
① BeanFactory:IOC容器的基本實現,是Spring內部的基礎設施,是面向Spring自己的,不是提供給開發人員使用的。
② ApplicationContext:BeanFactory的子接口,提供了更多高級特性。面向Spring的使用者,幾乎全部場合都使用ApplicationContext而不是底層的BeanFactory。
ApplicationContext的主要實現類:
Hello World中使用的就是這種方式
爲了簡化XML文件的配置,愈來愈多的XML文件採用屬性而非子元素配置信息。Spring從2.5版本開始引入了一個新的p命名空間,能夠經過<bean>元素屬性的方式配置Bean 的屬性。使用p命名空間後,基於XML的配置方式將進一步簡化。
字面量
<bean class="cn.edu.hbuas.entity" id="bookNull" > <property name= "id" value ="2000"/> <property name= "name"> <null/> </property> </bean >
3.引用類型
<bean id="action" class="cn.edu.hbuas.action"> <property name="service" ref="service"/> <property name="service.dao.dataSource" value="DBCP"/> </bean>
4.集合屬性
數組和List
<bean id="shop" class="cn.edu.hbuas.bean.Shop" > <property name= "categoryList"> <!-- 以字面量爲值的List集合 --> <list> <value> 歷史</value > <value> 軍事</value > </list> </property> <property name= "bookList"> <!-- 以bean的引用爲值的List集合 --> <list> <ref bean= "book01"/> <ref bean= "book02"/> </list> </property> </bean >
Map
<bean id="cup" class="cn.edu.hbuas.bean.Cup"> <property name="bookMap"> <map> <entry> <key> <value>1001</value> </key> <value>孫老師</value> </entry> <entry> <key> <value>bookKey02</value> </key> <ref bean="book02"/> </entry> </map> </property> </bean>
Spring中有兩種類型的bean,一種是普通bean,另外一種是工廠bean,即FactoryBean。
<bean id="product" class="cn.edu.hbuas.bean.ProductFactory"> <property name="productName" value="Mp3" /> </bean>
當bean的做用域爲單例時,Spring會在IOC容器對象建立時就建立bean的對象實例。而當bean的做用域爲prototype時,IOC容器在獲取bean的實例時建立bean的實例對象。
Spring IOC容器對bean的生命週期進行管理的過程:
① 經過構造器或工廠方法建立bean實例
② 爲bean的屬性設置值和對其餘bean的引用
③ 調用bean的初始化方法
④ bean可使用了
⑤ 當容器關閉時,調用bean的銷燬方法
在配置bean時,經過init-method和destroy-method 屬性爲bean指定初始化和銷燬方法
bean的後置處理器
① bean後置處理器容許在調用初始化方法先後對bean進行額外的處理
② bean後置處理器對IOC容器裏的全部bean實例逐一處理,而非單一實例。
其典型應用是:檢查bean屬性的正確性或根據特定的標準更改bean的屬性。
③ bean後置處理器須要實現接口:
org.springframework.beans.factory.config.BeanPostProcessor。在初始化方法被調用先後,Spring將把每一個bean實例分別傳遞給上述接口的如下兩個方法:
①經過構造器或工廠方法建立bean實例
②爲bean的屬性設置值和對其餘bean的引用
③將bean實例傳遞給bean後置處理器的postProcessBeforeInitialization()方法
④調用bean的初始化方法
⑤將bean實例傳遞給bean後置處理器的postProcessAfterInitialization()方法
⑥bean可使用了
⑦當容器關閉時調用bean的銷燬方法
相對於使用註解的方式實現的自動裝配,在XML文檔中進行的自動裝配略顯笨拙,在項目中更多的使用註解的方式實現。
1.普通組件:@Component
標識一個受Spring IOC容器管理的組件
2.持久化層組件:@Repository
標識一個受Spring IOC容器管理的持久化層組件
3.業務邏輯層組件:@Service
標識一個受Spring IOC容器管理的業務邏輯層組件
4.表述層控制器組件:@Controller
標識一個受Spring IOC容器管理的表述層控制器組件
注意:事實上Spring並無能力識別一個組件究竟是不是它所標記的類型,@Respository、@Service、@Controller這幾個註解僅僅是爲了讓開發人員本身明確當前的組件扮演的角色。
組件被上述註解標識後還須要經過Spring進行掃描纔可以偵測到。
指定被掃描的package:
<context:component-scan base-package="類路徑"/>
Controller組件中每每須要用到Service組件的實例,Service組件中每每須要用到 Repository組件的實例。Spring能夠經過註解的方式幫咱們實現屬性的裝配。
@Autowired
@Resource
@Resource註解要求提供一個bean名稱的屬性,若該屬性爲空,則自動採用標註處的變量或方法名做爲bean的名稱。
@Inject
@Inject和@Autowired註解同樣也是按類型注入匹配的bean,但沒有reqired屬性。