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配置 基于注解配置 这个例子是模拟对数据库的更改操作添加事物 其实并没有添加,只是简单的输出了一下记录 首先看下整个例子的目 ...
随机推荐
- RPM安装卸载软件
1.安装 rpm -i 需要安装的包文件名 举例如下: rpm -i example.rpm 安装 example.rpm 包: rpm -iv example.rpm 安装 example.rpm ...
- pycharm(2016.3.2版本)导入工程文件执行程序时弹出Edit configuration
最近为了能在公司和住所连续写脚本,每写好一部分就压缩打包发送到手机,然后再发送到公司电脑或者自己的笔记本,但是发现重新打开工程文件时有时会弹出Edit configuration配置框,而且每执行一个 ...
- springcloud(五) Hystrix 降级,超时
分布式系统中一定会遇到的一个问题:服务雪崩效应或者叫级联效应什么是服务雪崩效应呢? 在一个高度服务化的系统中,我们实现的一个业务逻辑通常会依赖多个服务,比如:商品详情展示服务会依赖商品服务, 价格服务 ...
- OpenMP 奇偶换排序
▶ 使用 OpenMP 进行奇偶交换排序 ● 代码 #include <stdio.h> #include <stdlib.h> #include <omp.h> ...
- leetcode400
public class Solution { public int FindNthDigit(int n) { //StringBuilder sb = new StringBuilder(); / ...
- leetcode58
public class Solution { public int LengthOfLastWord(string s) { s = s.Trim(); || s.Trim().Length == ...
- Timer控件的使用限制和注意事项
Timer的Interval 属性当编写 Timer 组件时,需要考虑 Interval 属性的几点限制:1. 如果应用程序或另一个应用程序对系统需求很大(如长循环.大量的计算或驱动程序.网络或端口访 ...
- web api的新玩法
前言: 目前大多数的.net core 项目的web api 都是用的json作为数据传输格式,或者说几乎是所有的都是,可是有没有想过换一种数据传输格式怎么处理,比如XML,或者谷歌首推的Protob ...
- org.json库下的json的基本使用
public class Users { private String username; private String password; public String getUsername() { ...
- SIEBEL GET最新时提示表异常
无法GET最新,则将此表GET一次,CHECK OUT下来,再UNDO CHECK IN即可