1. 程式人生 > >spring學習(一) ———— IOC講解

spring學習(一) ———— IOC講解

autowired release 學習 屬性信息 truct 情況 type tor world

spring基本就兩個核心內容,IOC和AOP。把這兩個學會了基本上就會用了。

                    --WH

一、什麽是IOC?

    IOC:控制反轉,通俗點講,將對象的創建權交給spring,我們需要new對象,則由spring幫我們創建,然後供我們使用。

    編寫IOC的helloworld。簡單的三步就搞定了

      1、導入jar包

          5個包,4個核心包,1個依賴包

              

            技術分享圖片  

      2、編寫配置文件

          spring幫我們創建對象,但也必須有相關類的信息,不然怎麽能夠創建呢?

          配置文件名稱:建議:ApplicationContext.xml,取別的也可以,但是取建議的名稱的話,找到該配置文件更為簡單,

          配置文件位置:任意,一般都在classpath下(src)

          文件約束內容:添加約束,spring-framework-3.2.0.RELEASE 為spring的核心 docs為幫助文檔

               約束位置:spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html\xsd-config.html

              技術分享圖片

                   技術分享圖片 

                

      3、從spring容器中獲取對象

            技術分享圖片

    

        UserService.java              

              技術分享圖片

二、依賴註入(DI)

      現在應該知道了什麽是IOC,helloworld很簡單吧,但spring如果只提供這麽一個簡單的功能,就不能被大家那麽所崇拜了,上面只是把IOC這個功能給大家簡單展示一下,讓大家腦海中有IOC是幹什麽的,能做什麽的概念,現在就對其進行加強把。

      依賴註入(DI):spring創建對象A時,會將對象A所依賴的對象B也創建出來,並自動註入到對象A中。

              依賴:(has a) 有一個的意思,比如類A中有一個類B,那麽就說A依賴B。         繼承,實現(is a)

                  技術分享圖片                

              而我們說的依賴註入,就是當創建A對象時,同時會將B對象給創建,並自動註入到對象A中去,也就說,我只叫spring給我A對象,但是A中可以使用B對象了。這個有很大的用處,但如何去實現依賴註入功能呢?

            技術分享圖片

            技術分享圖片

        UserService中有使用userDao對象,這個我們都很熟悉的使用伎倆,service層調用dao層的方法。按照往常我們的寫法,在service中需要自己new出UserDao對象,但是在spring中就不需要了,一切對象都讓spring幫我們創建。

        ApplicationContext.xml

            技術分享圖片

        過程就如圖中所畫,先創建UserService對象,然後在根據property中的ref找到userDaoId並創建UserDao對象,然後根據property中的name,通過setter方法註入,這樣就完成了依賴註入。

       測試:

          技術分享圖片

      

三、spring創建實例對象的三種方法

       因為並不是每個bean都是普通類,有些是通過工廠來獲取的,而工廠就有靜態工廠和實例工廠,所以spring創建實例對象有三種情況,

       默認無參構造,就是編寫IOC的helloworld的那種方式,直接<bean id="" class="">

       靜態工廠:由於是靜態工廠,所以通過工廠類直接調用創建實例的方法就可以了。

            <bean id="" class="工廠全限定類名" factory-method="靜態方法">

       實例工廠:需要先創建出工廠實例,然後在由工廠創建對象

            <bean id="myFactoryId" class="工廠全限定類名"></bean>

            <bean id="" factory-bean="myFactoryId" factory-method=""></bean>

      

四、屬性依賴註入基於XML

       之前講的那個依賴註入其實也屬於屬性依賴註入這一範疇中,在最開始我們演示IOC(控制反轉)也就是spring幫我們創建實例時,那只是通過無參構造方法進行創建,那麽在實際開發中,這樣創建肯定是不行的,所以我們需要在spring的配置文件中配置一些屬性信息,使spring幫我們創建時,可以直接將對象的一些屬性也註入進去,有兩種方法

       通過構造方法註入

          技術分享圖片    

          不管是普通屬性還是引用數據,都可以通過構造方法進行註入。

       通過setter方法進行註入

           技術分享圖片    

           通過setter方法對普通屬性和引用屬性進行註入,那麽要是創建的對象中有集合呢?那該如何進入註入?

         集合的註入List、Map、Set、數組、Properties等。

           List

             技術分享圖片   

           set

              技術分享圖片

           map

              技術分享圖片

           數組

              技術分享圖片

           propertyis

              技術分享圖片

            註意:properties這種類型存放形式跟map差不多,以key和value進行存放的,

                  技術分享圖片

      到這裏,基本上就把所有能夠註入的屬性類型都講解完了,註入的類型基本上分為三塊,普通類型,引用類型和集合。下面在講一種基於註解來註入各種,因為基於xml感覺很麻煩。

