分享一个自己写的最为简单的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. selenium 笔记 2018

    1.指定浏览器驱动:dr = webdriver.Firefox(executable_path = '/Users/xxx/Documents/selenium_py/geckodriver/gec ...

  2. WebFrom基础

    ASP.NET WebForm C/S B/S客人 - 用户 要土豆丝 - 给IIS发送请求 ,IIS就相当于是服务员 通知厨房 - IIS把用户要想看到的ASPX告知.NET框架 厨房炒菜 - .n ...

  3. python调用R语言,关联规则可视化

    首先当然要配置r语言环境变量什么的 D:\R-3.5.1\bin\x64; D:\R-3.5.1\bin\x64\R.dll;D:\R-3.5.1;D:\ProgramData\Anaconda3\L ...

  4. oracle to_date函数和mysql DATE_FORMAT函数用法

    一.在Oracle中,当想把字符串为‘2011-09-20 08:30:45’的格式转化为日期格式,我们可以使用oracle提供的to_date函数. sql语句为: SELECT to_date(' ...

  5. 关于Ceph现状与未来的一些思考

    http://blog.csdn.net/mightysheldor/article/details/51093476 Ceph从2004年提交了第一行代码,至今为止已经10年了.这个起源于Sage博 ...

  6. python新里程

    为什么要学Python: 2018年6月开始自学Python.因为自己目前做Linux运维,感觉自己还需要掌握一门开发语言,在Java.python.php之间毫不犹豫的选择了Python,因为Pyt ...

  7. 2017面向对象程序设计(Java)第十五周学习总结

    上周,老师要求同学们自学应用程序部署,并布置了相关的实验任务.此次实验的目的是掌握Java应用程序的打包操作:了解应用程序存储配置信息的两种方法: 了解Applet小应用程序的开发及应用方法:掌握基于 ...

  8. 高分辨率下firefox字体和界面自动放大的问题

    电脑是高分屏的情况下,如果我们将DPI调成100%,屏幕字体太小,所以我们经常将DPI设置成125%或者其它,这样屏幕看起来会舒服些.但随之而来的是火狐浏览器的字体界面也会放大, 这也会直接导致我们在 ...

  9. TFS自动签出解决方案sln或者项目文件csproj的解决办法

    问题: 最近公司一个项目组的源代码解决方案打开时总是出现解决方案或者部分项目被自动签出的情况,但签入又提示没有变更.事情虽 小,导致几个程序员要用项目文件时总是要找其他人签入.浪费不少时间.出现时间有 ...

  10. 什么是First-class citizen?

    [什么是First-class citizen?] In programming language design, a first-class citizen (also type, object,  ...