12、BeanFactory常用的實現類有哪些?
Bean工廠是工廠模式的一個實現,提供了控制反轉功能,用來把應用的配置和依賴從正真的應用代碼中分離。常用的BeanFactory實現有DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等。XMLBeanFactory,最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory,它根據XML文件中的定義加載beans。該容器從XML文件讀取配置元數據并用它去創建一個完全配置的系統或應用。
Spring-DAO并非Spring的一個模塊,它實際上是指示你寫DAO操作、寫好DAO操作的一些規范。因此,對于訪問你的數據它既沒有提供接口也沒有提供實現更沒有提供模板。在寫一個DAO的時候,你應該使用@Repository對其進行注解,這樣底層技術(JDBC,Hibernate,JPA,等等)的相關異常才能一致性地翻譯為相應的DataAccessException子類。
Spring-JDBC提供了Jdbc模板類,它移除了連接代碼以幫你專注于SQL查詢和相關參數。Spring-JDBC還提供了一個JdbcDaoSupport,這樣你可以對你的DAO進行擴展開發。它主要定義了兩個屬性:一個DataSource和一個JdbcTemplate,它們都可以用來實現DAO方法。JdbcDaoSupport還提供了一個將SQL異常轉換為SpringDataAccessExceptions的異常翻譯器。
Spring-ORM是一個囊括了很多持久層技術(JPA,JDO,Hibernate,iBatis)的總括模塊。對于這些技術中的每一個,Spring都提供了集成類,這樣每一種技術都能夠在遵循Spring的配置原則下進行使用,并平穩地和Spring事務管理進行集成。
對于每一種技術,配置主要在于將一個DataSourcebean注入到某種SessionFactory或者EntityManagerFactory等bean中。純JDBC不需要這樣的一個集成類(JdbcTemplate除外),因為JDBC僅依賴于一個DataSource。
如果你計劃使用一種ORM技術,比如JPA或者Hibernate,那么你就不需要Spring-JDBC模塊了,你需要的是這個Spring-ORM模塊。
Spring的WEB模塊是構建在applicationcontext模塊基礎之上,提供一個適合web應用的上下文。這個模塊也包括支持多種面向web的任務,如透明地處理多個文件上傳請求和程序級請求參數的綁定到你的業務對象。它也有對JakartaStruts的支持。
Spring配置文件是個XML文件,這個文件包含了類信息,描述了如何配置它們,以及如何相互調用。
IOC控制反轉:SpringIOC負責創建對象,管理對象。通過依賴注入(DI),裝配對象,配置對象,并且管理這些對象的整個生命周期。
IOC或依賴注入把應用的代碼量降到最低。它使應用容易測試,單元測試不再需要單例和JNDI查找機制。最小的代價和最小的侵入性使松散耦合得以實現。IOC容器支持加載服務時的餓漢式初始化和懶加載。
FileSystemXmlApplicationContext:此容器從一個XML文件中加載beans的定義,XMLBean配置文件的全路徑名必須提供給它的構造函數。
ClassPathXmlApplicationContext:此容器也從一個XML文件中加載beans的定義,這里,你需要正確設置classpath因為這個容器將在classpath里找bean配置。
WebXmlApplicationContext:此容器加載一個XML文件,此文件定義了一個WEB應用的所有bean。
● BeanFactory
基礎類型的IOC容器,提供完成的IOC服務支持。如果沒有特殊指定,默認采用延遲初始化策略。相對來說,容器啟動初期速度較快,所需資源有限。
● ApplicationContext
ApplicationContext是在BeanFactory的基礎上構建,是相對比較高級的容器實現,除了BeanFactory的所有支持外,ApplicationContext還提供了事件發布、國際化支持等功能。ApplicationContext管理的對象,在容器啟動后默認全部初始化并且綁定完成。
平常的java開發中,程序員在某個類中需要依賴其它類的方法,則通常是new一個依賴類再調用類實例的方法,這種開發存在的問題是new的類實例不好統一管理,spring提出了依賴注入的思想,即依賴類不由程序員實例化,而是通過spring容器幫我們new指定實例并且將實例注入到需要該對象的類中。依賴注入的另一種說法是“控制反轉”,通俗的理解是:平常我們new一個實例,這個實例的控制權是我們程序員,而控制反轉是指new實例工作不由我們程序員來做而是交給spring容器來做。
Spring提供了多種依賴注入的方式。
● set注入
● 構造器注入
● 靜態工廠的方法注入
● 實例工廠的方法注入
Springbeans是那些形成Spring應用的主干的java對象。它們被SpringIOC容器初始化,裝配,和管理。這些beans通過容器中配置的元數據創建。比如,以XML文件中<bean/>的形式定義。Spring框架定義的beans都是單例beans。
一個SpringBean的定義包含容器必知的所有配置元數據,包括如何創建一個bean,它的生命周期詳情及它的依賴。
當定義一個<bean>在Spring里,我們還能給這個bean聲明一個作用域。它可以通過bean定義中的scope屬性來定義。如,當Spring要在需要的時候每次生產一個新的bean實例,bean的scope屬性被指定為prototype。另一方面,一個bean每次使用的時候必須返回同一個實例,這個bean的scope屬性必須設為singleton。
Spring框架支持以下五種bean的作用域:
● singleton:bean在每個Springioc容器中只有一個實例。
● prototype:一個bean的定義可以有多個實例。
● request:每次http請求都會創建一個bean,該作用域僅在基于web的SpringApplicationContext情形下有效。
● session:在一個HTTPSession中,一個bean定義對應一個實例。該作用域僅在基于web的SpringApplicationContext情形下有效。
● global-session:在一個全局的HTTPSession中,一個bean定義對應一個實例。該作用域僅在基于web的SpringApplicationContext情形下有效。缺省的Springbean的作用域是Singleton。
Spring框架中的單例bean不是線程安全的。
當一個bean僅被用作另一個bean的屬性時,它能被聲明為一個內部bean,為了定義innerbean,在Spring的基于XML的配置元數據中,可以在<property/>或<constructor-arg/>元素內使用<bean/>元素,內部bean通常是匿名的,它們的Scope一般是prototype。
Spring提供以下幾種集合的配置元素:
● <list>類型用于注入一列值,允許有相同的值。
● <set>類型用于注入一組值,不允許有相同的值。
● <map>類型用于注入一組鍵值對,鍵和值都可以為任意類型。
● <props>類型用于注入一組鍵值對,鍵和值都只能為String類型。
無須在Spring配置文件中描述javaBean之間的依賴關系(如配置<property>、<constructor-arg>)。IOC容器會自動建立javabean之間的關聯關系。
有五種自動裝配的方式,可以用來指導Spring容器用自動裝配方式來進行依賴注入。
● no:默認的方式是不進行自動裝配,通過顯式設置ref屬性來進行裝配。
● byName:通過參數名自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byname,之后容器試圖匹配、裝配和該bean的屬性具有相同名字的bean。
● byType::通過參數類型自動裝配,Spring容器在配置文件中發現bean的autowire屬性被設置成byType,之后容器試圖匹配、裝配和該bean的屬性具有相同類型的bean。如果有多個bean符合條件,則拋出錯誤。
● constructor:這個方式類似于byType,但是要提供給構造器參數,如果沒有確定的帶參數的構造器參數類型,將會拋出異常。
● autodetect:首先嘗試使用constructor來自動裝配,如果無法工作,則使用byType方式。???????
基于Java的配置,允許你在少量的Java注解的幫助下,進行你的大部分Spring配置而非通過XML文件。以@Configuration注解為例,它用來標記類可以當做一個bean的定義,被SpringIOC容器使用。另一個例子是@Bean注解,它表示此方法將要返回一個對象,作為一個bean注冊進Spring應用上下文。
相對于XML文件,注解型的配置依賴于通過字節碼元數據裝配組件,而非尖括號的聲明。開發者通過在相應的類,方法或屬性上使用注解的方式,直接組件類中進行配置,而不是使用xml表述bean的裝配關系。
注解裝配在默認情況下是不開啟的,為了使用注解裝配,我們必須在Spring配置文件中配置<context:annotation-config/>元素。
使用SpringJDBC框架,資源管理和錯誤處理的代價都會被減輕。所以開發者只需寫statements和queries從數據存取數據,JDBC也可以在Spring框架提供的模板類的幫助下更有效地被使用,這個模板叫JdbcTemplate。JdbcTemplate類提供了很多便利的方法解決諸如把數據庫數據轉變成基本數據類型或對象,執行寫好的或可調用的數據庫操作語句,提供自定義的數據錯誤處理。
在Spring中有兩種方式訪問Hibernate:
● 控制反轉:HibernateTemplate和Callback。
● 繼承HibernateDAOSupport提供一個AOP攔截器。
Spring支持以下ORM框架:
● Hibernate
● MyBatis
● JPA (Java Persistence API)
● TopLink
● JDO (Java Data Objects)
● OJB
AOP(Aspect Oriented Programming),即面向切面編程,可以說是OOP(Object Oriented Programming,面向對象編程)的補充和完善。OOP引入封裝、繼承、多態等概念來建立一種對象層次結構,用于模擬公共行為的一個集合。不過OOP允許開發者定義縱向的關系,但并不適合定義橫向的關系,例如日志功能。日志代碼往往橫向地散布在所有對象層次中,而與它對應的對象的核心功能毫無關系。對于其他類型的代碼,如安全性、異常處理和透明的持續性也都是如此。這種散布在各處的無關的代碼被稱為橫切(cross cutting),在OOP設計中,它導致了大量代碼的重復,而不利于各個模塊的重用。
AOP技術恰恰相反,它利用一種稱為“橫切”的技術,剖解開封裝的對象內部,并將那些影響了多個類的公共行為封裝到一個可重用模塊,并將其命名為“Aspect”,即切面。所謂“切面”,簡單說就是那些與業務無關,卻為業務模塊所共同調用的邏輯或責任封裝起來,便于減少系統的重復代碼,降低模塊之間的耦合度,并有利于未來的可操作性和可維護性。使用“橫切”技術,AOP把軟件系統分為兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關系不大的部分是橫切關注點。橫切關注點的一個特點是,他們經常發生在核心關注點的多處,而各處基本相似,比如權限認證、日志、事物。AOP的作用在于分離系統中的各種關注點,將核心關注點和橫切關注點分離開來。AOP核心就是切面,它將多個類的通用行為封裝成可重用的模塊,該模塊含有一組API提供橫切功能。比如,一個日志模塊可以被稱作日志的AOP切面。根據需求的不同,一個應用程序可以有若干切面。在Spring AOP中,切面通過帶有@Aspect注解的類實現。
關注點是應用中一個模塊的行為,一個關注點可能會被定義成一個我們想實現的一個功能。橫切關注點是一個關注點,此關注點是整個應用都會使用的功能,并影響整個應用,比如日志,安全和數據傳輸,幾乎應用的每個模塊都需要的功能。因此這些都屬于橫切關注點。
被攔截到的點,因為Spring只支持方法類型的連接點,所以在Spring中連接點指的就是被攔截到的方法,實際上連接點還可以是字段或者構造器。
通知是個在方法執行前或執行后要做的動作,實際上是程序執行時要通過SpringAOP框架觸發的代碼段。
Spring切面可以應用五種類型的通知:
● before:前置通知,在一個方法執行前被調用。
● after:在方法執行之后調用的通知,無論方法執行是否成功。
● after-returning:僅當方法成功完成后執行的通知。
● after-throwing:在方法拋出異常退出時執行的通知。
● around:在方法執行之前和之后調用的通知。
切入點是一個或一組連接點,通知將在這些位置執行。可以通過表達式或匹配的方式指明切入點。
被一個或者多個切面所通知的對象。它通常是一個代理對象。也指被通知(advised)對象。
代理是通知目標對象后創建的對象。從客戶端的角度看,代理對象和目標對象是一樣的。
把切面(aspect)連接到其它的應用程序類型或者對象上,并創建一個被通知(advised)的對象,這樣的行為叫做織入。織入可以在編譯時,加載時,或運行時完成。??????????????