天天看點

Spring架構入門篇(1)spring——bean的配置及作用域spring——bean的生命周期

什麼是架構

Spring簡介

IOC(配置)

Bean(配置、注解)

AOP(配置、注解、AspectJ、API)

1. spring官方網站首頁 http://spring.io/

2.官網中ioc與aop所在的網頁 http://projects.spring.io/spring-framework/

首先得明spring是一個開源架構,最初是為了解決企業應用開發的複雜性而建立的,但是現在不止是應用于企業應用。是一個輕量級的控制反轉(IOC)和面向切面程式設計(AOP)的容器架構。通過IOC可以達到松耦合的目的提供了面向切面程式設計的豐富支援,允許通過分離應用的業務邏輯與系統級服務進行内聚性的開發。spring包含并管理應用的配置和生命周期,這個意義生是一種容器将簡單的元件配置,組合成為複雜的應用,這個意義上市架構。

在spring上開發應用 簡單 友善 快捷。而且帶來了複雜JavaEE開發的春天。

spring的作用: 1:容器

2:提供了對多種技術的支援 ()JMS MQ支援 UnitTest …. 3:AOP(事務管理 ,日志 等)

4:提供了衆多友善的輔助類(JDBC Template等)

5:對主流應用架構(Hibernate)提供了良好的支援。

适用範圍:建構企業應用(springMVC+Spring+Hibernate/ibatis)

單獨使用Bean容器

單獨使用AOP進行切面處理

其他的Spring功能 如:對消息的支援等在網際網路中的應用。

Spring能很好的與各大架構進行了內建,不用spring還要用建立一個工廠來建立對象,這個spring相當與做了這個工廠幫你做了建立對象的功能,還有它通過AOP幫助你管理事務,你在用Hibernate的時候如果不用spring的時候是不是每次都要寫事務的送出這些代碼有了它幫你管理後你就不必去管事務送出了沒有。還有它的面向切面程式設計(AOP)還可以在你寫要記錄日志的時候添加一條記錄後需要在資料裡同時添加一條添加成功了或失敗的記錄那麼就可以用Spring裡的Aop來處理,雖然不用Aop也能做但是不用Spring的Aop你就會寫很多重複的代碼了。

它(ioc)會幫你去維護對象的建立,你隻要用就可以了。

簡單來說,Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器架構。

◆輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring架構可以在一個大小隻有1MB多的JAR檔案裡釋出。并且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴于Spring的特定類。

◆控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了松耦合。當應用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己建立或者查找依賴對象。你可以認為IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動将依賴傳遞給它。

◆面向切面——Spring提供了面向切面程式設計的豐富支援,允許通過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務(transaction)管理)進行内聚性的開發。應用對象隻實作它們應該做的——完成業務邏輯——僅此而已。它們并不負責(甚至是意識)其它的系統級關注點,例如日志或事務支援。

◆容器——Spring包含并管理應用對象的配置和生命周期,在這個意義上它是一種容器,你可以配置你的每個bean如何被建立——基于一個可配置原型(prototype),你的bean可以建立一個單獨的執行個體或者每次需要時都生成一個新的執行個體——以及它們是如何互相關聯的。然而,Spring不應該被混同于傳統的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。

◆架構——Spring可以将簡單的元件配置、組合成為複雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML檔案裡。Spring也提供了很多基礎功能(事務管理、持久化架構內建等等),将應用邏輯的開發留給了你。

所有Spring的這些特征使你能夠編寫更幹淨、更可管理、并且更易于測試的代碼。它們也為Spring中的各種子產品提供了基礎支援。

Spring的兩大核心AOP與IOC,可以單獨用于任何應用,包括與Struts等MVC架構與Hibernate等ORM架構的內建,目前很多公司所謂的輕量級開發就是用 Spring + Struts(2)+Hibernate。

