spring_01_核心技術
一、Spring應用環境的配置:
1. 在classpath中添加以下包:
1) SPRING_HOME/dist/spring.jar、
2) SPRING_HOME/lib/jakarta-commons/commons-logging.jar
3) SPRING_HOME/lib/log4j/log4j-1.2.xx.jar
2.在classpath中添加Spring的配置文件:applicationContext.xml
在SPRING_HOME/samples/jpetstore/war/WEB-INF目錄下有樣板文件。
二、IoC容器:
1. IoC概念:反向控制、控制反轉。對象不需要主動去查找依賴類的實例。而是由其它應用給它注入。
DI:依賴注入。
2. Spring對IoC的支持:Spring 提供了BeanFactory和ApplicationContext這兩種IoC容器,來幫助你管理Bean、Bean之間的依賴關係以及Bean的生命週期。
三、Spring中IoC:
1. Bean裝配:在Spring配置文件中用<bean>標記來裝配一個Bean.
<bean id="Bean在Spring容器中的唯一標識" class="Bean類的全限定名">...</bean>
2. 用setter方法注入它的依賴類:
1) 在Bean中針對依賴類屬性添加一個setter方法。
2) 在Bean的配置中通過<bean>標記的子標記<property>來注入這個屬性。注入的可以是值,也可是容器中另一個Bean的引用。
<bean id="..." class="...">
<property name="屬性名" value="值" />
<property name="屬性名" ref="另一個bean的標識" />
</bean>
3. 用構造器注入它的依賴類:
4. 自動裝配:<bean>標記有一個autowire屬性來指定自動裝配的方式。建議少用。
1) byName 2) byType 3) coustructor 4) autodetect
5. 指定bean的生存範圍:<bean>標記有一個scope屬性來指定:
1) sigleton:一個Spring容器一個實例(默認值)
2) prototype:使用一次就創建一個實例
3) request、session、global-session :在Web ApplicationContext中才有效。
6. 指定Bean的初始化和銷燬: 使用<bean>標記的以下兩個屬性:
1) init-method
2) destroy-method
7. 裝配Bean的繼承:使用<bean>標記的parent屬性來指定它的父類Bean的標識。
默認情況下,父類Bean的屬性會使用父類Bean的裝配。子類的屬性使用子類的。可以在子類中對父類的屬性進行重新裝配。
四、AOP:面向切面編程
1.AOP:把交叉功能模塊化,把應用服務和業務邏輯完全分離。
2.術語:
切面(Aspect):就是指你要實現的交叉功能。如:日誌記錄、事務管理、安全驗證()。
連接點(Joinpoint):應用程序執行過程中可以插入切面的地點。如某方法調用時或者處理異常時。Spring只支持方法連接點
通知(Advice):在特定的連接點,AOP框架要執行的動作。 切面的功能被叫做通知。
通知有各種類型,其中包括“around”、“before”和“after”等。
如:向日志文件寫日誌、開啓事務、提交事務。
切入點(Pointcut):定義了需要注入advice的位置。通常使用一些表達式來匹配連接點。
目標對象(Target Object):被一個或者多個切面所通知的對象。
代理對象(Proxy): 向目標對象應用通知之後被創建的對象。
織入(Weaving):把切面應用到目標對象來創建新的代理對象的過程。
Spring的切面是在程序運行的某個時刻被織入的。
3.要使用Spring的完整AOP功能,需要添加:cglib包,AspectJ的包(2個)。
4. 配置文件方式實現AOP
1) 定義一個切面類。這個類中定義各個通知方法。聲明到Spring的配置文件中:
<bean id="logAspectBean" class="com.qiujy.aspect.LogAspect"/>
<aop:config>
<!-- 配置一個切面 -->
<aop:aspect id="logAspect" ref="logAspectBean">
...
</aop:aspect>
</aop:config>
2) 定義切入點:通過一個AspectJ的切入點表達式來定義選擇哪些類的哪些方法需要切入通知。
<bean id="logAspectBean" class="com.qiujy.aspect.LogAspect"/>
<aop:config>
<!-- 配置一個切面 -->
<aop:aspect id="logAspect" ref="logAspectBean">
<!-- 定義切入點 -->
<aop:pointcut id="allMethod"
expression="execution(* com.qiujy.service.*.add*(..))"/>
...
</aop:aspect>
</aop:config>
3) 聲明通知:
<bean id="logAspectBean" class="com.qiujy.aspect.LogAspect"/>
<aop:config>
<!-- 配置一個切面 -->
<aop:aspect id="logAspect" ref="logAspectBean">
<!-- 定義切入點 -->
<aop:pointcut id="allMethod"
expression="execution(* com.qiujy.service.*.add*(..))"/>
<!-- 配置通知 -->
<aop:before method="start" pointcut-ref="allMethod" />
<aop:after-returning method="end" pointcut-ref="allMethod"/>
<aop:after method="back" pointcut-ref="allMethod"/>
<aop:after-throwing method="exception" pointcut-ref="allMethod"/>
</aop:aspect>
</aop:config>
5. Annotation方式實現AOP
1) 配置Spring對AspectJ註解的支持:<aop:aspectj-autoproxy/>
2) 使用註解定義切面、切入點、通知:
@Aspect //聲明一個切面類
public class LogAspect {
private Log log = LogFactory.getLog(this.getClass());
//定義了一個切入點(使用表達式來選擇連接點)
@Pointcut("execution(* com.qiujy.service.*.add*(..))")
private void bbb(){}
//聲明前置通知
@Before("execution(* com.qiujy.service.*.add*(..))")
public void start(JoinPoint call) {
String className = call.getTarget().getClass().getName();
String methodName = call.getSignature().getName();
log.info(className + "類的" + methodName + "方法開始了");
}
//聲明返回後通知
@AfterReturning("bbb()")
public void end() {
log.info("方法正常結束了");
}
//聲明方法退出後通知
@After("bbb()")
public void back(){
log.info("方法返回了");
}
//聲明異常拋出後通知
@AfterThrowing("bbb()")
public void exception() {
log.info("方法執行出異常了");
}
}
1. 在classpath中添加以下包:
1) SPRING_HOME/dist/spring.jar、
2) SPRING_HOME/lib/jakarta-commons/commons-logging.jar
3) SPRING_HOME/lib/log4j/log4j-1.2.xx.jar
2.在classpath中添加Spring的配置文件:applicationContext.xml
在SPRING_HOME/samples/jpetstore/war/WEB-INF目錄下有樣板文件。
二、IoC容器:
1. IoC概念:反向控制、控制反轉。對象不需要主動去查找依賴類的實例。而是由其它應用給它注入。
DI:依賴注入。
2. Spring對IoC的支持:Spring 提供了BeanFactory和ApplicationContext這兩種IoC容器,來幫助你管理Bean、Bean之間的依賴關係以及Bean的生命週期。
三、Spring中IoC:
1. Bean裝配:在Spring配置文件中用<bean>標記來裝配一個Bean.
<bean id="Bean在Spring容器中的唯一標識" class="Bean類的全限定名">...</bean>
2. 用setter方法注入它的依賴類:
1) 在Bean中針對依賴類屬性添加一個setter方法。
2) 在Bean的配置中通過<bean>標記的子標記<property>來注入這個屬性。注入的可以是值,也可是容器中另一個Bean的引用。
<bean id="..." class="...">
<property name="屬性名" value="值" />
<property name="屬性名" ref="另一個bean的標識" />
</bean>
3. 用構造器注入它的依賴類:
4. 自動裝配:<bean>標記有一個autowire屬性來指定自動裝配的方式。建議少用。
1) byName 2) byType 3) coustructor 4) autodetect
5. 指定bean的生存範圍:<bean>標記有一個scope屬性來指定:
1) sigleton:一個Spring容器一個實例(默認值)
2) prototype:使用一次就創建一個實例
3) request、session、global-session :在Web ApplicationContext中才有效。
6. 指定Bean的初始化和銷燬: 使用<bean>標記的以下兩個屬性:
1) init-method
2) destroy-method
7. 裝配Bean的繼承:使用<bean>標記的parent屬性來指定它的父類Bean的標識。
默認情況下,父類Bean的屬性會使用父類Bean的裝配。子類的屬性使用子類的。可以在子類中對父類的屬性進行重新裝配。
四、AOP:面向切面編程
1.AOP:把交叉功能模塊化,把應用服務和業務邏輯完全分離。
2.術語:
切面(Aspect):就是指你要實現的交叉功能。如:日誌記錄、事務管理、安全驗證()。
連接點(Joinpoint):應用程序執行過程中可以插入切面的地點。如某方法調用時或者處理異常時。Spring只支持方法連接點
通知(Advice):在特定的連接點,AOP框架要執行的動作。 切面的功能被叫做通知。
通知有各種類型,其中包括“around”、“before”和“after”等。
如:向日志文件寫日誌、開啓事務、提交事務。
切入點(Pointcut):定義了需要注入advice的位置。通常使用一些表達式來匹配連接點。
目標對象(Target Object):被一個或者多個切面所通知的對象。
代理對象(Proxy): 向目標對象應用通知之後被創建的對象。
織入(Weaving):把切面應用到目標對象來創建新的代理對象的過程。
Spring的切面是在程序運行的某個時刻被織入的。
3.要使用Spring的完整AOP功能,需要添加:cglib包,AspectJ的包(2個)。
4. 配置文件方式實現AOP
1) 定義一個切面類。這個類中定義各個通知方法。聲明到Spring的配置文件中:
<bean id="logAspectBean" class="com.qiujy.aspect.LogAspect"/>
<aop:config>
<!-- 配置一個切面 -->
<aop:aspect id="logAspect" ref="logAspectBean">
...
</aop:aspect>
</aop:config>
2) 定義切入點:通過一個AspectJ的切入點表達式來定義選擇哪些類的哪些方法需要切入通知。
<bean id="logAspectBean" class="com.qiujy.aspect.LogAspect"/>
<aop:config>
<!-- 配置一個切面 -->
<aop:aspect id="logAspect" ref="logAspectBean">
<!-- 定義切入點 -->
<aop:pointcut id="allMethod"
expression="execution(* com.qiujy.service.*.add*(..))"/>
...
</aop:aspect>
</aop:config>
3) 聲明通知:
<bean id="logAspectBean" class="com.qiujy.aspect.LogAspect"/>
<aop:config>
<!-- 配置一個切面 -->
<aop:aspect id="logAspect" ref="logAspectBean">
<!-- 定義切入點 -->
<aop:pointcut id="allMethod"
expression="execution(* com.qiujy.service.*.add*(..))"/>
<!-- 配置通知 -->
<aop:before method="start" pointcut-ref="allMethod" />
<aop:after-returning method="end" pointcut-ref="allMethod"/>
<aop:after method="back" pointcut-ref="allMethod"/>
<aop:after-throwing method="exception" pointcut-ref="allMethod"/>
</aop:aspect>
</aop:config>
5. Annotation方式實現AOP
1) 配置Spring對AspectJ註解的支持:<aop:aspectj-autoproxy/>
2) 使用註解定義切面、切入點、通知:
@Aspect //聲明一個切面類
public class LogAspect {
private Log log = LogFactory.getLog(this.getClass());
//定義了一個切入點(使用表達式來選擇連接點)
@Pointcut("execution(* com.qiujy.service.*.add*(..))")
private void bbb(){}
//聲明前置通知
@Before("execution(* com.qiujy.service.*.add*(..))")
public void start(JoinPoint call) {
String className = call.getTarget().getClass().getName();
String methodName = call.getSignature().getName();
log.info(className + "類的" + methodName + "方法開始了");
}
//聲明返回後通知
@AfterReturning("bbb()")
public void end() {
log.info("方法正常結束了");
}
//聲明方法退出後通知
@After("bbb()")
public void back(){
log.info("方法返回了");
}
//聲明異常拋出後通知
@AfterThrowing("bbb()")
public void exception() {
log.info("方法執行出異常了");
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.