fun

           

          Spring AOP 簡單入門筆記

          分享一個自己寫的最為簡單的Spring AOP的應用,其實,本人也是學習Spring不久,只是把一些個人的理解分享下,供參考。可能很多人剛開始不太理解到底啥是AOP,其實它也是相對OOP來說的,類似OOP其實也是一種編程思想吧。本人暫且把Spring 中的AOP理解成一種方法的攔截器(可能有所片面,主要是方便理解)。

          個人通俗理解,就好比你去自動取款機取錢,邊上裝了個攝像頭在監視著。你取你的錢,不用管那攝像頭干嘛,只是對于攝像頭來說,已經把你取錢的這一過程記錄了下來。你取錢的這一過程我們可以從OOP角度分析,而對于攝像頭來說,就是從AOP角度去分析了。反映到我下面要講的示例就是系統日志的記錄。

           

          我要講的示例大致是這樣的,從OOP角度分析,就是說現在有一個User對象,然后你要調用業務邏輯實現去保存(或者其他行為)這個User對象,或者說是做持久化操作,把User對象相關信息寫進數據庫。那么從AOP角度來看,就是在你進行保存對象這一行為發生的時候進行日志記錄。就是說,你在進行業務操作的時候,不需要去關心系統背后到底做了啥,Spring AOP它已經幫你搞定了。

          以下是代碼具體實現:(采用Spring2.5,Myeclipse6.5)

          (一)、從AOP角度分析:   
            
          package org.wiki.spring.aspect;   
            
          import org.aspectj.lang.JoinPoint;   
            
          /**  
           * 定義切面類,將系統中的橫切性關注點模塊化  
           *   
           * 
          @author http://www.bt285.cn BT下載
              
          http://www.5a520.cn 小說520網 
           *   
           
          */
            
          public class Aspect {   
            
              
          /**  
               * 定義advice,即切面類中方法具體實現, 這里主要是用于記錄日志,只做簡單處理。  
               *   
               * 
          @param joinPoint,可以取得被攔截方法的一些信息  
               
          */
            
              
          public void logging(JoinPoint joinPoint) {   
                  
          //得到被攔截方法參數,并打印   
                  Object[] args = joinPoint.getArgs();   
                  
          for (int i = 0; i < args.length; i++{   
                      System.out.println(
          "method arg" + i + " -- " + args[i]);   
                  }
             
                     
                  
          //得到被攔截方法簽名   
                  System.out.println(joinPoint.getSignature().getName());   
                     
                  
          //記錄系統日志具體實現   
                  System.out.println("----logging-----");   
              }
             
          }
             
            
          (二)從DAO,數據持久化角度分析:   
          package org.wiki.spring.dao;     
            
          import org.wiki.spring.domain.User;   
            
          /**  
           * 定義IUserDAO接口,目的是為了靈活實現UserDAO不同的操作。  
          @author http://www.bt285.cn BT下載
              
          http://www.5a520.cn 小說520網 
           *  
           
          */
            
          public interface IUserDAO {   
                 
              
          public void addUser(User user);   
                 
              
          public void deleteUser(int id);   
                 
              
          public void updateUser(int id);   
          }
             
            
            
          //==================================================   
            
          package org.wiki.spring.dao;     
            
          import org.wiki.spring.domain.User;   
            
          /**  
           * IUserDAO接口的具體實現,這里只做簡單處理  
           * 
          @author Wiki.M  
           *  
           
          */
            
          public class UserDAOImpl implements IUserDAO {   
            
              @Override  
              
          public void addUser(User user) {   
                  System.out.println(
          "----addUser----");   
            
              }
             
            
              @Override  
              
          public void deleteUser(int id) {   
                  System.out.println(
          "----deleteUser----");   
            
              }
             
            
              @Override  
              
          public void updateUser(int id) {   
                  System.out.println(
          "----updateUser----");   
            
              }
             
          }
             
            
          (三)域模型分析   
          package org.wiki.spring.domain;     
            
          /**  
           * 領域模型User  
           * 
          @author Wiki.M  
           *  
           
          */
            
          public class User {   
                 
              
          private int id;   
                 
              
          private String name;   
                 
              
          private String password;   
                 
              
          public int getId() {   
                  
          return id;   
              }
             
            
              
          public void setId(int id) {   
                  
          this.id = id;   
              }
             
            
              
          public String getName() {   
                  
          return name;   
              }
             
                 
              
          public void setName(String name) {   
                  
          this.name = name;   
              }
             
                 
              
          public String getPassword() {   
                  
          return password;   
              }
             
                 
              
          public void setPassword(String password) {   
                  
          this.password = password;   
              }
             
            
          }
             
            
          (四)、從業務層分析:   
          package org.wiki.spring.service;     
            
          import org.wiki.spring.domain.User;   
            
          /**  
           * 定義User業務邏輯相關的一個接口,  
           * 目的是為了在客戶端自由調用接口實現  
           * 
          @author Wiki.M  
           *  
           
          */
            
          public interface IUserService {   
                 
             
          public void saveUser(User user);   
                
             
          public void deleteUser(int id);   
                
             
          public void updateUser(int id);    
          }
             
            
          //=========================================   
            
           
          package org.wiki.spring.service;     
            
          import org.wiki.spring.dao.IUserDAO;   
          import org.wiki.spring.domain.User;   
            
          /**  
           * 業務邏輯接口IUserService的具體實現  
          @author http://www.guihua.org 中國桂花樹
              
          http://www.5a520.cn 小說520網  
           *  
           
          */
            
          public class UserServiceImpl implements IUserService {   
            
              
          private IUserDAO userDAO;   
                 
              
          public void setUserDAO(IUserDAO userDAO) {   
                  
          this.userDAO = userDAO;   
              }
             
                 
              @Override  
              
          public void deleteUser(int id) {   
                  userDAO.deleteUser(id);   
              }
             
            
              @Override  
              
          public void saveUser(User user) {   
                  userDAO.addUser(user);   
            
              }
             
            
              @Override  
              
          public void updateUser(int id) {   
                  userDAO.updateUser(id);   
              }
             
            
          }
             
            
          (五)從客戶端調用分析:   
          package org.wiki.spring.client;     
            
          import org.springframework.beans.factory.BeanFactory;   
          import org.springframework.context.support.ClassPathXmlApplicationContext;   
          import org.wiki.spring.domain.User;   
          import org.wiki.spring.service.IUserService;   
            
          public class Client {   
                 
              
          /**  
               * 客戶端調用,用于測試  
               * 
          @param args  
               
          */
            
              
          public static void main(String[] args){   
                     
                  BeanFactory factory 
          = new ClassPathXmlApplicationContext("*.xml");   
                     
                  
          //得到UserService具體實現,用于操作業務邏輯   
                  IUserService userService = (IUserService)factory.getBean("userServiceImpl");   
                     
                  User user 
          = new User();   
                  user.setId(
          1);   
                  user.setName(
          "Wiki");   
                  user.setPassword(
          "123");   
                     
                  
          //測試1,記錄日志   
                  userService.saveUser(user);   
                     
                  
          //測試2,記錄日志   
                  userService.deleteUser(1);   
              }
             
          }
            

           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"  
              xmlns:tx
          ="http://www.springframework.org/schema/tx"  
              xsi:schemaLocation
          ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd   
                     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd   
                     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
          >  
                 
              
          <!-- 配置UserDAOImpl -->  
              
          <bean id="userDAO" class="org.wiki.spring.dao.UserDAOImpl"/>  
                 
              
          <!-- 配置UserServiceImpl -->  
              
          <bean id="userServiceImpl"  
                  class
          ="org.wiki.spring.service.UserServiceImpl">  
                  
          <!-- 注入userDAO,實際為UserDAOImpl,即對數據持久化的具體實現 -->  
                  
          <property name="userDAO" ref="userDAO" />  
              
          </bean>  
                 
              
          <!-- 配置aspect切面類 -->  
              
          <bean id="userAspect" class="org.wiki.spring.aspect.Aspect" />  
            
              
          <!-- 配置AOP -->  
              
          <aop:config>  
                  
          <!-- 配置aspect切面類 -->  
                  
          <aop:aspect ref="userAspect">  
                      
          <!-- 配置pointcut,即切入點,對哪些類的哪些方法起到AOP的作用 -->  
                      
          <aop:pointcut id="userServiceMethods"  
                          expression
          ="execution(* org.wiki.spring.service.UserServiceImpl.*(..))" />      
                      
          <!-- 配置advice,即Aspect類中的logging()方法,這里采用在業務方法執行前進行攔截 -->  
                      
          <aop:before method="logging" pointcut-ref="userServiceMethods" />  
                  
          </aop:aspect>  
                     
              
          </aop:config>  
          </beans>  

          posted on 2009-04-23 18:30 fun 閱讀(1527) 評論(0)  編輯  收藏

          導航

          統計

          常用鏈接

          留言簿(11)

          隨筆檔案

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 曲阳县| 八宿县| 太和县| 晋宁县| 晋州市| 海城市| 老河口市| 武平县| 望城县| 黄龙县| 天峻县| 和林格尔县| 临猗县| 安远县| 永修县| 霍山县| 吕梁市| 彩票| 红桥区| 张家川| 丹凤县| 达孜县| 大厂| 崇信县| 昭平县| 民县| 张北县| 景洪市| 西峡县| 鸡泽县| 衡南县| 吴桥县| 双桥区| 灯塔市| 遂宁市| 于田县| 营口市| 大洼县| 万安县| 广德县| 铜陵市|