Spring MVC就是一個MVC架構,個人覺得Spring MVC annotation式的開發比Struts2友善,可以直接代替上面的Struts(當然Struts的做為一個非常成熟的MVC,功能上感覺還是比Spring強一點,不過Spring MVC已經足夠用了)。當然spring mvc的執行效率比struts高,是因為struts的值棧影響效率

spring mvc類似于struts的一個MVC開架構,其實都是屬于spring,spring mvc需要有spring的架包作為支撐才能跑起來

如果有人問你什麼事控制反轉(spring的核心面試常問道):你就回答,本來程式是由我們new 出來的嘛,後來交給程式控制進行new出來了嘛,這就是控制反轉嘛。

架構的特點

-半成品

-封裝了特定的處理流程和控制邏輯

-架構是成熟的、不斷改進的軟體

架構與類庫的差別

-架構一般是封裝了邏輯、高内聚的

-類庫是松散的工具組合

-架構專注于某一領域,類庫則更通用

為什麼使用架構

-軟體系統日趨複雜

-重用度高,進而提高開發效率和提高品質

-軟體設計人員要專注于對領域的兩節,使需求分析更充分

-易于上手、快速解決問題

**接口:使用者溝通的中介物的抽象化。在Java8中,接口可以擁有方法體。

抽象類:

普通類:

面向接口程式設計:厘清層次及調用關系,每層隻向上提供一組功能接口,各層間依賴接口而非實作類。而且,接口實作的變動并不影響各層的調用。其實“接口”是用于隐藏具體實作和實作多态性的元件。

Spring IOC是一種設計模式,使對象不用顯示的建立依賴對象,而是将對象建立的過程交給Spring的IOC容器去管理,通過依賴注入的方式,來實作IOC;

依賴注入的方式有兩種:

1、設值注入:即通過XML中配置bean的依賴類,通過層級property屬性,來配置依賴關系,然後Spring通過setter方法,來實作依賴類的注入;

2、構造器注入:方法同設值注入,不過具體實作的方法是通過顯示的創造一個構造方法,構造方法的參數名稱要與XML中配置的name名稱一緻,XML配置的标簽為constructor-arg

IOC:(控制反轉)控制權的轉移,應用程式本身并不負責依賴對象的建立和維護,而是由外部容器負責建立和維護。

DI(依賴注入)是IOC的一種實作方式。

目的:建立對象并且組裝對象之間的關系。

構造器注入:在xml檔案中是constructor_arg,

需要顯式地寫出InjectionServiceImpl(InjectionDAO injectionDAO)的構造器

設定注入:在xml檔案中是property,

無需寫出構造方法,要寫setInjectionDAO(InjectionDAO injectionDAO)的設值方法**

spring——bean的配置及作用域

*Bean配置項

*Bean的作用域

*Bean的生命周期

*Bean的自動裝配

*Resources&ResourceLoader

1.bean的常用配置項:(理論上隻有class是必須的)

id:唯一辨別

class:具體是哪一個類

scope:範圍

constructor arguments:構造器的參數

properties:屬性

Autowiring mode:自動裝配模式

lazy-initialization mode:懶加載模式

initialization/destruction method:初始化/銷毀的方法

2.bean的作用域

singletion 單例 bean容器隻有唯一的對象(預設模式)

prototype 每次請求會建立新的執行個體,destory方式不生效

request 對于request建立新的執行個體,隻在目前request内有效

session 對于session建立新的執行個體,隻在目前session内有效

global session 基于portlet(例如單點登入的範圍)的web中有效,如果在web中同session

bean的作用域:

spring——bean的生命周期

生命周期:定義,初始化,使用,銷毀

一.初始化:

方法1.實作org.springframework.beans.foctory.InitializingBean接口,覆寫afterPropertiesSet方法。系統會自動查找afterPropertiesSet方法,執行其中的初始化操作

方法2.配置init-method

例如設定bean中init-method=”init”那麼在初始化過程中就會調用相應class指定類的init()方法進行初始化工作

二 銷毀(與初始化類似)

