第一次寫博客。本人是個菜鳥。有什麼不對的地方請指正。發這個博客只是為了整理自己的學習歷程。以及一些想法。
下面開始正文:(這些東西摘自很多人的博客,最後自己總結的,有什麼不對的地方請指教。)
oop是一個由上至下的豎向編程,aop是橫向的切入。
OOP允許你定義從上到下的關系,但並不適合定義從左到右的關系。例如日志功能。日志代碼水平地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關系,導致了大量代碼的重復。
aop剖解開封裝的對象內部,並將那些影響了多個類的公共行為封裝到一個可重用模塊,並將其名為“Aspect”,也就是‘方面’。他可以降低模塊間的耦合度,並有利於未來的功能的修改和維護。
總而言之:就是提取公共代碼(日志,權限),放到一塊,方便快捷。
實現AOP的技術,主要分為兩大類:一是采用動態代理技術jdk 或是 cglib,二是采用靜態織入的方式,使編譯器可以在編譯期間織入有關“方面”的代碼。我一般在項目在裡面用的就是動態代理。
配置文件 形式的aop 可用於日志,事務的控制
<!-- 系統服務組件的切面Bean -->
<bean id="serviceAspect" class="cn.ysh.studio.spring.aop.aspect.ServiceAspect"/>
<!-- AOP配置 -->
<aop:config>
<!-- 聲明一個切面,並注入切面Bean,相當於@Aspect -->
<aop:aspect id="simpleAspect" ref="serviceAspect">
<!-- 配置一個切入點,相當於@Pointcut -->
<aop:pointcut expression="execution(* cn.ysh.studio.spring.aop.service..*(..))" id="simplePointcut"/>
<!-- 配置通知,相當於@Before、@After、@AfterReturn、@Around、@AfterThrowing -->
<aop:before pointcut-ref="simplePointcut" method="before"/>
<aop:after pointcut-ref="simplePointcut" method="after"/>
<aop:after-returning pointcut-ref="simplePointcut" method="afterReturn"/>
<aop:after-throwing pointcut-ref="simplePointcut" method="afterThrow" throwing="ex"/>
</aop:aspect>
</aop:config>
基於注解 的aop
在配置文件中 聲明激活自動掃描組件功能,同時激活自動代理功能
<!-- 激活組件掃描功能,在包cn.ysh.studio.spring.aop及其子包下面自動掃描通過注解配置的組件 -->
<context:component-scan base-package="cn.ysh.studio.spring.aop"/>
<!-- 激活自動代理功能 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
//聲明這是一個組件
@Component
//聲明這是一個切面Bean
@Aspect
//配置切入點,該方法無方法體,主要為方便同類中其他方法使用此處配置的切入點
@Pointcut("execution(* cn.ysh.studio.spring.aop.service..*(..))")
public void aspect(){ }
/*
* 配置前置通知,使用在方法aspect()上注冊的切入點
* 同時接受JoinPoint切入點對象,可以沒有該參數
*/
@Before("aspect()")
//配置後置通知,使用在方法aspect()上注冊的切入點
@After("aspect()")
//配置環繞通知,使用在方法aspect()上注冊的切入點
@Around("aspect()")
//配置後置返回通知,使用在方法aspect()上注冊的切入點
@AfterReturning("aspect()")
//配置拋出異常後通知,使用在方法aspect()上注冊的切入點
@AfterThrowing(pointcut="aspect()", throwing="ex")