1.什么是AOP?

AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

2.aop在Spring中的作用

横切关注点:跨越应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志 , 安全 , 缓存 , 事务等等:即AOP在不改变原有代码的情况下,去增加新的功能。

切面(ASPECT):横切关注点 被模块化 的特殊对象。即,它是一个类。
通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。
目标(Target):被通知对象。
代理(Proxy):向目标对象应用通知之后创建的对象。
切入点(PointCut):切面通知 执行的 “地点”的定义。
连接点(JointPoint):与切入点匹配的执行点。

SpringAOP中,通过Advice定义横切逻辑,Spring中支持5种类型的Advice

3.使用Spring项目实现AOP

使用AOP织入,需要到入一个依赖包

<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version>
</dependency>

3.1 config配置 日志 , 安全 , 缓存 , 事务等等

创建一个了哦去实现需要在切入的业务

//MethodBeforeAdvice 前置
public class log implements MethodBeforeAdvice {//method: 要执行的目标对象// args :参数// target: 目标对象public void before(Method method, Object[] args, Object target) throws Throwable {System.out.println(target.getClass().getName()+"的"+method.getName()+"被执行");}
}
//AfterReturningAdvice:后置
public class Advice implements AfterReturningAdvice {//returnValue 执行后有返回值public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {System.out.println("执行了"+method+"方法,返回结果为:"+returnValue);}
}

3.2 Servicre业务层,编写一个接口和接口实现类

public interface UserService {public void add();public void delete();
}
public class UserServiceIMpl implements UserService {public void add() {System.out.println("增加一个用户");}public void delete() {System.out.println("删除一个用户");}
}

