一:使用注釋配置AOP:

@Aspect:是SpringAOP切面的標識。
@Component:將此類交由Spring管理。
@Before("execution(* spring.aop.*.*(..))"):第一個*匹配所有修飾符類型(public,default)的方法,后見接該方法所在的包名,第二個*匹配該包下的所有類(可指定特定方法,如上圖所示),最后一個*匹配該類下的所有方法名,(..)匹配所有參數(shù)類型的方法,包括無參方法與有參方法。
被@Before標識的方法會在指定的方法執(zhí)行前執(zhí)行。
@After("execution(* spring.aop.*.*(..))"):在指定的方法執(zhí)行后執(zhí)行。
@After-throwing("execution(* spring.aop.*.*(..))"):在指定方法跑出異常時執(zhí)行,可用于事務的回滾。
@After-returning("execution(* spring.aop.*.*(..))"):在指定的方法執(zhí)行完成后執(zhí)行,與@After的區(qū)別在與,@After是在方法開始執(zhí)行后就會開始執(zhí)行,而@After-returning是在方法執(zhí)行完成后才會執(zhí)行。
在事務的回滾時,應該用@After-returning而非@After與@After-throwing配合使用。
Spring配置類:

@Configuration:將此類交由Spring管理。
@EnableAspectJAutoProxy:開啟代理模式。
@ComponentScan("...."):交由Spring管理的類的范圍,即其所在的包。

用于依賴反轉(zhuǎn)提供Bean的類。

該示例用于測試的類。
二:使用xml配置Spring
1.ApplicationContext.xml的配置:

使用Spring代理Hibernate功能時需要使用到連接池,而在使用dbcp或者c3p0連接池時,是通過創(chuàng)建先創(chuàng)建DataSource再獲取Connection,因此,需要在此配置該項并交由Spring自動創(chuàng)建。

該配置由Spring代理執(zhí)行了Hibernate的功能,在配置sessionFactory的時候,hibernate.current_session_context_class的值需設置為org.springframework.orm.hibernate5.SpringSessionContext亦或者刪除該項。之前配置Hibernate時該屬性的值為thread,此處若將屬性值設置為thread則會出現(xiàn)異常。mappingResources下的list中的值是數(shù)據(jù)庫Bean對象所在的位置/文件名。
需要注意的是:在此處的dataSource和sessionFactory的名稱不可更改,其大小寫也是按照java命名規(guī)范,其名稱與ClassPathXmlApplicationContext類中的相應屬性一致。

DAO層需要使用連接以進行與數(shù)據(jù)庫的通信,需要用到sessionFactory來獲取連接,此處的name的屬性值皆為前面配置的sessionFactory。該層中獲取連接的方式都是getCurrentSession(),該方法底層使用的是ThreadLocal,以確保每個線程獲取的都是不同的session,即不同的連接,可確保事務的正確執(zhí)行與緩存的安全,也可防止臟讀。

name的值是在該類中的私有屬性的名稱,Spring用IoC對其進行注入。service層在使用過程中需要用到DAO層對象,此處的name屬性的值皆為其對應的DAO層對象。

開啟事務需要用到session(非servlet中的session,其底層是Connection),而使用連接池產(chǎn)生連接Connection是利用工廠模式sessionFactory創(chuàng)建的,因此開啟事務需要用到sessionFactory,ref指向前面配置好的sessionFactory,class中的值是orm包中的一個類(包名.類名)。
<aop:config>:配置事務的切入點。
<tx:advice>:用于配置事務作用的具體方法。在上圖中,名稱以get開始的方法會被事務控制。第二行表示:除去以get開頭的方法外,其他所有方法都會被事務控制。
<aop:advisor>:至少需要配置一個<tx:advice>,否則會出現(xiàn)異常。poingtcut-ref指向前面配制好的切入點,execution(* service.*.*(..))與之前用注解配置的含義一樣。

其中的類和利用注解時沒有什么區(qū)別,去掉采用注解時的那些注解即可。
與之不同的只有測試類的幾行代碼:

此處用到的時ClassPathXmlApplicationContext,而使用注解時使用的是AnnotationConfigApplicationContext。service層中用到了代理,getBean()方法中若傳入的參數(shù)是****Service.class則會出現(xiàn)類型轉(zhuǎn)換異常,因為被代理的類會變?yōu)镻roxy對象,同時仍然繼承原父類、實現(xiàn)了原接口,因此,此處可使用其接口來獲取到其實現(xiàn)類。也可使用xml配置中對應的id名來獲取,即cxac.getBean("PermissionService")來獲取該對象。