原文链接:http://www.orlion.ga/205/

一、AOP简介

1、AOP概念

参考文章:http://www.orlion.ml/57

2、AOP的产生

对于如下方法:

    public class UserDAOImpl implements UserDAO{public void saveUser(User user){doSaveUser();}}

想在saveUser方法中执行保存用户之前和之后记录当前时间以求出saveUser花费了多少时间,方法有很多种,最直观的写法就是在doSaveUser()前后加代码取出当前时间:

    public class UserDAOImpl implements UserDAO{public void saveUser(User user){int beginTime = getCurrentTime();doSaveUser();int endTime = getCurrentTime();}}

还有一种方法就是重新写一个类继承自UserDAOImpl然后重写saveUser方法,如下:

    public class UserDAOImpl2 extends UserDAOImpl{@Overridepublic void saveUser(User user){int beginTime = getCurrentTime();super.saveUser();int endTime = getCurrentTime();}}

这种方法耦合性太强,一旦父类改变了子类也会改变,慎用继承

再有一种方法就是在调用saveUser()方法时加代码:

    public class UserService{public void saveUser(User user){UserDAOImpl userDao = new UserDAOImpl();int beginTime = getCurrentTime();userDao.saveUser();int endTime = getCurrentTime();}}

现在如果让我们将项目中所有的对数据库进行CRUD操作的方法都加上获取时间的代码,显然工作量太大,这时候就用动态代理: (可参考http://www.orlion.ml/207/)

UserDAOImpl.java

    package ml.orlion.dao.impl;import ml.orlion.dao.UserDAO;import ml.orlion.model.User;public class UserDAOImpl implements UserDAO{public void saveUser(User user){System.out.println("save usering");}}

TimeInterceptor.java

    package ml.orlion.aop;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class TimeInterceptor implements InvocationHandler{private Object target;// 被代理的对象public Object getTarget() {return target;}public void setTarget(Object target) {this.target = target;}public void beforeMethod(Method m){System.out.println(m.getName() + "begin start");}@Overridepublic Object invoke(Object proxy, Method m, Object[] args) throws Throwable {this.beforeMethod(m);// 插入方法m.invoke(target, args);return null;}}

测试

    public static void testProxy(){// 首先产生一个被代理对象UserDAO userDao = new UserDAOImpl();// 下一步将被代理对象交给InvocationHandler即TimeInterceptorTimeInterceptor ti = new TimeInterceptor();// 设置被代理对象ti.setTarget(userDao);// 根据被代理对象产生一个代理UserDAO userProxy = (UserDAO)Proxy.newProxyInstance(UserDAO.class.getClassLoader(), new Class[]{UserDAO.class}, ti);userProxy.saveUser(new User());}

运行可以看到控制台打印:saveUserbegin start      save usering

二、使用Spring AOP

UserDAO.java:

package ml.orlion.dao;import ml.orlion.model.User;public interface UserDAO {public void saveUser(User user);
}

UserDAOImpl.java:

package ml.orlion.dao.impl;import ml.orlion.dao.UserDAO;
import ml.orlion.model.User;public class UserDAOImpl implements UserDAO{public void saveUser(User user){System.out.println("save usering");}
}

UserService.java

package ml.orlion.service;import ml.orlion.dao.UserDAO;
import ml.orlion.dao.impl.UserDAOImpl;
import ml.orlion.model.User;public class UserService {private UserDAO userDAO = new UserDAOImpl();public UserDAO getUserDao() {return userDAO;}public void setUserDao(UserDAO userDAO) {this.userDAO = userDAO;}public void saveUser(User user){this.userDAO.saveUser(user);}
}

LogInterceptor.java

package ml.orlion.aop;public class LogInterceptor {public void before(){System.out.println("before");}
}

beans.xml:

<?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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><bean id="logInterceptor" class="ml.orlion.aop.LogInterceptor"></bean><bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl"></bean><bean id="userService" class="ml.orlion.service.UserService"><property name="userDao" ref="userDao"/></bean><aop:config><aop:pointcut expression="execution(public * ml.orlion.service..*.add(..))"id="servicePointcut" /><aop:aspect id="logAspect" ref="logInterceptor"><aop:before method="before" pointcut-ref="servicePointcut"/></aop:aspect></aop:config>
</beans>

测试:

BeanFactory appContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) appContext.getBean("userService");
userService.saveUser(new User());

转载于:https://www.cnblogs.com/orlion/p/5350859.html

Spring(三)AOP面向切面编程相关推荐

  1. spring中AOP(面向切面编程)

    spring中AOP(面向切面编程) 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是spring框架中的一个重要内容 ...

  2. 大数据WEB阶段Spring框架 AOP面向切面编程(一)

    Spring - AOP面向切面编程(一) 一.代理模式概述 代理的特点:(目标对象即被代理者) 实现和目标对象相同的接口 具备和目标对象的方法 代理者不仅要做目标对象的方法 , 还要做一些额外的操作 ...

  3. 大数据WEB阶段Spring框架 AOP面向切面编程(二)

    Spring AOP面向切面编程(二) 一.切入点的execution表达式 execution的表达形式: execution(修饰符? 返回值类型 所在包类? 方法名(参数列表) 异常?) ?表示 ...

  4. 【SSM】Spring系列——AOP面向切面编程

    文章目录 03 AOP面向切面编程 3.1 AOP概述 3.2 面向切面编程对有什么好处 3.3 模拟AOP框架实现 3.3.1 代码实现版本一 3.3.2 代码实现版本二 3.3.3 代码实现版本三 ...

  5. Spring框架 AOP面向切面编程(转)

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  6. Spring的AOP面向切面编程

    什么是AOP? 1.AOP概念介绍 所谓AOP,即Aspect orientied program,就是面向方面(切面)的编程. 功能: 让关注点代码与业务代码分离! 关注点: 重复代码就叫做关注点: ...

  7. Spring Boot AOP面向切面编程使用(定义切入点、前置通知、后置通知、返回通知、异常通知、环绕通知)

    1 AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发 ...

  8. Spring之AOP(面向切面编程)_入门Demo

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可 ...

  9. 【Spring】AOP面向切面编程(Spring4和Spring5区别)

    AOP 1. 什么是AOP 2. AOP常用注解 3.Spring4各种通知的执行节点 4. 在aop中校验不通过如何不让程序进入核心代码? 5. 同一个方法被多个Aspect类拦截 5.1 如何指定 ...

最新文章

  1. 如何配置jdk环境变量
  2. Windows Mobile 设备中心 for vista 一览
  3. mysql的三大特性_【mysql】Innodb三大特性之double write
  4. SQLAlchemy
  5. 电脑字体模糊_小红书上传视频模糊?做小红书视频99%的工具都在这了
  6. 常用的Linux操作系统
  7. 8051系列单片机软件精确延时研究(二)
  8. 全景视频拼接(一)--关键技术流程
  9. 犀牛3D造型软件Rhino 7 for Mac
  10. 图像识别的工作原理是什么?商业上如何使用它?
  11. ffmpeg编解码命令(包含YUV编码到常见视频格式文件)
  12. GrassCutter使用教程
  13. 论文阅读翻译笔记之Incentives build robustness in BitTorrent
  14. mysql数据导入导出 CSV格式_导出mysql的数据为csv格式的文件
  15. 华为新贵!方舟编译器的荣光和使命
  16. Python之OpenGL笔记(17):键盘鼠标控制摄像机移动旋转
  17. R语言 编写循环语句
  18. 企业微信 jssdk调用 扫一扫 安卓不行 ios又可以
  19. Pr——2020版本对导入视频如何编辑的操作
  20. 3.26黄金原油后市看涨吗?3.27原油白银td操作建议走势分析

热门文章

  1. 麻省理工牛人解说数学体系
  2. 36氪研究 | 智慧零售行业研究报告
  3. 深度|2030年8亿人会失业!图解机器人如何取代你的工作
  4. 纽约大学Gary Marcus发文指出AlphaZero「被夸大」,强调重视人工智能「先天因素」
  5. 麦肯锡全球调研160个案例,发布5个行业34个AI应用场景
  6. “那个工作 10 年没跳槽的人,混不下去了”
  7. 10 行 Python 代码自动清理电脑重复文件,解放双手!
  8. 小程序页面之间的通讯利器 - nsevent
  9. DVWA系列之1 环境搭建
  10. “堆”,栈,堆栈,队列,它们的区别?