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配置 基于注解配置 这个例子是模拟对数据库的更改操作添加事物 其实并没有添加,只是简单的输出了一下记录 首先看下整个例子的目 ...
随机推荐
- Bootstrap-Other:Less 教程
ylbtech-Bootstrap-Other:Less 教程 1.返回顶部 1. 2. 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 1. http://www.runoob. ...
- RPM包下载网址
https://pkgs.org/ (最爱) http://rpm.pbone.net/ http://rpmfind.net/linux/RPM/index.html
- JSP Servlet之间交换数据
摘自:<轻量级Java EE企业应用实战>第三版 对于每次客户端请求而言,web服务器大致需要完成以下步骤: 1.启动单独线程 2.使用I/O流读取用户的请求参数 3.从请求数据中解析参数 ...
- 496. Next Greater Element I + 503. Next Greater Element II + 556. Next Greater Element III
▶ 给定一个数组与它的一个子列,对于数组中的一个元素,定义它右边第一个比他大的元素称为他的后继,求所给子列的后继构成的数组 ▶ 第 496 题,规定数组最后一个元素即数组最大元素的后继均为 -1 ● ...
- Redhat 7.2 编译安装PostgreSQL 10
1.环境说明 CentOS7.2 postgresql10.4 2.下载 postgresql的官方地址 https://www.postgresql.org/ftp/source/ 在下载列表中根据 ...
- 迷你MVVM框架 avalonjs 学习教程8、属性操作
属性操作是DOM操作很大的一块,它包括类名操作,表单元素的value属性操作,元素固有属性的管理,元素自定义属性的管理,某些元素的一些布尔属性的操作.大多数情况下,元素属性的值是字符串类型,我们称之为 ...
- Redis Set命令
[Redis Set命令] SET key value [EX seconds] [PX milliseconds] [NX|XX] 将字符串值 value 关联到 key . 如果 key 已经持有 ...
- SpringBoot简单理解
SpringBoot 一.特点:1.默认大于配置,不需要大量配置文件,没有web.xml,拥有可运行的Application类. 2.一般通过java代码配置,而尽量少使用xml配置. 3.maven ...
- placement new
placement new就是把原本new做的两步工作分开来.第一步你自己分配内存,第二步你调用类的构造函数在自己分配的内存上构建新的对象. class Foo { float f; public: ...
- PHP里的进制
1.进制转换函数: <?php function decto_bin($datalist,$bin) { static $arr=array(0,1,2,3,4,5,6,7,8,9,'A','B ...