spring(一)-基本概念

1、定義與特色java

  定義:一個分模塊的一站式後臺開發框架。spring

  特徵:數據庫

  (1)比起EJB,更輕量級別的容器框架,模塊形式組織,只須要調用相應模塊(jdbc、springmvc)編程

  (2)Spring IOC低耦合容易組合對象之間的關係設計模式

  (2)AOP更易對功能進行擴展,不須要將無關代碼寫進主業務中session

  (3)Spring並非直接造輪子,而是利用已有技術,好比ORM(對象關係映射,將對象映射到數據庫)框架,logging框架;架構

二、  IOC/DImvc

  控制反轉/依賴注入, bean自己不相互依賴,產生關係的活動進行不依賴於任何一方,整個依賴關係構建(注入)由第三方負責管理。框架

  控制反轉其實現方法是依賴注入,甲方開放接口,在它須要的時候,可以讓乙方傳遞進來(注入)函數

  傳統的方式是經過在程序中本身new對象A,再構建依賴對象B並注入到A中;

   

 

  而Spring中建立和注入對象這過程交給了IOC容器處理,即動態的向某個對象提供他所須要的依賴對象,基礎技術是反射。

  

  優勢1,沒必要要了解下層類代碼(歷史維護的底層代碼),直接在須要的時候注入。實際項目中,有的Service Class多是十年前寫的,有幾百個類做爲它的底層。假設咱們新寫的一個API須要實例化這個Service,就須要瞭解大量歷史代碼。IoC Container的這個特性就很完美的解決了這類問題——由於這個架構要求你在寫class的時候須要寫相應的Config文件,因此你要初始化好久之前的Service類的時候,前人都已經寫好了Config文件,你直接在須要用的地方注入這個Service就能夠了。這大大增長了項目的可維護性且下降了開發難度。

  優勢2,資源由第三方控制,下降耦合度,同時方便資源的配置和管理。

三、 AOP

  在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。

  (我的對於aop理解就是經過代理模式,將與主業務無關的代碼插入整個邏輯中,而不污染原有的功能結構)

四、 bean配置(bean註冊)

  (1)    基於xml的bean配置(ApplicationContext)

  使用被Spring命名空間的所支持的一系列的XML標籤來實現,如context、beans、jdbc、tx、aop、mvc等。      

       屬性<property name="name" value="tom"></property>

  構造方法<constructor-arg value="Mike" name="name"></constructor-arg>

  (2)    基於註解的bean配置

  將bean描述轉移到組件類的內部,只須要在相關類上、方法上或者字段聲明上使用註解即。

        @Component:泛指通用組件;用於對組件類進行標註

  @Repository:用於對DAO組件類進行標註;

  @Service:用於對Service組件類進行標註;

  @Controller:用於對Controller組件類進行標註;

         (3)基於java類的bean配置(經過代碼配置)

         @Configuration所註解的類則表示這個類的主要目的是做爲bean定義的資源相似於<beans>;@Bean註解標註某個方法,告知這個方法返回一個對象,相似於<bean>。Ps:與A相比,由於是java代碼,能夠在編譯器檢查類型合法和id惟一。

  下圖左上是基於java的bean聲明的基本語法方式,右上是如何進行bean之間的相互依賴聲明,下方是如何初始化和調用的過程。

 

 

 

五、 bean注入(bean使用,eg:類中包含一個類對象bean)

  (1)    基於xml注入-屬性注入

  屬性注入要求Bean提供一個默認的構造函數,併爲須要注入的屬性提供對應的SetXXX方法。Spring先調用Bean的默認構造函數實例化Bean對象,而後經過反射的方式調用Setter方法注入屬性值。

public class LogonService implements BeanNameAware{

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {

        this.userDao = userDao;

    }

}

 

<bean id="userDao" class="com.baobaotao.anno.UserDao"/>

<bean class="com.baobaotao.anno.LogonService">

    <property name="userDao" ref="userDao"></property>

</bean>

 

  (2)    基於xml注入-構造方法

  使用構造函數注入的前提是Bean必須提供帶參數的構造函數。

public class LogonService implements BeanNameAware{

    private UserDao userDao;

public LogonService(){}

    public LogonService(LogDao logDao, UserDao userDao) {

        this.userDao = userDao;

    }}

 

<bean id="userDao" class="com.baobaotao.anno.UserDao"/>

<bean class="com.baobaotao.anno.LogonService">

    <constructor-arg ref="userDao"></constructor-arg>

</bean>

 

  (3)    基於註解注入

  @required註釋在某個設置方法上,避免由於bean太多致使忘記注入

  @Autowired有更細粒度的裝配控制

  @Qualifier(「userDao」)用於處理存在兩個相同類型的bean時,自動裝配產生歧義的問題

@Service

public class LogonService implements BeanNameAware{

    @Autowired(required=false)

    @Qualifier("userDao")

private UserDao userDao;}

 

六、 spring中bean的自動裝配

  無須在Spring配置文件中描述JavaBean之間的依賴關係(如配置<property>、<constructor-arg>)。IOC容器會自動創建javabean之間的關聯關係。

  (1)    no-默認狀況下采用」ref」進行手動綁定;

  (2)    byname-根據名字進行裝配

    

  (3)    byType-根據某個bean所持有的依賴變量的數據類型進行自動裝配

    

  (4)    constructo-與byType相似,只不過是按照構造函數的參數類型進行對應bean匹配

  (5)    autodetect-自動使用constructor和byType進行自動裝配

 

七、 Spring做用域

  結構:<bean id="userDao" class="com.ioc.UserDaoImpl" D="singleton"/>

  singleton:單例模式,Spring IoC容器中只會存在一個共享的Bean實例,不管有多少個Bean引用它,始終指向同一對象。Singleton做用域是Spring中的缺省做用域,也能夠顯示的將Bean定義爲singleton模式,配置爲:

  prototype:原型模式,每次經過Spring容器獲取prototype定義的bean時,容器都將建立一個新的Bean實例,每一個Bean實例都有本身的屬性和狀態,

  request:在一次Http請求中,容器會返回該Bean的同一實例。而對不一樣的Http請求則會產生新的Bean,並且該bean僅在當前Http Request內有效,當前Http請求結束,該bean實例也將會被銷燬。

  session:在一次Http Session中,容器會返回該Bean的同一實例。而對不一樣的Session請求則會建立新的實例,該bean實例僅在當前Session內有效。

  global Session:在一個全局的Http Session中,容器會返回該Bean的同一個實例,僅在使用portlet context時有效。

 

八、 Spring中設計模式

  單例模式-針對bean的singleton做用域

  代理模式-AOP中體現的動態代理

  工廠模式- BeanFactory用來建立對象的實例

相關文章
相關標籤/搜索