五、屬性依賴註入基於註解

      註解格式:@xxx

      使用註解:必須對使用註解的地方進行掃描,不然註解沒用。而掃描需要做兩件事

          1、添加名稱空間,

              在我們找配置文件中約束的位置那:spring-framework-3.2.0.RELEASE\docs\spring-framework-reference\html\xsd-config.html 找到context的名稱空間。

              技術分享圖片

                  技術分享圖片     

          2、掃描指定的目錄,

                  技術分享圖片

     註解:

        1、@Component  替代  <bean id="" class=""> 可以配置任意bean,在所在類上面添加該註解即可,

                @Component("userId") userId相當於bean中的id屬性值

                技術分享圖片 

        2、  這三個就跟使用@Component是一樣的,但是為了更好的體現三層架構,就有了這三個註解

         @Controller  修飾web層中的類。

         @Service  修飾service層的類

         @Repository  修飾dao層的類

            兩種方式,一種不聲明名稱,一種聲明名稱

            @Controller("xxx")  @Controller  

            如果聲明了名稱,那麽在別的地方引用的話,就可以使用@Autowired或@Autowired與@Qualifier的組合 或直接使用@Resource按照名稱註入

            如果沒有聲明名稱,那麽在別的地方引用的話,只能使用@Autowired 來進行註入

       3、屬性註入

         普通屬性

            @Value    @Value("")  給普通屬性註入屬性值

          引用屬性

            @Autowired  按默認類型進行註入

            @Qualifier("") 按照名稱註入  

            如果使用了@Qualifier這個註解,那麽就需要兩個一起使用才能生效。如果只使用@Autowired,那麽寫不寫@Qualifier都可以

          引用屬性

            @Resource  直接按照名稱註入,與上面兩個註解一起使用是等效的  

                @Resource(name="xxx")

             

       4、使用

           技術分享圖片

                       

       5、其他註解

           @Scope("prototype")  作用域註解(spring幫我們創建的bean實例的作用域,在下面會講解到)

           @PostConstruct  修飾初始化    

           @PreDestory  修飾銷毀      

                最後兩個用的不多,掌握前面的即可。

      

六、spring創建的bean的作用域  

      也就是spring幫我們創建的bean的使用範圍。

      格式:<bean id="" class="" scope="....">

      取值:

          技術分享圖片  

      掌握前兩個,singleton 和prototype

          singleton:單例,也就是當spring通過xml配置文件幫我們創建一個bean對象時,那我們拿到的就一直是同一個對象,僅存在一個那樣的bean實例。默認值

                技術分享圖片

              技術分享圖片

          prototype:每次我們需要bean實例時,都會創建一個新的實例。

                技術分享圖片

              技術分享圖片

七、編寫applicationcontext.xml提示問題

         五步即可解決

         第一步:spring的核心jar中找到Scheme xsd文檔

              spring-framework-3.2.0.RELEASE\schema\beans\spring-beans-3.2.xsd

              技術分享圖片

         第二步:從xml配置文件中,獲取xsd文檔位置,復制....spring-beans.xsd

              技術分享圖片

         第三步:window/preferences/ 搜索 “xml catalog”

              技術分享圖片  

        第四步:

              技術分享圖片

        第五步:

              技術分享圖片

        

            註意:如果xml沒有提示,關閉xml重寫打開。

八、總結

      spring的第一個重點IOC,就這樣講完了,其實看完之後非常簡單,就是讓spring給你創建對象,你想要對象的時候,就找spring,讓他給。

      學的東西有:

          什麽是IOC,什麽是依賴註入。

          之後對依賴註入進行詳細的講解。

                使用xml方式和使用註解方式

      說簡單點,這一節就是學會了通過配置,讓spring幫我們創建我們想要的bean,

spring學習(一) ———— IOC講解