注解方式实现aop我们主要分为如下几个步骤:
  1.在切面类(为切点服务的类)前用@Aspect注释修饰,声明为一个切面类。
  2.用@Pointcut注释声明一个切点,目的是为了告诉切面,谁是它的服务对象。(此注释修饰的方法的方法体为空,不需要写功能比如 public void say(){};就可以了,方法名可以被候命的具体服务功能所以引用,它可以被理解为切点对象的一个代理对象方法)
  3.在对应的方法前用对应的通知类型注释修饰,将对应的方法声明称一个切面功能,为了切点而服务
  4.在spring配置文件中开启aop注释自动代理。如:<aop:aspectj-autoproxy/>

通知注解类型如下:

切点方法:

package aopdemo;import org.springframework.stereotype.Component;/*** @author coco.xu* @Date 2019-03-25*/
@Component("sayName")
public class SayName {public void saying() {System.out.println("我是coco...(切点方法)");}
}

切面类:

package aopdemo;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;/*** @author coco.xu* @Date 2019-03-25*//*** 注解方式声明aop* 1.用@Aspect注解将类声明为切面(如果用@Component("")注解注释为一个bean对象,那么就要在spring配置文件中开启注解扫描,* <context:component-scan base-package="aopdemo"/>* 否则要在spring配置文件中声明一个bean对象) * 2.在切面需要实现相应方法的前面加上相应的注释,也就是通知类型。* 3.此处有环绕通知,环绕通知方法一定要有ProceedingJoinPoint类型的参数传入,然后执行对应的proceed()方法,环绕才能实现。*/
@Component("annotationTest")
@Aspect
public class AnnotationTest {// 定义切点@Pointcut("execution(* *.saying(..))")public void sayings() {}/*** 前置通知(注解中的sayings()方法,其实就是上面定义pointcut切点注解所修饰的方法名,那只是个代理对象,不需要写具体方法,* 相当于xml声明切面的id名,如下,相当于id="embark",用于供其他通知类型引用)* <aop:config> <aop:aspect ref="mistrel"> <!-- 定义切点 -->* <aop:pointcut expression="execution(* *.saying(..))" id="embark"/> <!--* 声明前置通知 (在切点方法被执行前调用) -->* <aop:before method="beforSay" pointcut-ref="embark"/> <!-- 声明后置通知* (在切点方法被执行后调用) -->* <aop:after method="afterSay" pointcut-ref="embark"/> </aop:aspect>* </aop:config>*/@Before("sayings()")public void sayHello() {System.out.println("注解类型前置通知");}// 后置通知@After("sayings()")public void sayGoodbey() {System.out.println("注解类型后置通知");}// 环绕通知。注意要有ProceedingJoinPoint参数传入。@Around("sayings()")public void sayAround(ProceedingJoinPoint pjp) throws Throwable {System.out.println("注解类型环绕通知..环绕前");pjp.proceed();// 执行方法System.out.println("注解类型环绕通知..环绕后");}
}

Spring配置文件:

<?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:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"><!-- 开启注解扫描 --><context:component-scan base-package="aopdemo"/><!-- 开启aop注解方式,此步骤不能少,这样java类中的aop注解才会生效 --><aop:aspectj-autoproxy/>
</beans>

测试类:

package aopdemo;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** * @author coco.xu* @Date 2019-03-25*/
public class AopTest {public static void main(String[] args) {ApplicationContext ac = new ClassPathXmlApplicationContext("aopdemo/beans.xml");SayName sn = (SayName) ac.getBean("sayName");sn.saying();}
}

执行测试类,执行结果如下:

转载于:https://www.cnblogs.com/cocoxu1992/p/10593154.html

Spring中AOP切面编程学习笔记相关推荐

  1. SpringAop篇 (2) Spring中的切面编程技术 AspectJ

    介绍 : AOP(Aspect Orient Programming) 既为面向切面编程. 它可以说是OOP编程的一种扩展与补充,可以较为友好的处理不同模块之间具有横向相关性质的一类问题,比如日志管理 ...

  2. 项目中如何体现Spring中的切面编程

    面向切面编程:主要是横切一个关注点,将一个关注点模块化成一个切面.在切面上声明一个通知(advice)和切入点(Pointcut);通知:是指在切面的某个特定的连接点(代表一个方法的执行.通过声明一个 ...

  3. Spring AOP——Spring 中面向切面编程

    前面两篇文章记录了 Spring IOC 的相关知识,本文记录 Spring 中的另一特性 AOP 相关知识. 部分参考资料: <Spring实战(第4版)> <轻量级 JavaEE ...

  4. Spring WebFlux 响应式编程学习笔记(一)

    各位Javaer们,大家都在用SpringMVC吧?当我们不亦乐乎的用着SpringMVC框架的时候,Spring5.x又悄(da)无(zhang)声(qi)息(gu)的推出了Spring WebFl ...

  5. Spring的AOP切面编程

    语言苍白无力,我们直接代码说话 package com.example.demo.aspect; import org.springframework.stereotype.Component; @C ...

  6. python中documentelement_python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)...

    xml.dom篇 DOM是Document Object Model的简称,XML 文档的高级树型表示.该模型并非只针对 Python,而是一种普通XML 模型.Python 的 DOM 包是基于 S ...

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

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

  8. Spring中的AOP切面编程的三种实现方式

    文章目录 Spring中的AOP切面编程的三种实现方式 1.最基本AOP的实现 a.引入jar包 b.编写通知类,这里以后置通知和环绕通知类为例子进行说明 c.在SpringIOC容器中配置 d.测试 ...

  9. 【Spring】面向切面编程AOP

    AOP基础 什么是AOP [废话解释]在软件业,AOP全称Aspect Oriented Programming 即:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AO ...

最新文章

  1. Nginx学习之五:Nginx第三方模块
  2. 银行营业网点管理系统——Servlet包(CityAreaServlet )
  3. UVALive 6044(双连通分量的应用)
  4. vs编译c语言停止工作运行库mt,vc++编译时运行库选择(/MT/MTd/MD/MDd)
  5. c++exe程序在别人电脑上双击无法打开_你可能不知道的电脑软件打开方式总结!
  6. 聚合矩阵+中心化处理
  7. H265框架编码流程(一)
  8. 【渝粤教育】国家开放大学2018年春季 0008-22T简明现代汉语 参考试题
  9. zookeeper中ExpiryQueue详解
  10. 【js高级程序设计】迭代器
  11. 三菱PLC通用快捷键
  12. windows10安装adb/fastboot教程
  13. linux系统怎么关闭445端口,如何关闭window 系统的445端口等方法 预防勒索病毒
  14. MySQL的字符集和校对规则,你都会了吗?
  15. Composer学习
  16. /,./和../的区别
  17. ccf 202012-3 带配额的文件系统(大模拟)
  18. Redis教程–事务机制基本介绍
  19. JRTPLIB使用实例
  20. 数据挖掘——机器学习

热门文章

  1. Java 进阶——单例模式
  2. Linux 系统应用编程——网络编程(常用命令解析)
  3. jupyter notebook
  4. SAFEARRAY使用方法示例
  5. [Linux C]列出指定目录下的所有文件(夹)
  6. Pro*c使用滚动游标进行更新或删除游标行
  7. Taro+react开发(31)同样的数据可以数组遍历
  8. Taro+react开发(27)别加view
  9. Taro+react开发(5)--tora项目开发安装
  10. [html] 说下你对组件、模块、元素的理解,它们的区别在哪里?