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配置 基于注解配置 这个例子是模拟对数据库的更改操作添加事物 其实并没有添加,只是简单的输出了一下记录 首先看下整个例子的目 ...
随机推荐
- 马士兵Spring-hibernate整合
spring整合hibernate: 1.sessionFactory只需要一个就可以了,单例,适合spring管理: 2.HIbernate中的SessionFactory是接口:spring中实现 ...
- 学习笔记之C++入门到精通(名师教学·手把手教会)【职坐标】_腾讯课堂
C++入门到精通(名师教学·手把手教会)[职坐标]_腾讯课堂 https://ke.qq.com/course/101465#term_id=100105503 https://github.com/ ...
- qq浏览器如何全屏截图
对于经常使用qq浏览器的用户可以关注一下~超级使用的功能哦~ http://jingyan.baidu.com/article/a3a3f811f4e0508da2eb8a04.html
- 第2章 Linux操作系统简介
1. Linux操作系统的构成 (1)内核(kernel) ①操作系统的核心,负责管理系统的进程.内存.设备驱动程序.文件和网络系统. ②控制系统和硬件之间的相互通信. ③决定着系统的性能和稳定性. ...
- 第4课 Hello QT
1. QT的安装 (1)双击:qt-opensource-windows-x86-mingw492-5.6.0.exe (2)安装过程中指定QT Creator安装目录下的mingw文件夹 (3)设置 ...
- ORA-00257:archiver error.Connect internal only, until freed的问题(转)
删除归档日志_ORA-00257:archiver error.Connect internal only, until freed的问题 ORA-00257: archiver error. C ...
- CCproxy 设置代理服务器。
CCproxy 设置代理服务器. 通过代理服务器上网,出口IP就固定成代理服务器的IP 设置安装比较简单,直接去ccproxy官网下载就行 如果服务器是公网服务器,记得在设置,高级里面的网络中,把禁止 ...
- Web前端应该从哪些方面来优化网站
作者:斯迪链接:https://www.zhihu.com/question/21658448/answer/18903129来源:知乎著作权归作者所有,转载请联系作者获得授权. 不知道是哪位大牛的文 ...
- leetcode738
public class Solution { public int MonotoneIncreasingDigits(int N) { var num = N.ToString(); var len ...
- Fundamentals of Garbage Collection
[Fundamentals of Garbage Collection] 1.Reclaims objects that are no longer being used, clears their ...