6、AOP实现切入

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

6.1实现切入的三种方式

6.1.1方式一,spring接口实现

  1. 定义一个实现切入的接口
public interface BookService {

    void addBook();

    void deleteBook();

    void updateBook();

    void queryBook();

}
  1. 实现该接口的类
public class BookServiceImpl implements BookService{
@Override
public void addBook() {
System.out.println("增加了一本图书");
} @Override
public void deleteBook() {
System.out.println("删除了一本图书");
} @Override
public void updateBook() {
System.out.println("更新了一本图书");
} @Override
public void queryBook() {
System.out.println("查询了一本图书");
}
}
  1. 定义切入前操作,实现MethodBeforeAdvice这个接口
//第一个切入点
public class BeforeLog implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
if(target != null){
System.out.println(target.getClass().getName() + "执行力"+ method.getName() + "方法!");
} }
}
//第二个切入点
public class BeforeAfterLog implements MethodBeforeAdvice {
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("最开始的");
}
}
  1. 定义切入之后操作,实现AfterReturningAdvice接口
public class AfterLog implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
if(target != null){
System.out.println(target.getClass().getName() + "执行力"+ method.getName() + "方法!");
}
System.out.println("returnValue: "+ returnValue);
}
}

注:可以实现多个切入操作

  1. spring的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/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="bookServiceImpl" class="com.mhy.aop.service.BookServiceImpl"/>
<bean id="beforeLog" class="com.mhy.aop.Log.BeforeLog"/>
<bean id="afterLog" class="com.mhy.aop.Log.AfterLog"/>
<bean id="beforeAfterLog" class="com.mhy.aop.Log.BeforeAfterLog"/> <aop:config>
<!-- 切入点-->
<aop:pointcut id="pointcut" expression="execution(* com.mhy.aop.service.BookServiceImpl.*(..))"/>
<!-- 执行环绕增加-->
<aop:advisor advice-ref="beforeAfterLog" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="beforeLog" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
</aop:config> </beans>
  1. 测试
    @Test
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("bookbeans.xml"); BookService bookService = context.getBean("bookServiceImpl", BookService.class); bookService.deleteBook();
} //结果
/*
最开始的
com.mhy.aop.service.BookServiceImpl执行力deleteBook方法!
删除了一本图书
com.mhy.aop.service.BookServiceImpl执行力deleteBook方法!
returnValue: null
*/

6.1.2方式二,自定义切入面实现

  1. 自定义一个切入点的类 DiyPointcut
public class DiyPointcut {
public void before(){
System.out.println("方法执行前");
} public void after(){
System.out.println("方法执行后");
}
}
  1. 在配置文件中配置
    <aop:config>
<aop:aspect ref="diyPointcut">
<!-- 切入点-->
<aop:pointcut id="pointcut" expression="execution(* com.mhy.aop.service.BookServiceImpl.*(..))"/>
<!-- 通知-->
<aop:before method="before" pointcut-ref="pointcut"/>
<aop:after method="after" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
  1. 测试结果
方法执行前
删除了一本图书
方法执行后

6.1.3方式三,注解实现

  1. 开启注解驱动
<!--开启注解注册的IOC容器的驱动-->
<context:component-scan base-package="com.mhy.aop"/>
<context:annotation-config/>
<!-- AOP方式三注解-->
<!-- 开启AOP注解驱动-->
<aop:aspectj-autoproxy />
<!--
proxy-target-class这个默认是false表示使用JDK实现
<aop:aspectj-autoproxy proxy-target-class="false"/>
proxy-target-class这个是true表示使用cglib实现
<aop:aspectj-autoproxy proxy-target-class="true"/>
-->
  1. 切面类 AnnotationPointcut

    • @Aspect:定义切面注解
    • @After("execution( com.mhy.aop.service.BookServiceImpl.*(..))")*:定义切入点前的注解
    • @After("execution( com.mhy.aop.service.BookServiceImpl.*(..))")*:定义切入点后的注解
    • @Around("execution( com.mhy.aop.service.BookServiceImpl.*(..))")*:定义环绕切入点注解
@Component(value = "annotationPointcut")
//注解定义切入面
@Aspect
public class AnnotationPointcut { //注解定义方法前切入点
@Before("execution(* com.mhy.aop.service.BookServiceImpl.*(..))")
public void before(){
System.out.println("========方法执行前=========");
} //注解定义方法后切入点
@After("execution(* com.mhy.aop.service.BookServiceImpl.*(..))")
public void after(){
System.out.println("========方法执行后=========");
} //注解定义环绕切入
@Around("execution(* com.mhy.aop.service.BookServiceImpl.*(..))")
public void around(ProceedingJoinPoint point) throws Throwable {
//ProceedingJoinPoint被切入对象的信息的获取
System.out.println("环绕前");
//执行被切入对象的方法
point.proceed();
System.out.println("环绕后"); System.out.println(point.getSignature());
System.out.println(point); } }
  1. 测试结果
环绕前
========方法执行前=========
删除了一本图书
========方法执行后=========
环绕后
void com.mhy.aop.service.BookService.deleteBook()
execution(void com.mhy.aop.service.BookService.deleteBook())

