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. uni-app 中实现 onLaunch 异步回调后执行 onLoad 最佳实践

    前言 好久没写博客了,由于公司业务需要,最近接触uiapp比较多,一直想着输出一些相关的文章.正好最近时间富余,有机会来一波输出了. 问题描述 在使用 uni-app 开发项目时,会遇到需要在 onL ...

  2. 计算机网络 - HTTP和HTTPS的区别

    计算机网络 - HTTP和HTTPS的区别 http所有传输的内容都是明文,并且客户端和服务器端都无法验证对方的身份. https具有安全性的ssl加密传输协议,加密采用对称加密. https协议需要 ...

  3. 使用pip安装库或执行pip命令时报错解决方案

    初次安装pip后执行安装升级一般不会有问题,但是国外的镜像源下载升级由于网速过慢会进行报错,提示需要升级 pip 或者下载速度很慢最后直接报了错如下图: 这个时候只需要修改镜像源即可,建议修改为永久镜 ...

  4. 5. Docker compose

    把上图添加路径后,改成下图: 上图之后需要source /etc/profile #此命令重新加载环境变量文件. 在任意目录下输入docker-compose测试下,docker-compose是否安 ...

  5. 2021.03.13【NOIP提高A&B组】模拟 总结

    T1 题目大意:从原点开始循环执行命令,问最后的位置 好吧这就是一道幼儿园的周期问题,模拟即可 #include<bits/stdc++.h> using namespace std; c ...

  6. 云原生存储解决方案Rook-Ceph与Rainbond结合的实践

    基础不牢,地动山摇.无论是何种体系架构,底层存储的选择都是一个值得探讨的话题.存储承载着业务的数据,其性能直接影响到业务应用的实际表现.也正因为存储和业务的数据关联紧密,其可靠性也必须得到关注,存储的 ...

  7. BUUCTF-小明的保险箱

    小明的保险箱 16进制打开可以发现存在一个RAR压缩包,压缩包里面应该就是flag文本 使用ARCHPR破解即可

  8. 方法重载、方法重写、四种权限修饰、JavaBean、代码块

    方法重载(overload) 一个类中可以含有多个重名的方法. 两同一不同 ①同一个类 ②同一个方法名 ③不同参数列表:参数个数不同,参数类型不同 方法重写(override) ①子类重写的方法的修饰 ...

  9. Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍

    大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第三篇了,先来回顾下前面两篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...

  10. UiPath鼠标操作元素的介绍和使用

    一.鼠标(mouse)操作的介绍 模拟用户使用鼠标操作的一种行为,例如单击,双击,悬浮.根据作用对象的不同我们可以分为对元素的操作.对文本的操作和对图像的操作 二.鼠标对元素的操作在UiPath中的使 ...