3.3 编写配置文件applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!--开启注解支持context:支持上下文annotation-config :注释配置--><context:annotation-config/><!--扫描包 自动注入所有的组件--><context:component-scan base-package="com.heng.Service"/><!--注册bean--><bean id="UserService" class="com.heng.Service.UserServiceIMpl"/><bean id="advice" class="com.heng.config.Advice"/><bean id="log" class="com.heng.config.log"/>
<!--配置aop :需要导入aop的约束--><!--方式一:使用原生的Spring Api接口--><aop:config><!--切入点  expression 表达式expression(要执行的位置!* * * * *--><aop:pointcut id="pointcut" expression="execution(* com.heng.Service.UserServiceIMpl.* (..))"/><!--执行环绕增加--><aop:advisor advice-ref="advice" pointcut-ref="pointcut"/><aop:advisor advice-ref="log" pointcut-ref="pointcut"/></aop:config></beans>

3.4 测试

    @Testpublic void test1(){ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//        动态代理面向的是接口UserService userService = (UserService) context.getBean("UserService");userService.add();}


测试结果:
com.heng.Service.UserServiceIMpl的add被执行
增加一个用户
执行了public abstract void com.heng.Service.UserService.add()方法,返回结果为:null

3.5 方式二 自定义一个类为切面(方法)

定义一个类

public class DiyPointCut {public void qian(){System.out.println("=====方法执行前======");}public void hou(){System.out.println("=====方法执行后======");}
}

配置xml文件

<!--方式二:自定义类--><bean id="diy" class="com.heng.diy.DiyPointCut"/><aop:config><!--自定义aspect 切面,ref 要要引用的类--><aop:aspect ref="diy"><!--切入点--><aop:pointcut id="point" expression="execution(* com.heng.Service.UserServiceIMpl.*(..))"/><aop:before method="qian" pointcut-ref="point"/><aop:after method="hou" pointcut-ref="point"/>/aop:aspect></aop:config>

测试方法不变

3.6方式三 注解实现

编写一个类

//方式三 使用注解方式实现
@Aspect//标志这个类是一个切面
public class ZhuJie {@Before("execution(* com.heng.Service.UserServiceIMpl.*(..))")public void qian(){System.out.println("=====方法执行前======");}@After("execution(* com.heng.Service.UserServiceIMpl.*(..))")public void hou(){System.out.println("=====方法执行后======");}@Around("execution(* com.heng.Service.UserServiceIMpl.*(..))")public void around(ProceedingJoinPoint jp) throws Throwable {System.out.println("环绕前");Object proceed = jp.proceed();System.out.println("环绕后");}
}

xml 配置

 <!--方式三 注解--><bean id="ZhuJie" class="com.heng.diy.ZhuJie"/><!--开启注解支持  autoproxy自动代理--><aop:aspectj-autoproxy/>

测试方法不变

总结:横向切面,在不影响原来的业务下实现动态的增强。

Spring AOP(切面面向接口)相关推荐

  1. 【JavaEE】Spring AOP (面向切面)详解

    目录: 1. 什么是 Spring AOP? 1.1 AOP 1.2 使用 AOP 的场景 2. AOP 组成 2.1 切面(Aspect) 2.2 连接点(Join Point) 2.3 切点(Po ...

  2. Spring AOP切面的时候参数的传递

    Spring AOP切面的时候参数的传递 Xml: <?xml version="1.0" encoding="UTF-8"?> <beans ...

  3. spring aop 切面添加日志

    这是一个非常简单的spring aop切面添加日志的程序,下面来看一下这个程序 1.程序使用jar包 2.切面类LoggingAspect.java package com.cailei.aop.as ...

  4. Spring AOP 切面@Around注解的具体使用

    @Around注解可以用来在调用一个具体方法前和调用后来完成一些具体的任务. 比如我们想在执行controller中方法前打印出请求参数,并在方法执行结束后来打印出响应值,这个时候,我们就可以借助于@ ...

  5. 【经典】Spring aop切面实现异步添加日志—完整版

    系统开发中我们常遇到要处理系统日志等信息的,在此我分享一篇 利用spring aop切面来异步添加日志的操作,其中用到了 队列和多线程,前面的博客有写. 第一步:创建log实体,根据自己业务而定, p ...

  6. spring AOP切面日志

    spring AOP切面日志 导入依赖 <properties><fastjson.version>1.2.49</fastjson.version> </p ...

  7. Spring AOP切面使用详细解析

    相关文章: SpringBoot AOP切面的使用 一步一步手绘Spring AOP运行时序图(Spring AOP 源码分析) 架构师系列内容:架构师学习笔记(持续更新)) Spring AOP 应 ...

  8. 使用Spring AOP进行面向方面的编程

    面向方面的编程(AOP)是指将辅助功能或支持功能与主程序的业务逻辑隔离开来的编程范例. AOP是用于分离横切关注点的有前途的技术,这在面向对象的编程中通常很难做到. 以此方式增加了应用程序的模块化,并 ...

  9. 武林秘籍之Spring AOP 切面编程的简单应用

    年轻人,我观你骨骼精奇,定是万里无一的练武奇才,老夫这里有一本失传已久的武林秘籍,现赠于你,望你勤加苦练,早日修成正果... AOP(面向切面编程):Aspect Oriented Programmi ...

  10. 日志管理(spring AOP切面拦截)

    **最近,在写日志管理的东西呢,用了几种方法试,还是拦截比较好用,直接截下来传入到数据库中存储. 写的时候,真是头疼啊. 哦~对了,忘了说了,不需要用到Dao层哦. 首先,来一个POJO实体类吧,我看 ...

最新文章

  1. 【Java面试题】54 去掉一个Vector集合中重复的元素
  2. boost::interprocess::intrusive_ptr用法的测试程序
  3. hoj 13788 Dwarves
  4. web3.js_1.x.x--API(一)event/Constant/deploy/options
  5. Java Web学习总结(12)——使用Session防止表单重复提交
  6. Java Math.round()函数小结
  7. 联手三年,获取数千名客户,阿里云如何重构 Elastic 开放免费的技术?
  8. Iterative learning control for linear discrete delay systems via discrete matrix delayed exponential
  9. 梅创社c语言课本答案解析,c语言程序设计第2版) 教学课件 作者 梅创社答案 第一章答案.docx...
  10. 计算机键盘操作指法 考试题,计算机键盘指法练习图计算机键盘指法练习介绍...
  11. 人工智能数据集文本处理Onehot/TF/TFIDF矩阵的生成
  12. 视频编码格式 封装格式
  13. 【养眼美女win7主题】主题世界
  14. 如何用photoshop识别图片上文字的字体
  15. 微信小程序生成带参数的二维码
  16. mercury重置密码后服务器无响应,melogin.cn打不开的解决办法 水星路由器重置完无法上网...
  17. 反向比例运算电路微分关系_电气必备20个经典电路,老电工必看!
  18. 重复字符串的处理问题
  19. CDN: trunk URL couldn't be downloaded
  20. Java中Map集合中的Entry对象

热门文章

  1. CPU四核八线程和四核四线程的区别
  2. 零点和极点的物理意义
  3. Vue 使用图表插件 -- Echarts
  4. 自动变量,非自动变量,全局变量与局部变量
  5. PHP取小数点后一位小数或几位小数并且不四舍五入,以及四舍五入保留小数
  6. O2O优惠券使用数据分析
  7. 基于XGBoost的用户流失预测
  8. 毕业设计--智能环境监测系统基于harmonyOS的移动端应用开发
  9. Python爬取中国大学排名,并且保存到excel中
  10. 第一台计算机作文,精选电脑三年级作文6篇