Spring的AOP和spring對Jdbc的支援(佟剛)
阿新 • • 發佈:2019-02-15
1.spring的AOP
AOP(Aspect-Oriented Programming, 面向切面程式設計):利用的是動態代理技術.
好處:
每個事物邏輯位於一個位置, 程式碼不分散, 便於維護和升級業務模組更簡潔, 只包含核心業務程式碼.
2.在AOP中經常用的到術語:
切面(Aspect): 橫切關注點(跨越應用程式多個模組的功能)被模組化的特殊物件
通知(Advice): 切面必須要完成的工作
目標(Target): 被通知的物件
代理(Proxy): 向目標物件應用通知之後建立的物件
切入點(PointCut): 切面通知執行的”地點”的定義
連線點(Jointpoint): 與切入點匹配的執行點
AspectJ: Java 社群裡最完整最流行的 AOP 框架.
3.在 Spring 中啟用 AspectJ 註解支援
包:lib/aspectj/aspectjrt.jar 和 aspectjweaver.jar
XML:<aop:aspectj-autoproxy>
java:在類前@Aspect
方法前:
@Before: 前置通知, 在方法執行之前執行
@After : 後置通知, 在方法執行之後執行
@AfterRunning: 返回通知, 在方法返回結果之後執行
將 returning="result" 屬性新增到 @AfterReturning 註解中.在方法中使用 result 就可以直接得到.
@AfterThrowing : 異常通知, 在方法丟擲異常之後
將 throwing 屬性新增到 @AfterThrowing 註解中
@Around : 環繞通知, 圍繞著方法執行
連線點的引數型別必須是 ProceedingJoinPoint
ProceedingJoinPoint 的 proceed() 方法來執行被代理的方法
切入點定義: @Pointcut 一個空的方法前宣告,引用時寫這個方法的方法名加括號.
可以用 && || ! 合併切入點
切入點表示式:execution(* ArithmeticCalculator.add(int, ..)) || execution(* ArithmeticCalculator.mul(int, ..)
在方法中宣告 JoinPoint :
得到方法名joinpoint.getSignature().getName();
輸出引數:Arrays.asList(joinpoint.getArgs())
指定切面的優先順序: @Order(2) 值越小,優先順序越高.
4.引入通知
@DeclareParents
註解型別的 value 屬性表示哪些類是當前引入通知的目標. value 屬性值也可以是一個 AspectJ 型別的表示式, 以將一個即可引入到多個類中. defaultImpl 屬性中指定這個介面使用的實現類
5.使用XML方式進行配置
基於註解的宣告要優先於基於 XML 的宣告.
<aop:config>
橫切性關注點
<aop:pointcut expression="execution(* cn.itcast.spring.aop.xml.*.*(..))" id="pointcut"/>
AOP 的切面資訊都要配置在這個裡面
<aop:aspect ref="LogginAspect">
前置通知
<aop:before method="beforeLog" pointcut-ref="pointcut"/>
後置通知
<aop:after method="afterLog" pointcut-ref="pointcut"/>
返回通知
<aop:after-returning method="afterReturningLog" pointcut-ref="pointcut" returning="result"/>
異常通知
<aop:after-throwing method="afterThrowingLog" pointcut-ref="pointcut" throwing="e"/>
環繞通知
<aop:around method="aroundLog" pointcut="execution(* cn.itcast.spring.aop.xml.ArithmeticCalculatorImpl.mul(..))"/>
</aop:aspect>
</aop:config>
6.spring 對JDBC的支援
JdbcTemplate 類被設計成為執行緒安全的
JdbcTemplate 只有 setter 方法, SimpleJdbcTemplate 只有構造方法.所以要注意注入 dataSource 的方式.
JdbcTemplate 的注入,使用的是 org.springframework.jdbc.core.JdbcTemplate . 並且要使用 setter 方式注入
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
SimpleJdbcTemplate 的注入,使用的 org.springframework.jdbc.core.simple.SimpleJdbcTemplate 類, 並且要使用構造方法注入.
從 JdbcTemplate 演變而來, 它利用 Java 1.5 的特性(自動裝箱, 泛型, 可變長度等)來簡化開發
<bean id="simpleJdbcTemplate"
class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>
AOP(Aspect-Oriented Programming, 面向切面程式設計):利用的是動態代理技術.
好處:
每個事物邏輯位於一個位置, 程式碼不分散, 便於維護和升級業務模組更簡潔, 只包含核心業務程式碼.
2.在AOP中經常用的到術語:
切面(Aspect): 橫切關注點(跨越應用程式多個模組的功能)被模組化的特殊物件
通知(Advice): 切面必須要完成的工作
目標(Target): 被通知的物件
代理(Proxy): 向目標物件應用通知之後建立的物件
切入點(PointCut): 切面通知執行的”地點”的定義
連線點(Jointpoint): 與切入點匹配的執行點
AspectJ: Java 社群裡最完整最流行的 AOP 框架.
3.在 Spring 中啟用 AspectJ 註解支援
包:lib/aspectj/aspectjrt.jar 和 aspectjweaver.jar
XML:<aop:aspectj-autoproxy>
java:在類前@Aspect
方法前:
@Before: 前置通知, 在方法執行之前執行
@After : 後置通知, 在方法執行之後執行
@AfterRunning: 返回通知, 在方法返回結果之後執行
將 returning="result" 屬性新增到 @AfterReturning 註解中.在方法中使用 result 就可以直接得到.
@AfterThrowing : 異常通知, 在方法丟擲異常之後
將 throwing 屬性新增到 @AfterThrowing 註解中
@Around : 環繞通知, 圍繞著方法執行
連線點的引數型別必須是 ProceedingJoinPoint
ProceedingJoinPoint 的 proceed() 方法來執行被代理的方法
切入點定義: @Pointcut 一個空的方法前宣告,引用時寫這個方法的方法名加括號.
可以用 && || ! 合併切入點
切入點表示式:execution(* ArithmeticCalculator.add(int, ..)) || execution(* ArithmeticCalculator.mul(int, ..)
在方法中宣告 JoinPoint :
得到方法名joinpoint.getSignature().getName();
輸出引數:Arrays.asList(joinpoint.getArgs())
指定切面的優先順序: @Order(2) 值越小,優先順序越高.
4.引入通知
@DeclareParents
註解型別的 value 屬性表示哪些類是當前引入通知的目標. value 屬性值也可以是一個 AspectJ 型別的表示式, 以將一個即可引入到多個類中. defaultImpl 屬性中指定這個介面使用的實現類
5.使用XML方式進行配置
基於註解的宣告要優先於基於 XML 的宣告.
<aop:config>
橫切性關注點
<aop:pointcut expression="execution(* cn.itcast.spring.aop.xml.*.*(..))" id="pointcut"/>
AOP 的切面資訊都要配置在這個裡面
<aop:aspect ref="LogginAspect">
前置通知
<aop:before method="beforeLog" pointcut-ref="pointcut"/>
後置通知
<aop:after method="afterLog" pointcut-ref="pointcut"/>
返回通知
<aop:after-returning method="afterReturningLog" pointcut-ref="pointcut" returning="result"/>
異常通知
<aop:after-throwing method="afterThrowingLog" pointcut-ref="pointcut" throwing="e"/>
環繞通知
<aop:around method="aroundLog" pointcut="execution(* cn.itcast.spring.aop.xml.ArithmeticCalculatorImpl.mul(..))"/>
</aop:aspect>
</aop:config>
6.spring 對JDBC的支援
JdbcTemplate 類被設計成為執行緒安全的
JdbcTemplate 只有 setter 方法, SimpleJdbcTemplate 只有構造方法.所以要注意注入 dataSource 的方式.
JdbcTemplate 的注入,使用的是 org.springframework.jdbc.core.JdbcTemplate . 並且要使用 setter 方式注入
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
SimpleJdbcTemplate 的注入,使用的 org.springframework.jdbc.core.simple.SimpleJdbcTemplate 類, 並且要使用構造方法注入.
從 JdbcTemplate 演變而來, 它利用 Java 1.5 的特性(自動裝箱, 泛型, 可變長度等)來簡化開發
<bean id="simpleJdbcTemplate"
class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg ref="dataSource"/>
</bean>