Spring學習文檔
Spring特點
Spring的最大的目的:是J2EE開發更加容易;
- 簡單舒適的面向接口編程;
- Spring是全面的、模塊化的、採用分層架構,可以僅選擇其中任何一個獨立的部分,而它的架構是內部一致的。
- Spring致力於是現有技術更加易用,例如:沒有底層業務的事務調度,但是提供了一個凌駕於JTA或其他事務策略的抽象層。
- 使應用程序更加容易測試,是測試驅動項目的一個理想框架。
1.控制反轉
控制反轉就是指應用本身不負責依賴對象的創建和維護,依賴對象的創建和維護由外部容器來負責,這樣控制權就轉移到了外部容器,控制權的轉移就是所謂的反轉;
例如:
public class PersonServiceBean{
private PersonDao personDao =new PersonDaoBean();
public void save (Person person){
personDao.save(person);
}
}
PsersonDaoBean是在應用內部創建及維護的。
當我們把依賴對象交給外部容器負責創建,那麼PersonServiceBean類可以改成如下:
public class PersonServiceBean{
priate PersonDao personDao;
public PersonServiceBean(PersonDao personDao){
this,personDao = personDao;
}
public void save(Person person){
personDao.save(person);
}
}
2.依賴注入
在運行期,由外部容器動態的將依賴對象注入到組件中,
注意:由於依賴對象的創建現在已經交給了外部容器,所以容器創建好對象就要注入到應用,這樣是通過構造器參數的方式實現的。
3.使用Spring的好處
- 降低組件之間的耦合度,實現軟件各層之間的解耦。
- 使用容器能夠給我們提供了事務控制等各種服務。
- 提供了單例模式。
- 提供了AOP技術。
- 提供了多個輔助類。
- 對主流框架提供了集成支持。
4.Spring的配置文件名稱是隨意的
5.Spring的實例化方式
- 在類路徑下尋找配置文件進行容器實例化:
ApplicationContext ctx = new
ClassPathXmlApplicationContext(new String[]{“bean.xml”}); - 在文件系統路徑下尋找配置文件進行容器實例化:
ApplicationContext ctx = new
FileSystemXmlApplicationContext(new String[]{“D:\bean.xml”});
注意:建議使用類路徑,既第一種方式,以爲第二種方式是有操作系統差異的,並且可以指定多個配置文件,指定多個時候只需要在String數組中繼續添加即可
6.配置文件中配置bean的時候id和name的區別
當用id進行指定bean能出現特殊字符,但是name中可以出現特殊字符。
建議:當沒有特殊字符出現的時候儘量用id進行指定。
7.實例化Bean的三種方法
- 使用類構造器實例化:
<bean id = "personService" class = "cn.service.impl.PersonServiceBean"></bean>
- 使用靜態工廠方法實例化:
創建一個beanfactory類,這個類是個專門實例化bean的類,裏面有一個static方法專門進行bean實例創建,此時beans.xml文件中則應該這樣寫:
<bean id = "bean實例名稱" class = "實例化工廠類的名稱" factory-method = "c創建實例的靜態方法名"></bean>
- 使用實例工廠方法實例化:
創建一個beanfactory類,在該類中聲明一個非static的方法進行bean實例的創建,此時在beans.xml文件中則應該首先對beanfactory類進行實例化然後再進行bean的實例化。寫法如下:
<bean id = "bean實例化工廠的名稱" class = "實例化工程類的名稱"></bean>
<bean id = "bean實力名稱" class = "實例化工廠類名稱" factory-method = "創建實例的方法名"></bean>
8.Bean的作用域
singleton:在每個Spring IOC容器中一個bean定義只有一個對象實例。如果不指定bean的scope屬性的話,即默認是這種作用域,即每次從spring中get的都是同一個實例。並且默認的是在IOC啓動的時候對象進行初始化,只有在屬性lazy-init設置爲true的時候,它纔會getBean的時候進行bean的初始化。
9.init-method–初始化方法的設定
如果bean進行實例化的時候我們需要進行一些初始化的方法,那麼我們可以通過init-method這個屬性進行初始化方法的設定,這時,則會在bean實例以後直接調用init-method中指定的方法。
10.destory-method
我們可以在<bean></bean>
標籤中指定destory-moethod屬性來指定bean實例銷燬之前執行的destory方法,進行實例初始化過程中使用的資源。
11.依賴注入總結
方式一:通過setter方法進行注入的方式
(一)在業務層組件中我們可以聲明一個依賴對象的屬性,然後通過在beans.xml中配置來實現依賴對象的注入工作,在beans.xml中我們按照下面的方式來編輯;
<bean id = "依賴對象名稱" class = "依賴對象的實現類"></bean>
<bean id = "應用業務組件名稱" class = "應用業務組件的實現類">
<property name = "應用業務組件類中依賴對象的屬性名稱" ref = "依賴對象所對應的id"><property>
</bean>
(二)採用內部bean的方式,這種情況下注入的bean就不能注入到其他的業務層組件中了,此時beans.xml的寫法如下:
<bean id = "應用業務組件名稱" class = "應用業務組件實現類">
<property name = "應用業務組件中依賴對象的屬性名">
<bean class = "依賴對象的實現類"></bean>
</property>
</bean>
方式二:使用構造器參數的方式注入
就是在應用業務層組件的構造方法中我們將要使用的依賴對象聲明成它的一個屬性,然後以參數的方式傳入到構造方法,此時bean.xml寫法如下:
<bean id = "依賴對象的ID" class = "依賴對象的實現類"></bean>
<bean id = "應用業務層組件ID" class = "應用業務層組件實現類">
<constructor-arq index = "構造器參數索引" type = "依賴對象的實現類" ref = "依賴對象對應的bean的ID"><constructor-arq>
<constructor-arq index = "構造器參數索引" value = "基本類型參數的值"></constructor-arq>
</bean>
12.注入基本類型值得方法
在beans.xml中通過<property></property>
節點的配置類實現,實現方式:/br>
<bean id = "應用業務組件名稱" class = "應用業務組件實現類">
<property name = "應用業務組件中要注入的參數名稱" value = "要注入的參數值"></property>
</bean>
注意:即使往組件中注入其他類型的數據也是可以實現的,並且集合類型的數值也可以注入到組件中,例如set、list等類型的數據。
13.編程式事務管理
Spring提供了兩種方式的編程式事務管理:
(一):使用TransactionTemplate;
(二):直接使用一個PlatformTransactionManager實現;
待續
AOP
- 切面(Aspect);對象操作過程中的截面;
- 連接點(JoinPoint);程序運行過程中的某個階段點,如某個方法調用,或者某個一場被拋出。
- 處理邏輯(Advice);在某個連接點所採用的處理邏輯;
- 切點(PointCut);一系列連接點的集合,它指明處理方式(Adivce)將在何時被觸發。
Spring提供了兩張切面聲明方式,實際工作中我們可以選用其中一種:
- 基於XML配置方式聲明切面;
- 基於註解方式聲明切面;
(一)基於註解方式聲明切面
-首先啓動對@AspectJ註解的支持:在配置文件中使用<aop:aspectj-autoproxy/>
@Aspect
public class LogPrint{
@Prointcut(“execution(.cn.aervice...*(..))”)
private void anyMethod(){}//聲明一個切入點
@Before(”anyMethod()&&arge(userName)”)//定義前置通知
public void doAccessCheck(String userName){
}
@AfterReturning(pointcut = “anyMethod()”,returning = “revalue”)//定義後置通知
public void doReturnCheck(String revalue){
}
@AfterThrowing(pointcut = “anyMethod()”,throwing = “ex”)//定義例外通知
public void doExceptionAction(Exception ex){
}
@After(“anyMethod()”)//定義最終通知
public void doReleaseAction(){
}
@Around(“anyMethod()”)//環繞通知
public Object doBasicProfiling(ProceedingJoinPoint pjp)throws Throwable{
return pjp.proceed();
}
}
(二)基於XML配置方式聲明切面
public class LogPrint{
public void doAccessCheck(){}//定義前置通知
public void doReturnCheck(){}//定義後置通知
public void doExceptionAction(){}//定義例外通知
public void doReleaseAction(){}//定義最終通知
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
return pjp.proceed();//環繞通知
}
}
xml配置文件: