spring學習(二)配置bean
Spring可以分為6大模組:
-
Spring Core spring的核心功能: IOC容器, 解決物件建立及依賴關係
-
Spring Web Spring對web模組的支援。
-
可以與struts整合,讓struts的action建立交給spring
-
spring mvc模式
-
-
Spring DAO Spring 對jdbc操作的支援 【JdbcTemplate模板工具類】
-
Spring ORM spring對orm的支援:
-
既可以與hibernate整合,【session】
-
也可以使用spring的對hibernate操作的封裝
-
-
Spring AOP 切面程式設計
-
SpringEE spring 對javaEE其他模組的支援
Spring Core 配置bean
引入jar包,涉及到Spring core的開發jar包有五個:
-
commons-logging-1.1.3.jar 日誌
-
spring-beans-3.2.5.RELEASE.jar bean節點
-
spring-context-3.2.5.RELEASE.jar spring上下文節點
-
spring-core-3.2.5.RELEASE.jar spring核心功能
-
spring-expression-3.2.5.RELEASE.jar spring表示式相關表
Spring核心的配置檔案applicationContext.xml
或者叫bean.xml
,通過ClassPathXmlApplicationContext來獲取ApplicationContext(IOC容器)
在Spring中可以通過三種方式來配置物件:
-
使用XML檔案配置
-
使用註解來配置
-
使用JavaConfig來配置
使用Xml配置bean
-
普通帶引數的構造方法
<bean id="user" class="bean.User">
<!--
通過constructor這個節點來指定建構函式的引數型別、名稱、第幾個(index)
如果建構函式的引數值是一個物件,而不是一個普通型別的值,我們就需要用到ref屬性了,而不是value
-->
<constructor-arg name="id" type="java.lang.String" value="1"/>
<constructor-arg name="username" type="java.lang.String" value="tom"/>
</bean>
-
工廠靜態方法
<!--工廠靜態方法建立物件,直接使用class指向靜態類,指定靜態方法就行了-->
<bean id="user" class="bean.Factory" factory-method="getBean"/>
-
工廠非靜態方法:先建立工廠bean,用工廠bean呼叫非靜態方法
<bean id="factory" class="bean.Factory"/>
<bean id="user" class="bean.User" factory-bean="factory" factory-method="getBean"/>
-
構造方法傳入集合
使用註解配置bean
通過註解來配置資訊就是為了簡化IOC容器的配置,註解可以把物件新增到IOC容器中、處理物件依賴關係
使用註解前提步驟:
-
xml配置檔案先引入context名稱空間
-
xmlns:context="http://www.springframework.org/schema/context"
-
xsi:schemaLocation新增
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
-
-
開啟註解掃描器
-
第一種方法:在xml新增
<context:component-scan base-package="包名"></context:component-scan>
-
第二種方法:通過自定義掃描類以@CompoentScan修飾來掃描IOC容器的bean物件。在使用@ComponentScan()這個註解的時候,在測試類上需要@ContextConfiguration這個註解來載入配置類,@ContextConfiguration這個註解在Spring的test包下
//表明該類是配置類
-
建立物件以及處理物件依賴關係,相關的註解:
-
@ComponentScan掃描器
-
@Configuration表明該類是配置類
-
@Component 指定把一個物件加入IOC容器,把普通pojo例項化到spring容器中,相當於配置檔案中的<bean id="" class=""/>
-
@Repository 作用同@Component; 在DAO層使用
-
@Service 作用同@Component; 在業務邏輯層使用
-
@Controller 作用同@Component; 在控制層使用
-
@Resource 依賴關係
-
如果@Resource不指定值name,那麼就根據型別來找,相同的型別在IOC容器中不能有兩個
-
如果@Resource指定了值,那麼就根據名字來找
-
測試程式碼
//把物件新增到容器中,首字母會小寫
使用JavaConfig配置bean
由於Spring的自動裝配並不能將第三方庫元件裝配到應用中,於是需要顯式裝配配置。
通過java程式碼來配置Bean:
-
編寫一個java類,使用@Configuration修飾該類,被@Configuration修飾的類就是配置類
-
在配置類中使用@Bean修飾方法,蔣返回值加入到IOC容器中
-
使用@Bean來修飾方法,該方法返回一個物件。
-
不管方法體內的物件是怎麼建立的,Spring可以獲取得到物件就行了。
-
Spring內部會將該物件加入到IOC容器中
-
容器中bean的ID預設為方法名
-
-
在測試類使用@ContextConfiguration載入配置類的資訊
三種方式混合使用
註解和XML配置是可以混合使用的,JavaConfig和XML也是可以混合使用的…
如果JavaConfig的配置類是分散的,我們一般再建立一個更高階的配置類(root),然後使用@Import來將配置類進行組合 如果XML的配置檔案是分散的,我們也是建立一個更高階的配置檔案(root),然後將配置檔案組合
在JavaConfig引用XML
-
使用@ImportResource()
在XML引用JavaConfig
-
使用<bean>節點就行了
<bean>節點的屬性
scope屬性
scope的值就只有兩個:單例、多例,spring預設是單例
-
當我們使用singleton【單例】的時候,從IOC容器獲取的物件都是同一個,預設是單例 【service/dao/工具類】
-
當使用singleton的時候,物件在IOC容器初始化時建立
-
-
當我們使用prototype【多例】的時候,從IOC容器獲取的物件都是不同的,【Action物件】
-
當使用prototype的時候,物件在使用的時候才建立
-
lazy-init屬性
lazy-init屬性只對singleton【單例】的物件有效,lazy-init預設為false
有的時候,可能我們**想要物件在使用的時候才建立,那麼將lazy-init設定為ture
init-method和destroy-method
如果我們想要物件在建立後,執行某個方法,我們指定為init-method屬性,對應物件的init_user方法
如果我們想要IOC容器銷燬後,執行某個方法,我們指定destroy-method屬性,在呼叫容器物件的destroy方法時候執行(容器用實現類)