- 浏览: 154753 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lovelimx:
最后一个java文件第37行 orignal = new S ...
JAVA笔试面试必考题系列(六)——字符串(String)杂谈 -
ponlya:
下午又去下了个eclipse3.4,再按这方法,ok了。谢谢楼 ...
eclipse 3.4 下配置 Hibernate tool工具 -
ponlya:
如楼主所说的第1,2步,我在第3步中怎么得不到那个文件夹?换用 ...
eclipse 3.4 下配置 Hibernate tool工具 -
chinaboby2008:
...
JBoss目录结构说明 -
chinaboby2008:
这是java中的j2se部分。是java的基础呢。
有关Java容器的基础知识
分享一个自己写的最为简单的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);
- }
- }
(一)、从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>
<?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中的类冲突。
- spring_aop.rar (4.5 MB)
- 下载次数: 532
发表评论
-
OSI七层模型与 TCP/IP五层模型 TCP/UDP的区别
2010-12-27 18:53 5354OSI七层模型与 TCP/IP五层 ... -
http get post的区别
2010-03-12 11:40 1842定义了与服务器交互的不同方法,最基本的方法是 GET 和 PO ... -
动态增加行 js代码
2010-03-11 16:50 1263<!DOCTYPE HTML PUBLI ... -
全面总结Java泛型
2010-02-23 17:51 852虽然Scala创始人Martin Odersky说当年正是因为 ... -
Java运行时多态性:继承和接口的实现
2010-02-23 17:48 1269Java是面向对象的语言,而运行时多态性是面向对象程序设计代码 ... -
各种集合对比
2010-02-22 17:41 868Collections和Collection的区别 Col ... -
WEB应用中的servlet的 service,doPost,doGet方法的关系
2010-02-22 17:33 1932WEB应用中的servlet的 service,doPost, ... -
Hibernate 缓存机制(二)
2010-02-07 21:47 1043为什么使用hibernate 1、对JDBC操作提供封装, ... -
Hibernate 缓存机制
2010-02-07 21:23 707缓存是介于应用程序和 ... -
J2EE JVM调优 优化
2009-10-19 18:05 909JVM参数调优是一个很头 ... -
eclipse 3.4 下配置 Hibernate tool工具
2009-09-14 17:08 2116http://www.51taobaogood.cn 1. ... -
Valang Validator学习实例入门
2009-09-14 15:48 1361Valang Validator 是较为新颖的插件,在参考胡键 ... -
JavaBean之间拷贝利器-Dozer
2009-09-14 15:42 1859JavaBean之间拷贝利器-Doze ... -
Download and crack Jprobe 8.0
2009-06-15 14:27 3317(转)Download and crack Jprobe 8 ... -
spring获得ApplicationContext
2009-06-08 17:06 20661.servlet Spring获取ApplicationC ... -
操作properties文件总结
2009-06-08 17:00 9661.spring读取 ////////////////// ... -
软件版本GA,RC,Demo,Build意思
2009-05-25 10:48 832转自 http://blog.chinaunix.ne ... -
选择Java接口还是抽象类
2009-05-11 16:43 924很多人有过这样的疑问 ... -
有关Java容器的基础知识
2009-05-08 15:04 1171Java中容器是Java3中比较 ... -
Java性能优化小技巧
2009-05-08 10:35 9151.1.在创建对象时能不用new关健字的最好不要用new创建新 ...
相关推荐
SpringAOP简单入门示例..pdf
spring aop简单例子,入门学习的好资料
使用spring4.0进行用户日志的记录 这里带junit的测试跟main的测试 参考了 http://blog.csdn.net/oathevil/article/details/7288867 本代码中还包括了一个java自带注解的例子写的都非常易懂对于hellospring中第一位...
本书最大的特色在于每章都是由浅入深,从一个简单的示例入手,让读者快速了解本章内容,然后再详细讲解本章涉及的基本原理和知识点,最后再通过一个详细的示例宋巩固所学内容。 本书每一章的例子都是经过精挑细选,...
本项目示例基于spring boot 最新版本(2.1.9)实现,Spring Boot、Spring Cloud 学习示例,将持续更新…… 在基于Spring Boot、Spring Cloud 分布微服务开发过程中,根据实际项目环境,需要选择、集成符合项目...
本书最大的特色在于每章都是由浅入深,从一个简单的示例入手,让读者快速了解本章内容,然后再详细讲解本章涉及的基本原理和知识点,最后再通过一个详细的示例宋巩固所学内容。 本书每一章的例子都是经过精挑细选,...
林信良著 spring2.0...主要包括Spring入门、Bean/消息/事件、Spring AOP、JDBC/事物支持、Spring与Hibernate的整合、Spring Web MVC框架、View层方案/Web框架整合、API封装、Spring在线书签完整项目示例等内容。
\r\n 本书内容全面深入,主要包括Spring入门、Bean/消息/事件、Spring AOP、JDBC/事物支持、Spring与Hibernate的整合、Spring Web MVC框架、View 层方案/Web框架整合、API封装、Spring在线书签完整项目示例等内容。
通过Spring的入门程序介绍了Spring的 IoC 和 DI 的概念,介绍了Spring的基本模块。详细介绍了对象创建的细节和依赖注入的几种方式;介绍了如何使用注解完成Spring的相关功能;介绍了如何借助于Spring搭建JUnit测试...
该项目包含helloworld(快速入门)、web(ssh项目快速搭建)、aop(切面编程)、data-redis(redis缓存)、quartz(集群任务实现)、shiro(权限管理)、oauth2(四种认证模式)、shign(接口参数防篡改重放)、encoder(用户...
ssm框架整合示例, 掌握SPRING + SPING MVC + MYBATIS 三大框架整合.Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java... 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架
Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。...这些示例还将成为本系列后面部分进行的展开式讨论的基础,在本文的后面部分,将介绍Spring框架通过SpringAOP实现AOP构造的方式。
书内容全面深入,主要包括Spring入门、Bean/消息/事件、Spring AOP、JDBC/事物支持、Spring与Hibernate的整合、Spring Web MVC框架、View层方案/Web框架整合、API封装、Spring在线书签完整项目示例等内容。
编程思想示例项目 第一章 Spring Framework 总览 核心特性 核心特性(Core) IoC 容器(IoC Container) Spring 事件(Events) 资源管理(Resources) 国际化(i18n) 校验(Validation) 数据绑定(Data Binding) 类型装换(Type...
spring3的IOC,AOP,JDBC,orm等各个模块的使用示例集锦,可以作为入门的spring学习示例教程 在org.springweb.context.test包下 1.IOC * spring框架设计理念(POJO化) * 1.IOC 概念,作用,优点 Donnot call me,we ...