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。