Spring注入及Spring Bean的裝配

1、Spring注入

      Spring注入是指在啓動Spring容器加載bean配置的時候,完成對變量的賦值行爲。

       常用的兩種注入方式:

              1、設值注入:通過成員變量的set方法進行注入。

        <!-- Spring IOC注入方式: 設值注入 -->  
            <bean id="injectionService" class="com.service.InjectionServiceImpl">  
            <property name="injectionDAO" ref="injectDAO"></property>  
        </bean>  

        <bean id="injectDAO" class="com.dao.InjectionDAOImpl"></bean>  

              2、構造注入:通過對類構造方法的進行注入。

        <!-- Spring IOC注入方式: 構造注入 -->  
        <bean id="injectionService" class="com.service.InjectionServiceImpl">  
            <constructor-arg name="injectionDAO" ref="injectDAO"></constructor-arg>  
        </bean>  
        <bean id="injectDAO" class="com.dao.InjectionDAOImpl"></bean>  

2、Spring Bean裝配

     2.1、Bean配置項

          Bean配置項包括:

             1、Id:IOC容器中,Bean的唯一標識。

             2、Class:具體要實例化的Class類。

             3、Scope:Bean的作用域。

          1. singleton:單例,一個Bean容器中只存在一種。如果JVM容器中有多個IOC容器,那麼就有singleton,那麼就有多個單例。

                   2. prototype:每次請求(每次使用)都會創建一個新的實例,destory方式不生效。

                   3. request:每次http請求創建一個實例且僅在當前request內有效。

                   4. session:每次http請求創建一個實例,且在當前session內有效。

                   5. global session:基於portlet的web中有效(prolet定義了global session),如果在web中,同session。

             4、Constructor arguments:構造器參數。

             5、Properties:Bean的屬性。

             6、Autowiring mode:Bean自動裝配模式。

             7、Lazy-initialization mode:懶加載模式。

             8、Initialization/destruction method:Bean初始化及銷燬方法。

      2.2 Bean的生命週期

               Bean的初始化:

               1、初始化

                   1. 通過實現 InitializingBean/DisposableBean 接口來定製初始化之後/銷燬之前的操作方法;

            public class ExampleInitializingBean implements InitializingBean{
                @Override
                public void afterPropertiesSet() throws Exception {
                }
            }

                   2. 通過 <bean> 元素的 init-method/destroy-method屬性指定初始化之後 /銷燬之前調用的操作方法;

            <bean class="InitSequenceBean" init-method="initMethod" destroy-method="destoryMethod"></bean> 

                   3. 在指定方法上加上@PostConstruct 或@PreDestroy註解來制定該方法是在初始化之後還是銷燬之前調用。

            三種初始化的順序是:

            Constructor > @PostConstruct > InitializingBean > init-method

      2.3 Bean的Aware接口

    1、Spring中提供了一些以Aware結尾的接口,實現了Aware接口的bean在被初始化後,可以獲取相應的資源。如ApplicationContextAware和BeanNameAware等。

            2、通過Aware接口,可以對Spring相應資源進行操作(要慎重)。

            3、爲對Spring進行簡單的擴展提供了方便的入口。

       2.4 Bean的自動裝配(Autowiring)

               1、No:不做任何操作。

       2、byname:根據屬性名自動裝配。此選項將檢查容器並根據名字查找與屬性完全一致的bean,並將其與屬性自動裝配。

       3、byType:如果容器中存在一個與指定屬性類型相同的bean,那麼將與該屬性自動裝配;如果存在多個該類型的Bean,那麼將拋出異常,並指出不能用byType方式進行自動裝配;如果沒有找到相匹配的bean,則什麼都不發生。

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

  2.5 Bean的resource

              針對資源文件的統一接口,包括:

             1、UrlResource:URL對應的資源,根據一個URL地址即可創建。

             2、ClassPathResource:獲取類路徑下的資源文件。

             3、FileSystemResource:獲取文件系統裏面的資源。

             4、ServletContextResource:ServletContext封裝的資源,用於訪問ServletContext環境下的資源。

             5、InputStreamResource:針對於輸入流封裝的資源。

             6、ByteArrayResource:針對於字節數組封裝的資源。

             如果沒有URL,也沒有路徑等,則會依據applicationContext的路徑查找文件。

         2.6 Bean管理的註解實現 

     從Spring3.0開始,Spring JavaConfig項目提供了很多特性,包括使用java而不是XML定義bean,比如@Configuration,@Bean,@Import,@DependsOn,@Component,@Respository,@Service,@Controller等。

      @Component是一個通用註解,可用於任何Bean。

      @Respository通常用於註解DAO類,即持久層。

      @Service通常用於註解Service類,即服務層。

      @Controller通常用於Controller類,即控制成(MVC)。 

    Spring可以自動檢測類並註冊Bean到ApplicationContext中,需要<context:component-scan>。如下,將base-package下的所有類都自動註冊到applicationContext:

          <context:component-scan base-package="com.mss " >
              Spring還可以通過使用過濾器自定義掃描,不包括在這些文件中標註有 @Service,如:
            <context:component-scan base-package="com.yiibai.customer" >
		<context:exclude-filter type="annotation" 
			expression="org.springframework.stereotype.Service" />		
	    </context:component-scan>
                  或不包括那些包含DAO這個詞組文件名,如:
            <context:component-scan base-package="com.yiibai" >
		<context:exclude-filter type="regex" 
			expression="com.yiibai.customer.dao.*DAO.*" />		
	    </context:component-scan>

                 2.7 Bean的作用域

      通常情況下會自動查找的Spring組件,其scope是singleton。若註解@Scope未定義是singleton或prototype等,默認爲singleton。
       Spring容器可以管理singleton作用域下Bean的生命週期,在此作用域下,Spring能夠精確地知道Bean何時被創建,何時初始化完成,以及何時被銷燬。而對於prototype作用域的Bean,Spring只負責創建,當容器創建了Bean的實例後,Bean的實例就交給了客戶端的代碼管理,Spring容器將不再跟蹤其生命週期,並且不會管理那些被配置成prototype作用域的Bean的生命週期。Spring中Bean的生命週期的執行是一個很複雜的過程,讀者可以利用Spring提供的方法來定製Bean的創建過程。Spring容器在保證一個bean實例能夠使用之前會做很多工作:

           

               2.8 Autowired註解

        @Autowired顧名思義,就是自動裝配,其作用是爲了消除代碼Java代碼裏面的getter/setter與bean屬性中的property。當然,getter看個人需求,如果私有屬性需要對外提供的話,應當予以保留。

       @Autowired是由Spring BeanPostProcessor處理的,所以不能在自己的BeanPostProcessor或BeanFactoryPostProcessor類型應用這些註解,這些類型必須通過XML或者Spring的@Bean註解加載。

       list和map使用@Autowired註解時,會自動將類的多個實例都註解進去。list可以通過@Order實現數組的排序,但map不能排序(因爲map是key鍵值對)。

2.9 @Qualifier註解

      按類型自動裝配可能多個bean實例的情況,可以使用Spring的@Qualifier註解縮小範圍(或指定唯一),也可以用於指定單獨的構造器參數或方法參數。也可用於註解集合類型變量。

2.10 基於java的容器註解

       @Bean標識一個用於配置和初始化一個由SpringIOC容器管理的新對象的方法,類似於XML配置文件的<bean/>。

        可以在Spring的@Component註解的類中使用@Bean註解任何方法(僅僅是可以)。通常使用的是@Configuration。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章