分享一个自己写的最为简单的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();   
        ; 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();   
        user.setName("Wiki");   
        user.setPassword(");   
           
        //测试1,记录日志   
        userService.saveUser(user);   
           
        //测试2,记录日志   
);   
    }   
}  

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>

转自:http://www.blogjava.net/wangfun/archive/2009/04/23/267211.html

Spring AOP 简单入门笔记 (转)的更多相关文章

  1. spring AOP简单入门

    AOP(aspect oriented programming)面向切面编程. 大致意思是在方法的执行过程中织入其他要执行的方法. 项目结构图 先介绍一下通过代理的方式实现aop,几个文件和上一篇一样 ...

  2. Spring AOP初级——入门及简单应用

      在上一篇<关于日志打印的几点建议以及非最佳实践>的末尾提到了日志打印更为高级的一种方式——利用Spring AOP.在打印日志时,通常都会在业务逻辑代码中插入日志打印的语句,这实际上是 ...

  3. [Spring框架]Spring AOP基础入门总结一.

    前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...

  4. [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

    前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...

  5. spring security 简单入门

    spring security 简单入门示例 一.概述 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架 . 其中最主要的安全操作有两 ...

  6. Spring Aop(二)——基于Aspectj注解的Spring Aop简单实现

    转发地址:https://www.iteye.com/blog/elim-2394762 2 基于Aspectj注解的Spring Aop简单实现 Spring Aop是基于Aop框架Aspectj实 ...

  7. Spring Boot 快速入门笔记

    Spirng boot笔记 简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...

  8. Spring.Net 简单入门学习

    Spring.NET IoC容器的用法. 通过简单的例子学习Spring.Net 1.先创建一个控制台程序项目. 2.添加IUserInfoDal 接口. namespace Spring.Net { ...

  9. Spring aop 简单示例

    简单的记录一下spring aop的一个示例 基于两种配置方式: 基于xml配置 基于注解配置 这个例子是模拟对数据库的更改操作添加事物 其实并没有添加,只是简单的输出了一下记录 首先看下整个例子的目 ...

随机推荐

  1. Gson的几种使用方式

    一.Gson是一个Java类库,用于将Java对象转换为它们所代表的JSON数据,也可以用于将一个JSON字符串转换为对应的Java对象.这个是谷歌开发的一套针对json处理的一个类库,功能很强大. ...

  2. ptthon 网络编程

    网络编程 网络目的 : 数据的传输 网络数据传输是一个复杂的过程 ISO :国际标准化组织 OSI 七层模型 --> 网络通信标准化流程 应用层 : 提供用户服务,具体内容由特定程序规定 表示层 ...

  3. sql server 全文检索 使用

    目前项目中的日志查询 功能 由于长年累月的写入,目前已经达到千万级,对日志进行like 查询,速度可想而知. 此处只讨论 在数据库的优化. 当时 想到两个方案,一个是分区,一个 是全文检索. 分区的话 ...

  4. canvas绘制曲线

    canvas绘制曲线 方法 quadraticCurveTo(cp1x, cp1y, x, y) 只有一个控制点的贝塞尔曲线(其实就是控制点分别与起始点和结束点连线的公切线) bezierCurveT ...

  5. apache 搭建PHP多站点

    修改apache 配置文件:httpd.conf 1.默认 Listen 80端口 2.添加配置如下: <VirtualHost *:80> ServerAdmin admin@yii.c ...

  6. 如何使用C#程序给PDF文件添加编辑域

    PDF文档通常是不能编辑的,但有些时候需要在PDF文档中填写日期或签名之类,就需要在PDF有能编辑的文本域,本文介绍怎样用C#来实现这一功能. 环境 工具:VS2015 语言:C# 操作PDF类库:i ...

  7. C++ 20170807

    mesos/3rdparty/stout/include/stout/err.hpp=======================================================str ...

  8. 带入gRPC:gRPC Streaming, Client and Server

    带入gRPC:gRPC Streaming, Client and Server 原文地址:带入gRPC:gRPC Streaming, Client and Server 前言 本章节将介绍 gRP ...

  9. binary tree

    一.中序线索化 二叉树节点定义: class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; int isle ...

  10. NGUI中显示DrawCall详细信息

    [NGUI显示DrawCall详细信息] UIDrawCall中有个宏,SHOW_HIDDEN_OBJECTS,默认为关闭状态.将此宏打开,NGUI即会将DrawCall对象显示在Hierarchy中 ...