好程序員Java分享Spring框架之AOP的基本配置

  好程序員Java分享Spring框架之AOP的基本配置,前言咱們在前面學習了動態代理機制,Spring的AOP正是應用此機制實現的,下面咱們來學習如何來配置Spring AOP,實現基本的功能。
  什麼是AOP
  AOP(Aspect Oriented Programming)面向切面編程,是OOP(面向對象編程)的重要補充,面向對象是Java編程的基礎,以封裝、繼承、多態創建了對象間的層次關係,關注的是每一個對象的具體實現。面向對象容許咱們開發縱向的關係。
  AOP關注橫向關係,也就是說類和類之間不須要特定的關係,它可以將某些通用的操做(如:日誌處理、安全驗證、事務處理、異常處理、性能統計等)插入到這些無關的類中,從而可讓每一個類只關注本身的核心邏輯,沒必要處理這些通用的操做,這個過程就是橫切,而這些通用的操做就是切面Aspect。
  簡單來講:AOP能把和類的核心業務無關,多個類又共同須要的邏輯代碼封裝起來,當對象須要時自動調用,這樣就減小了類中的重複代碼,下降了類之間的耦合性,提升了程序的維護性。
  AOP術語
  一、橫切關注點
  對哪些方法進行攔截,攔截後怎麼處理,這些關注點稱之爲橫切關注點
  二、切面(aspect)
  類是對物體特徵的抽象,切面就是對橫切關注點的抽象
  三、鏈接點(joinpoint)
  被攔截到的點,由於Spring只支持方法類型的鏈接點,因此在Spring中鏈接點指的就是被攔截到的方法,實際上鍊接點還能夠是字段或者構造器
  四、切入點(pointcut)
  對鏈接點進行攔截的定義
  五、通知(advice)
  所謂通知指的就是指攔截到鏈接點以後要執行的代碼,通知分爲前置、後置、異常、最終、環繞通知五類
  六、目標對象
  代理的目標對象
  七、織入(weave)
  將切面應用到目標對象並致使代理對象建立的過程
  八、引入(introduction)
  在不修改代碼的前提下,引入能夠在運行期爲類動態地添加一些方法或字段
  AOP應用場景
  1)日誌 ,方法執行開始和完成以及出現異常均可以用日誌記錄
  2)緩存 ,第一次調用查詢數據庫,將查詢結果放入內存對象, 第二次調用, 直接從內存對象返回,不須要查詢數據庫
  3)事務 ,調用方法前開啓事務, 調用方法後提交關閉事務
  等等
  AOP的配置
  1)導入Maven依賴
  <dependencies>
  <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
  </dependency>
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>4.3.14.Release</version>
  </dependency>
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>4.3.14.RELEASE</version>
  </dependency>
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-beans</artifactId>
  <version>4.3.14.RELEASE</version>
  </dependency>
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
  <version>4.3.14.RELEASE</version>
  </dependency>
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-expression</artifactId>
  <version>4.3.14.RELEASE</version>
  </dependency>
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>4.3.14.RELEASE</version>
  </dependency>
  <!-- https://mvnrepository.com/art... -->
  <dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjrt</artifactId>
  <version>1.8.13</version>
  </dependency>
  <!-- https://mvnrepository.com/art... -->
  <dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.8.13</version>
  </dependency>
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>4.3.14.RELEASE</version>
  </dependency>
  <dependency>
  <groupId>commons-logging</groupId>
  <artifactId>commons-logging</artifactId>
  <version>1.1.2</version>
  </dependency>
  <dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
  </dependency>
  </dependencies>
  編寫Service接口和實現類,這裏只完成模擬操做
  public interface AdminService {
  void saveAdmin();
  void updateAdmin();
  void deleteAdmin();
  void selectAdmin();
  }
  public class AdminServiceImpl implements AdminService {
  @Override
  public void saveAdmin() {
  System.out.println("Invoke saveAdmin");
  }
  @Override
  public void updateAdmin() {
  System.out.println("Invoke updateAdmin");
  }
  @Override
  public void deleteAdmin() {
  System.out.println("Invoke deleteAdmin");
  }
  @Override
  public void selectAdmin() {
  System.out.println("Invoke selectAdmin");
  }
  }
  3)編寫自定義加強類,該類的方法對應AOP的5種加強通知,分別是:
  1)前置通知before :方法調用前執行
  2)後置通知after-returning:方法調用後執行,出現異常不執行
  3)後置通知after:方法調用後執行,出現異常也執行
  4)異常通知after-throwing:出現異常執行
  5)環繞通知around:方法調用先後執行
  /**
  * 自定義加強類
  */
  public class MyAdvise {
  public void before() throws Throwable {
  System.out.println("這是before");
  }
  public void afterReturning(){
  System.out.println("這是afterReturning");
  }
  public void after(){
  System.out.println("這是after");
  }
  public void afterThrowing() throws Throwable {
  System.out.println("這是afterThrowing");
  }
  public Object around(ProceedingJoinPoint point) throws Throwable {
  System.out.println("這是around -- 前置執行");
  Object obj = point.proceed();
  System.out.println("這是around -- 後置執行");
  return obj;
  }
  }
4)  Spring配置文件
  <?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.or...
  http://www.springframework.or...
  http://www.springframework.or...d">
  <bean id="userService" class="com.qianfeng.springaop.UserServiceImpl"/>
  <bean id="adminService" class="com.qianfeng.springaop.AdminServiceImpl"/>
  <bean id="myAdvise" class="com.qianfeng.springaop.MyAdvise"/>
  <aop:config>
  <!--配置切入點
  execution中第一個表明任意返回值類型,後面是包名,第二個表明類名的開頭,第三個*表明任意方法,(..)表明任意方法參數
  -->
  <aop:pointcut id="c" expression="execution( com.qianfeng.springaop.ServiceImpl.*(..))"/>
  <!--配置方面-->
  <aop:aspect ref="myAdvise">
  <aop:before method="before" pointcut-ref="c"/>
  <aop:after method="after" pointcut-ref="c"/>
  <aop:after-returning method="afterReturning" pointcut-ref="c"/>
  <aop:after-throwing method="afterThrowing" pointcut-ref="c"/>
  <aop:around method="around" pointcut-ref="c"/>
  </aop:aspect>
  </aop:config>
  </beans>
  5)運行測試
  @RunWith(SpringJUnit4ClassRunner.class)
  @ContextConfiguration("classpath:applicationContext-aop.xml")
  public class TestAOP {
  @Test
  public void test(){
  ApplicationContext app = new
  ClassPathXmlApplicationContext("applicationContext-aop.xml");
  AdminService as = (AdminService) app.getBean("adminService");
  as.deleteAdmin();
  }
  }
  能夠看到執行任何Service類的方法,都會調用MyAdvise中的通知方法
  總結
  本章咱們學習了Spring AOP的配置,首先須要添加通知加強類,能夠添加前置、後置或環繞等通知方法來完成某些通用操做,而後再Spring的配置文件中配置切入點,最後是配置切面,將通知類中的方法和切面中的方法進行綁定,最後調用Java對象的方法時,就能看到AOP的效果。程序員

相關文章
相關標籤/搜索