AOP实现切入的更多相关文章

  1. spring框架整合springMVC时关于AOP无法切入的问题

    最开始springMVC的配置为: spring的配置为: 分析可知道spring的配置正确,由于在springmvc中已经扫描了@Controller相关的注解,所以就不需要再次扫描了,由于spri ...

  2. 关于AOP无法切入同类调用方法的问题

    一.前言 Spring AOP在使用过程中需要注意一些问题,也就是平时我们说的陷阱,这些陷阱的出现是由于Spring AOP的实现方式造成的.每一样技术都或多或少有它的局限性,很难称得上完美,只要掌握 ...

  3. Spring学习之Spring中AOP方式切入声明式事务

    mybatis-spring官方文档说明 一个使用 MyBatis-Spring 的其中一个主要原因是它允许 MyBatis 参与到 Spring 的事务管理中.而不是给 MyBatis 创建一个新的 ...

  4. Spring系列之AOP

    一.什么是AOPAOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引 ...

  5. Spring AOP 深入剖析

    AOP是Spring提供的关键特性之一.AOP即面向切面编程,是OOP编程的有效补充.使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统.从而避免了在业务逻 ...

  6. Spring AOP 实现功能权限校验功能

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 使用拦截器实现未登录时跳转到登录界面的功能 1 拦截器SecurityInterceptor 2spring-mvcxml拦 ...

  7. OOP的完美点缀—AOP之SpringAOP实现原理

    OOP的完美点缀-AOP之SpringAOP实现原理 前言 OOP与AOP OOP(Object Oriented Programming,面向对象编程),通过封装.继承将程序抽象为各个层次的对象,进 ...

  8. spring aop + xmemcached 配置service层缓存策略

    Memcached 作用与使用 基本介绍 1,对于缓存的存取方式,简言之,就是以键值对的形式将数据保存在内存中.在日常业务中涉及的操作无非就是增删改查.加入缓存机制后,查询的时候,对数据进行缓存,增删 ...

  9. 面试题思考:解释一下什么叫AOP(面向切面编程)

    这种在运行时,动态地将代码切入到类的指定方法.指定位置上的编程思想就是面向切面的编程. AOP是Spring提供的关键特性之一.AOP即面向切面编程,是OOP编程的有效补充. 使用AOP技术,可以将一 ...

随机推荐

  1. 利用ArcEngine开发地图发布服务,将mxd文档一键发布成wmts,并根据需要对地图进行空间查询,返回客户端geojson

    一直想开发一个软件取代ArcGIS Server,该软件使用ArcEngine开发,以Windows Service形式发布,部署在服务端上,解决wmts地图服务发布和空间查询的问题,经过不断的研究. ...

  2. 「NOI2019」序列

    NKOJ卡常卡不过QAQ description 给两个A,B序列,让你分别在A,B中各选k个数,其中至少有L对下标相等. Solution 把问题转化为至多选n-K对下标不同的对. 配对问题就用费用 ...

  3. 【Python - pip source】工欲善其事,必先利其器 - 不要让 pip install timeout 成为你的烦恼

    目录 前言 一.原因 二.解决方法 2.1 思路 2.2 国内镜像源列举 2.3 具体解决过程 2.3.1 方法一:命令行(推荐) 2.3.2 方法二:创建文件 总结 前言 解决pip install ...

  4. Eclipse For Java开发环境部署

    Eclipse For Java开发环境部署 1.准备工作 jdk安装包 jdk官网下载 Eclipse安装包 Eclipse官网下载 Eclipse下载时选择图中所示的国内镜像地址下载 下载后的文件 ...

  5. 线程崩溃为什么不会导致 JVM 崩溃

    大家好,我是坤哥 网上看到一个很有意思的据说是美团的面试题:为什么线程崩溃崩溃不会导致 JVM 崩溃,这个问题我看了不少回答,但都没答到根本原因,所以决定答一答,相信大家看完肯定会有收获,本文分以下几 ...

  6. Oracle账户被锁(the account is locked)

    问题: 安装好Oracle之后用scott登录报错:ERROR:ORA-28000:the account is locked 解决方案: Win+R打开命令行输入:sqlplus 使用system账 ...

  7. call apply bind的作用及区别? 应用场景?

    call.apply.bind方法的作用和区别: 这三个方法的作用都是改变函数的执行上下文,换句话说就是改变函数体内部的this指向,以此来扩充函数依赖的作用域 1.call 作用:用于改变方法内部的 ...

  8. 你真的很了解printf函数吗?

    对C语言中经常使用的printf这个库函数,你是否真的吃透了呢? 系统化的学习C语言程序设计,是不是看过一两本C语言方面的经典著作就足够了呢?答案是显而易见的:不够.通过这种典型的入门级的学习方式,是 ...

  9. 实现领域驱动设计 - 使用ABP框架 - 什么是领域驱动设计?

    前言: 最近看到ABP官网的一本电子书,感觉写的很好,翻译出来,一起学习下 (Implementing Domain Driven Design) https://abp.io/books DDD简介 ...

  10. ssm框架layui分页下标中文乱码,或者请选择中文乱码,提示乱码等

    开始我以为是layui的bug 后来发现不是 用过的方法: 1.修改layui的js文件  将其中的中文变为encdoe 代码 比如laypage.js下的中文 2.添加web.xml的过滤器 该代码 ...