- 浏览: 124404 次
- 性别:
- 来自: 嘉兴
文章分类
最新评论
-
eternalxiaohui:
学习了,看看如何实现的
发布一个JS抽奖小程序 -
sunlightcs:
这样写不行吧。
关于SQL查询不重复的记录集 -
wikimo:
示例代码见:http://wikimo.iteye.com/b ...
基于DWR、Hibernate、Spring实现的分页(一) -
stuhack0303:
最好把代码分享下吧,谢谢。
基于DWR、Hibernate、Spring实现的分页(一) -
lord_is_layuping:
呵呵呵呵
基于JXL的Excel数据导入工具
严重提示:仅供参考
分享一个自己写的最为简单的Spring AOP的应用,其实,本人也是学习Spring不久,只是把一些个人的理解分享下,供参考。可能很多人刚开始不太理解到底啥是AOP,其实它也是相对OOP来说的,类似OOP其实也是一种编程思想吧。本人暂且把Spring 中的AOP理解成一种方法的拦截器(可能有所片面,主要是方便理解)。
个人通俗理解,就好比你去自动取款机取钱,边上装了个摄像头在监视着。你取你的钱,不用管那摄像头干嘛,只是对于摄像头来说,已经把你取钱的这一过程记录了下来。你取钱的这一过程我们可以从OOP角度分析,而对于摄像头来说,就是从AOP角度去分析了。反映到我下面要讲的示例就是系统日志的记录。
我要讲的示例大致是这样的,从OOP角度分析,就是说现在有一个User对象,然后你要调用业务逻辑实现去保存(或者其他行为)这个User对象,或者说是做持久化操作,把User对象相关信息写进数据库。那么从AOP角度来看,就是在你进行保存对象这一行为发生的时候进行日志记录。就是说,你在进行业务操作的时候,不需要去关心系统背后到底做了啥,Spring AOP它已经帮你搞定了。
(图一、个人对于OOP与AOP在本人示例中的理解)
上图说表示的东西是个人的理解理解,纵向为主业务逻辑这里表现为对User对象的持久化操作,横向为AOP实现,这里表现为系统日志记录。
以下是代码具体实现:(采用Spring2.5,Myeclipse6.5)
(一)、从AOP角度分析: package org.wiki.spring.aspect; import org.aspectj.lang.JoinPoint; /** * 定义切面类,将系统中的横切性关注点模块化 * * @author Wiki.M * */ public class Aspect { /** * 定义advice,即切面类中方法具体实现, 这里主要是用于记录日志,只做简单处理。 * * @param joinPoint,可以取得被拦截方法的一些信息 */ public void logging(JoinPoint joinPoint) { //得到被拦截方法参数,并打印 Object[] args = joinPoint.getArgs(); for (int i = 0; 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 Wiki.M * */ 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 Wiki.M * */ 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(1); user.setName("Wiki"); user.setPassword("123"); //测试1,记录日志 userService.saveUser(user); //测试2,记录日志 userService.deleteUser(1); } }
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>
可能用到的Jar包: commons-logging.jar, log4j.jar, spring.jar, aspectjrt.jar, aspectjweaver.jar
另附本人测试代码。
注:如使用Annotation方式最好请修改Aspect这个类的类名,命名的时候疏忽了,可能会更aspectjrt.jar中的类冲突。
评论
发表评论
-
关于gamil安全证书尚未生效的问题
2010-03-08 12:34 2783问题:如题描述,gmail邮箱提示证书尚未生效,同时,可能会导 ... -
关于SQL查询不重复的记录集
2010-01-26 08:49 2618需求:如题所说,例:表A中有字段(id,no),其中记录为 ... -
入手Python
2009-09-26 21:01 958第一次接触Python应该算是去年暑假实习的时候,当时的时候也 ... -
对于代理模式、策略模式、模板模式的一些理解
2009-09-26 20:41 2836其实之前自己并没有系统去学习设计模式,当然以前也有接触过一些, ... -
基于Ext、Struts2的文件上传Demo
2009-07-28 22:35 1923最近难得比较空,前几天听朋友说要做这么一个东西,同时,我在网上 ... -
基于接口的分层实现
2009-04-04 17:13 1124摘要:通过本文简述 ... -
Facade 模式学习
2009-03-22 10:29 690在研究JPotStore这个项目的时候,涉及到了该种设计模式, ... -
Javascript动态生成Form表单
2009-03-21 21:42 3793主要是在利用Struts中的DispatchAction开发的 ... -
ibatis框架入门学习
2009-03-21 20:57 1031简单介绍下ibatis,我也没有怎么去搜索它相关的一些详情,个 ... -
Hibernate学习笔记(一)
2009-02-19 13:49 944Hibernate学习笔记 (1 ... -
Oracle用户管理学习笔记
2009-02-15 22:31 935注:参考自传智播客 3个默认用户 sys [as sysd ... -
关于WebService方面的学习经验分享
2009-02-10 13:22 1111前段时间开始学习WebService,刚开始的一两天内一直摸不 ... -
Struts1.X DispatchAction学习心得
2009-01-30 21:13 1208Struts1.X DispatchAction相关学习 目 ... -
Struts1.X个性化异常学习
2009-01-29 15:43 11551.编写自己的个性化异常类。该类中,可以包含成员变量error ... -
Struts1.X声明式异常学习
2009-01-29 15:02 1190Struts声明式异常 1.编写相应的异常类; 2.捕捉相 ... -
学习心得(八)
2009-01-26 18:25 831其实,本来昨天就想写这东西,不过,因为种种原因都没写。尽管已是 ... -
关于Request中setAttribute(String name,Object obj)的参数问
2009-01-02 15:25 4141在平时的开发中,您可能会碰到如下的错误提示: The meth ...
相关推荐
Spring AOP 简单入门示例 AOP(Aspect-Oriented Programming),即面向方面编程,是一种编程范式。AOP 是 OOP 的补充,它将系统中的横切性关注点模块化,并将其与业务逻辑分离。 在 Spring 中,AOP 是通过使用 ...
- **SpringAOP.doc**:可能是文档教程,包含了详细的步骤和示例代码。 - **SpringAOP_src.rar**:源代码示例,供你参考和实践。 - **readme.txt**:可能包含了关于这些资源的使用指南和注意事项。 通过学习和实践...
以入门级的`advice`为例,我们可能有一个简单的日志切面: ```java @Aspect @Component public class LoggingAspect { @Pointcut("execution(* com.example.service.*.*(..))") public void serviceMethods() {} ...
本压缩包中的"Spring-AOP"文件可能包含了示例代码和jar包,可以用来进一步研究和实践Spring AOP的使用。通过阅读源码,你可以深入理解Spring AOP的内部实现机制,这对于成为一位精通Spring框架的开发者至关重要。
本入门案例将帮助你理解并掌握Spring AOP的基本概念和使用方法。 在Spring AOP中,我们首先需要了解的是"切面"(Aspect)的概念。切面是封装了横切关注点的代码模块,它可以包含通知(Advice)、切点(Pointcut)和...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了声明式事务管理、日志记录、安全控制等跨切面关注点的功能。AOP允许开发者将一些通用功能如日志...
使用spring4.0进行用户日志的记录 这里带junit的测试跟main的测试 参考了 http://blog.csdn.net/oathevil/article/details/7288867 本代码中还包括了一个java自带注解的例子写的都非常易懂对于hellospring中第一位...
以下是一个简单的Spring AOP入门实例步骤: 1. 首先,定义一个切面类,包含通知方法。例如,一个简单的日志切面: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example*...
### Spring AOP 入门详解 #### 一、Spring AOP 概述 Spring AOP (Aspect Oriented Programming) 是一种面向切面编程的技术,在Spring框架中得到了良好的支持。通过这种方式,开发者可以更加灵活地组织代码,使得...
**Spring AOP 入门及其实例讲解** 在软件开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种编程范式,它旨在提高代码的可重用性,减少冗余,并将关注点分离。Spring框架是Java开发中的一个流行...
5. **Spring AOP入门**: Spring AOP通过XML配置或者注解方式来实现AOP功能。在XML配置中,可以定义Bean、Advisor、Pointcut等元素。在注解方式下,可以使用`@Aspect`、`@Before`、`@After`、`@AfterReturning`、`@...
在这个名为"springAOP-dome"的实例中,我们将探讨如何利用Spring AOP实现一个简单的日志记录功能,以作为入门学习。 首先,了解AOP的基本概念是必要的。面向切面编程是一种编程范式,旨在解决程序中的横切关注点,...
在IT行业中,Spring框架是Java企业级应用开发的首选,而Spring AOP(面向切面编程)则是其核心特性之...同时,阅读博客文章(链接已给出)会提供更详细的解释和示例,帮助你更好地掌握Spring AOP和@AspectJ的实际应用。
创建一个简单的Spring Boot AOP示例,包括以下几个步骤: 1. **Spring Boot项目生成**:使用Spring Initializr或者相关IDE插件,选择Spring Web模块,生成一个新的Spring Boot项目。 2. **添加依赖**:在`pom.xml`...
### Spring2-AOP入门实例教程知识点详解 #### 一、Spring框架概述 - **轻量级J2EE开发框架**:Spring是一个轻量级的Java应用框架,它为开发复杂的企业级应用提供了一种简化的方法。 - **发展历程**:自2002年发布...
在这个"2018年11月22日博客资源"中,你将找到关于如何使用 Maven 来管理 Spring 入门程序的示例。下面我们将深入探讨这两个工具的使用和相互配合。 1. **Maven 的基本概念** - `pom.xml`:Maven 的核心配置文件,...
在本入门示例中,我们将深入理解 Spring MVC 的核心概念和关键组件,以便初学者能够快速上手。 1. **MVC 模式** MVC 模式是一种软件设计模式,用于分离应用程序的数据模型、用户界面和业务逻辑。Model(模型)处理...
Spring AOP,全称为Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了声明式...通过实践这些示例,你可以更好地理解如何在实际项目中应用Spring AOP来解决实际问题。
以上就是一个简单的Spring AOP入门介绍。通过学习和实践,你可以更好地理解如何在实际项目中利用AOP来提高代码的可维护性和灵活性。在后续的学习中,你还可以探索更高级的特性,如自定义通知类型和使用AspectJ的编织...
本示例旨在引导初学者入门Spring框架,通过一个简单的应用实例来理解其核心概念。 Spring框架的核心特性包括依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)。依赖注入...