AOP (Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。它是一种新的方法论,它是对传统OOP编程的一种补充。

OOP是关注将需求功能划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系,属于纵向扩展;

AOP是希望能够将通用需求功能从不相关的类当中分离出来,能够使得很多类共享一个行为,一旦发生变化,不必修改很多类,而只需要修改这个行为即可。属于横向扩展

例如:几乎所有的业务类中都会有记录日志的代码,但是记录日志的代码严格意义上讲又不属于这些对象的行为,同时也会产生大量的重复代码,此时应该考虑将记录日志的代码提炼出来,引入AOP。

新建一个切面类

package com.test.ssm.aop;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;public class TestAspect {public void doBefore(JoinPoint jp) {System.out.println("TestAspect doBefore  结束执行方法 :" + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName());}public void doAfter(JoinPoint jp) {System.out.println("TestAspect doAfter  开始执行方法 :" + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName());}}

包含两个方法,doBefore和doAfter,分别在注入的方法执行开始和执行结束时运行

新建一个aop.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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/aop/spring-aop.xsd "><aop:config><aop:aspect id="TestAspect" ref="aspectBean"><aop:pointcut id="businessService" expression="execution(* com.test.ssm.aop.service.*.*(..))" /><aop:before pointcut-ref="businessService" method="doBefore"/><aop:after pointcut-ref="businessService" method="doAfter"/></aop:aspect></aop:config><bean id="aspectBean" class="com.test.ssm.aop.TestAspect" /><bean id="bService" class="com.test.ssm.aop.service.BServiceImpl"></bean>
</beans>

在aop.xml中,将TestAspect和BServiceImpl连个类注入到Spring

package com.test.ssm.aop.service;public class BServiceImpl {public void doSomeThing(String _msg) {System.out.println("BServiceImpl doSomeThing msg : " + _msg);}
}

在需要调用BServiceImpl的地方使用:

ApplicationContext ctx = new ClassPathXmlApplicationContext("aop.xml") ;
BServiceImpl ss = ctx.getBean(BServiceImpl.class);
ss.doSomeThing("dsfds");

运行结果如下:

可以看到,执行BServiceImpl的doSomeThing方法时,aop自动会注入改方法,并记录方法执行开始和结束的日志。

转载于:https://www.cnblogs.com/jimmy-y/p/9268172.html

Spring AOP 浅析相关推荐

  1. Spring AOP原理浅析及入门实例

    上篇问题及Spring AOP实现原理浅析 上篇说了一个AOP编程问题,那是一个错误的AOP案例.它的错误在A类中,再次粘贴A类代码: @Componentpublic class AImpl imp ...

  2. Spring AOP是什么?你都拿它做什么?

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 转自:我叫刘半仙, https://my.oschina.net/liughDevelop/blo ...

  3. 从诸葛亮博望坡火烧曹军谈Spring AOP 的五种使用方式

    曹操自剿黄巾,讨董作,擒吕布,灭袁绍后,队伍达到鼎盛期,拥有兵将100余万,为了统一全国,派手下将领夏候淳领兵十万攻打新野.时当秋月,秋风徐起,夏侯惇引兵至博望坡,新野危在旦夕. 刘备请军师诸葛亮对策 ...

  4. Spring AOP + Redis解决重复提交的问题

    Spring AOP + Redis解决重复提交的问题 用户在点击操作的时候,可能会连续点击多次,虽然前端可以通过设置按钮的disable的属性来控制按钮不可连续点击,但是如果别人拿到请求进行模拟,依 ...

  5. 利用Spring AOP与JAVA注解为系统增加日志功能

    Spring AOP一直是Spring的一个比较有特色的功能,利用它可以在现有的代码的任何地方,嵌入我们所想的逻辑功能,并且不需要改变我们现有的代码结构. 鉴于此,现在的系统已经完成了所有的功能的开发 ...

  6. Spring AOP的一些概念

            切面(Aspect): 一个关注点的模块化,这个关注点可能会横切多个对象.事务管理是J2EE应用中一个关于横切关注点的很好的例子. 在Spring AOP中,切面可以使用通用类(基于模 ...

  7. Spring AOP与IOC

    Spring AOP实现日志服务 pom.xml需要的jar <dependency><groupId>org.apache.commons</groupId>&l ...

  8. Spring AOP与IOC以及自定义注解

    Spring AOP实现日志服务 pom.xml需要的jar <dependency><groupId>org.apache.commons</groupId>&l ...

  9. Spring Aop的应用

    2019独角兽企业重金招聘Python工程师标准>>> AOP的基本概念 连接点( Jointpoint) : 表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化.方法执行 ...

最新文章

  1. 数据挖掘原理与算法:练习题1
  2. 学习 SQL 语句 - Select(7): 分组统计之 Avg()、Sum()、Max()、Min()、Count()
  3. php 发邮件附件pdf,php – 使用TCPDF发送电子邮件附件 | 码农网
  4. javascript-入门篇-使用js的三种方式
  5. 关于浮点数和字符串转换的函数示例
  6. bat ping 返回值_清清楚楚玩游戏!10.10版本,赛娜被动层数可以ping给队友看了
  7. webComponent初体验
  8. IT项目管理表格集合
  9. 为什么台湾的Yahoo!叫奇摩 ?
  10. python 以图搜图1688_以图搜图(一):python aHash算法
  11. 挥手夕阳无限美-15年终总结
  12. 研究生新生要怎么看论文?
  13. Salient Object Detection Driven by Fixation Prediction 论文解读
  14. 线程安全、乐观锁和悲观锁那点事
  15. 洛谷 P1919 模板】A*B Problem升级版(FFT快速傅里叶)
  16. Canvas实现3D效果-可旋转的立方体
  17. AMBA协议之AXI协议——中文翻译
  18. php api 接口
  19. 程序员生涯快一年感悟
  20. 正点原子STM32F103精英版学习笔记(二)

热门文章

  1. 已解决:mysql: [Warning] Using a password on the command line interface can be insecure.
  2. 神州数码 每日总结DCWS
  3. MySQL中查询字段为空或者为null方法
  4. jts116_JTS T 116-2019水运建设工程概算预算编制规定.pdf
  5. sap 发送mesage_SAP系统和微信集成的系列教程之九:如何将微信用户发送给微信公众号的内容自动转存到SAP C4C系统...
  6. mysql父子节点分层_mysql 递归实例 父子节点层级递归
  7. php urledcode_php慎用urldecode函数
  8. 03、了解自动配置原理笔记
  9. c++ regex 替换汉字_C++ - 正则表达式(regex) 替换(replace) 的 详解 及 代码
  10. linux apache压缩包安装目录,源码包安装Apache服务