方法1.實作org.springframework.beans.foctory.DisposableBean接口,覆寫destory方法。

方法2.配置destory-method

三 配置全局初始化、銷毀方法(屬于預設配置,參考截圖)

注意:

當三種方式同時使用時,全局(預設的)初始化銷毀方法會被覆寫。

另外實作接口的初始化/銷毀方式會先于配置檔案中的初始化/銷毀方式執行。

即使沒有以上三種初始化方法也是可以編譯執行的

Spring Bean裝配之Aware接口

1.ApplicationContextAware

1.1 接口方法:setApplicationContext

1.2 作用:通常用來擷取上下文對象,聲明全局變量後在方法中對變量進行初始化并供其他方法調用

1.3 實作過程:建立一個類并實作ApplicationContextAware接口,重寫接口方法public void

Bean的自動裝配(Autowiring)

1.No:不做任何操作

2.byname:根據屬性名自動裝配。此選項将檢查容器并根據名字查找與屬性完全一緻的bean,并将其與屬性自動裝配

3.byType:如果容器中存在一個與指定屬性類型相同的bean,那麼将與該屬性自動裝配;如果存在多個該類型的bean,那麼抛出異常,并指出不能使用byType方式進行自動裝配;如果沒有找到相比對的bean,則什麼事都不發生

4.Constructor:與byType方式類似,不同之處在于它應用于構造器參數。如果容器中沒有找到與構造器參數類型一緻的bean,那麼抛出異常

Bean的自動裝配:在beans标簽配置屬性

default-autowire=”no/byName/byType/constructor”

作用為:省去了在Spring的xml中配置property标簽和constructor-arg标簽,隻需要配置bean标簽即可

PS:byName和byType為設值注入,constructor為構造注入;

byName要求bean标簽的id屬性需要和成員變量的名稱一緻,

byType和constructor則跟id無關

Resources (針對于資源檔案的統一接口)

A、UrlResource:URL 對應的資源,根據一個 URL 位址即可擷取

B、ClassPathResource:擷取類路徑下的資源

C、FileSystemResource:擷取檔案系統裡面的資源

D、ServletContextResource:ServletContext 封裝的資源,用于通路 ServletContext 環境下的資源

E、InputStreamResource:擷取輸入流封裝的資源

F、ByteArrayResource:擷取位元組數組封裝的資源

通過實作 ApplicationContextAware 接口中的方法

setApplicationContext(ApplicationContext applicationContext)

Resource resource = applicationContext.getResource(“xxx”);

classpath:config.txt

file:C:\config.txt

ftp:C:\config.txt

http://www.baidu.com/more/

Bean 的定義及作用域注解

A、@Controller :注解控制器類(控制層 MVC)

B、@Service :注解服務類(服務層)

C、@Repository :注解 DAO 類(持久層)

D、@Component :将普通的 bean 注解到 spring 容器中,相當于配置檔案中的

< bean id=”xxx” class=”xxx”/>

元注解(Meta-annotations)

元注解即是許多 Spring 提供的注解可以作為自己的代碼,元注解是一個簡單的注解,可以應用到另一個注解

除了 value() 元注解還可以有其他的屬性,允許定制

類的自動監測及 Bean 的注冊

Spring 可以自動檢測類并注冊 Bean 到 Applicationcontext 中

< context:annotation-config />

通過基于 xml 的 Spring 配置

為了能夠自動檢測到這些類并注冊相應的 Bean ,需要

< context:component-scan base-package=”xxx” />

<context:component-scan> 包含 <context:annotation-config>,
           

通常使用前者後,就不需要再使用後者

使用過濾器進行自定義掃描

A、預設情況下,類被自動發現并注冊 bean 的條件:使用 @Component @Repository @Service @controller 注解或者使用 @Component 的自定義注解

B、可以通過過濾器修改預設注解的行為

C、還可以使用 use-default-filters = “false” 禁用自動發現與注冊