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();
; 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 简单入门笔记 (转)的更多相关文章
- spring AOP简单入门
AOP(aspect oriented programming)面向切面编程. 大致意思是在方法的执行过程中织入其他要执行的方法. 项目结构图 先介绍一下通过代理的方式实现aop,几个文件和上一篇一样 ...
- Spring AOP初级——入门及简单应用
在上一篇<关于日志打印的几点建议以及非最佳实践>的末尾提到了日志打印更为高级的一种方式——利用Spring AOP.在打印日志时,通常都会在业务逻辑代码中插入日志打印的语句,这实际上是 ...
- [Spring框架]Spring AOP基础入门总结一.
前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...
- [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...
- spring security 简单入门
spring security 简单入门示例 一.概述 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架 . 其中最主要的安全操作有两 ...
- Spring Aop(二)——基于Aspectj注解的Spring Aop简单实现
转发地址:https://www.iteye.com/blog/elim-2394762 2 基于Aspectj注解的Spring Aop简单实现 Spring Aop是基于Aop框架Aspectj实 ...
- Spring Boot 快速入门笔记
Spirng boot笔记 简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...
- Spring.Net 简单入门学习
Spring.NET IoC容器的用法. 通过简单的例子学习Spring.Net 1.先创建一个控制台程序项目. 2.添加IUserInfoDal 接口. namespace Spring.Net { ...
- Spring aop 简单示例
简单的记录一下spring aop的一个示例 基于两种配置方式: 基于xml配置 基于注解配置 这个例子是模拟对数据库的更改操作添加事物 其实并没有添加,只是简单的输出了一下记录 首先看下整个例子的目 ...
随机推荐
- 转转转--Java File和byte数据之间的转换
package cn.iworker.file; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; ...
- Charles使用1
Charles是一款比较常用的全平台的网络封包街区工具,而我们在做移动开发的时候,我们为了调试.测试.分析等目的,经常需要和服务端的网络通讯协议打交道.Charles可以帮我们截取网络数据包来进行分析 ...
- VCS双机原理
VCS双机的配置目录:/etc/VRTSvcs/conf/config/main.cf VCS双机的监控脚本目录:/opt/VRTSvcs/bin/mdcc/ VCS双机日志目录:/var/VRTSv ...
- p3新式类__new__使用和实例化
嗯,new方法返回的是一个全新的对象是真正在内存中分配的内存地址 示例1·class Foo(object): # __metaclass__ = MyType def __init__(self, ...
- solr之高级查询--联表 join查询
例如有两个业务表:文章表,评论表 . 场景: 一个文章可以由多个人评论. 创建两个core,一个core叫article,一个叫comment.article实例的schema.xml文件中定义几个简 ...
- 接口自动化(三)--读取json文件中的数据
上篇讲到实际的请求数据放置在json文件内,这一部分记述一下python读取json文件的实现. 代码如下(代码做了简化,根据需要调优:可做一些容错处理): 1 import json 2 3 cla ...
- 深度解析Java中的那把锁
锁的本质 我们先来讨论锁的出现是为了解决什么问题,锁要保证的事情其实很好理解,同一件事(一个代码块)在同一时刻只能由一个人(线程)操作. 这里所说的锁为排他锁,暂不考虑读写锁的情况 我们在这里打个比方 ...
- [Delphi] 调用ocx
function RegisterDllServer(FileName: string): boolean; var nDllAddr: integer; bstr: string; ProcAddr ...
- Oracle数据库备份与恢复的三种方法
转自blueskys567原文Oracle数据库备份与恢复的三种方法, 2006-10. 有删改 Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP).热备份和冷备份. 导出 ...
- jQuery deferred.resolve() 方法
jQuery deferred.resolve() 方法 deferred.resolve() 函数用于解决Deferred(延迟)对象,并根据给定的args参数调用任何 doneCallbacks ...