如何配置,以及相关知识

引入相关包:

  1. <properties>
  2. <spring.version>3.0.5.RELEASE</spring.version>
  3. <aspectj.version>1.6.11</aspectj.version>
  4. </properties>
  5. <dependencies>
  6. <dependency>
  7. <groupId>org.springframework</groupId>
  8. <artifactId>spring-core</artifactId>
  9. <version>${spring.version}</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework</groupId>
  13. <artifactId>spring-context</artifactId>
  14. <version>${spring.version}</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.springframework</groupId>
  18. <artifactId>spring-aop</artifactId>
  19. <version>${spring.version}</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.aspectj</groupId>
  23. <artifactId>aspectjrt</artifactId>
  24. <version>${aspectj.version}</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.aspectj</groupId>
  28. <artifactId>aspectjweaver</artifactId>
  29. <version>${aspectj.version}</version>
  30. </dependency>
  31. <dependency>
  32. <groupId>cglib</groupId>
  33. <artifactId>cglib</artifactId>
  34. <version>3.1</version>
  35. </dependency>
  36. </dependencies>

在Spring配置文件开启注解、AspectJ支持、扫描基础包:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context-3.0.xsd
  10. http://www.springframework.org/schema/aop
  11. http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
  12. <!-- 开启注解 -->
  13. <context:annotation-config/>
  14. <!-- AspectJ支持 -->
  15. <aop:aspectj-autoproxy />
  16. <!-- 扫描基础包 -->
  17. <context:component-scan base-package="com.nicchagil.springaop" />
  18. </beans>

写两个测试的Service:

  1. package com.nicchagil.springaop;
  2. import org.springframework.stereotype.Service;
  3. @Service
  4. public class UserService {
  5. public void query(Integer id) {
  6. System.out.println("UserService.query()...");
  7. }
  8. }
  1. package com.nicchagil.springaop;
  2. import org.springframework.stereotype.Service;
  3. @Service
  4. public class FunctionService {
  5. public void query() {
  6. System.out.println("FunctionService.query()...");
  7. }
  8. }

切面的信息:

  1. package com.nicchagil.springaop;
  2. import java.util.Arrays;
  3. import org.aspectj.lang.JoinPoint;
  4. import org.aspectj.lang.annotation.AfterReturning;
  5. import org.aspectj.lang.annotation.AfterThrowing;
  6. import org.aspectj.lang.annotation.Aspect;
  7. import org.aspectj.lang.annotation.Before;
  8. import org.aspectj.lang.annotation.Pointcut;
  9. import org.springframework.stereotype.Component;
  10. @Aspect
  11. @Component
  12. public class MyAOP {
  13. @Pointcut("execution(* com.nicchagil.springaop.*Service.query(..))")
  14. public void myPointcut() {
  15. }
  16. @Before("myPointcut()")
  17. public void myBefore(JoinPoint joinPoint) {
  18. Object[] args = joinPoint.getArgs(); // 入参
  19. System.out.println("Before. Args : " + Arrays.toString(args));
  20. }
  21. @AfterReturning("myPointcut()")
  22. public void myAfterReturning() {
  23. System.out.println("AfterReturning.");
  24. }
  25. @AfterThrowing("myPointcut()")
  26. public void myAfterThrowing() {
  27. System.out.println("AfterThrowing.");
  28. }
  29. }

下图可帮助理解通知(Advice)、切点(PointCut)、切面(Aspect)、织入(Weaving)各大术语:

入口类:

  1. package com.nicchagil.springaop;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class HowToUse {
  5. public static void main(String[] args) {
  6. ApplicationContext context =
  7. new ClassPathXmlApplicationContext("spring.xml");
  8. UserService us = context.getBean("userService", UserService.class);
  9. us.query(100);
  10. FunctionService fs = context.getBean("functionService", FunctionService.class);
  11. fs.query();
  12. }
  13. }

日志:

  1. Before. Args : [100]
  2. UserService.query()...
  3. AfterReturning.
  4. Before. Args : []
  5. FunctionService.query()...
  6. AfterReturning.

常用的AOP

添加AOP:

  1. package com.nicchagil.exercise.springbootexercise.aop;
  2. import java.lang.reflect.Method;
  3. import org.aspectj.lang.JoinPoint;
  4. import org.aspectj.lang.ProceedingJoinPoint;
  5. import org.aspectj.lang.annotation.AfterReturning;
  6. import org.aspectj.lang.annotation.AfterThrowing;
  7. import org.aspectj.lang.annotation.Around;
  8. import org.aspectj.lang.annotation.Aspect;
  9. import org.aspectj.lang.annotation.Before;
  10. import org.aspectj.lang.annotation.Pointcut;
  11. import org.aspectj.lang.reflect.MethodSignature;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.context.annotation.Configuration;
  15. @Aspect
  16. @Configuration
  17. public class AopExample {
  18. private Logger logger = LoggerFactory.getLogger(this.getClass());
  19. @Pointcut("execution(* com.nicchagil.exercise.springbootexercise.service..*.*(..))")
  20. public void serviceAllMethodPointcut() {
  21. }
  22. @Around("serviceAllMethodPointcut()")
  23. public Object myAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
  24. /* 获取常用的对象 */
  25. Object targetObject = proceedingJoinPoint.getThis(); // 目标对象
  26. Object[] args = proceedingJoinPoint.getArgs(); // 入参
  27. Method method = ((MethodSignature) proceedingJoinPoint.getSignature()).getMethod(); // 方法对象
  28. this.logger.info("@Around targetObject : {}, args : {}, method : {}", targetObject, args, method);
  29. Object result = proceedingJoinPoint.proceed(); // 执行被拦截的代码
  30. this.logger.info("@Around result : {}", result);
  31. return result; // 记得返回
  32. }
  33. @Before("serviceAllMethodPointcut()")
  34. public void myBefore(JoinPoint joinPoint) {
  35. /* 获取常用的对象 */
  36. Object targetObject = joinPoint.getThis(); // 目标对象
  37. Object[] args = joinPoint.getArgs(); // 入参
  38. Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); // 方法对象
  39. this.logger.info("@Before targetObject : {}, args : {}, method : {}", targetObject, args, method);
  40. }
  41. @AfterReturning(value = "serviceAllMethodPointcut()", returning = "returningObject")
  42. public void myAfterReturning(JoinPoint joinPoint, Object returningObject) {
  43. /* 获取常用的对象 */
  44. Object targetObject = joinPoint.getThis(); // 目标对象
  45. Object[] args = joinPoint.getArgs(); // 入参
  46. Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); // 方法对象
  47. this.logger.info("@AfterReturning targetObject : {}, args : {}, method : {}, returningObject : {}",
  48. targetObject, args, method, returningObject);
  49. }
  50. @AfterThrowing(value = "serviceAllMethodPointcut()", throwing="throwable")
  51. public void myAfterThrowing(JoinPoint joinPoint, Throwable throwable) {
  52. /* 获取常用的对象 */
  53. Object targetObject = joinPoint.getThis(); // 目标对象
  54. Object[] args = joinPoint.getArgs(); // 入参
  55. Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); // 方法对象
  56. this.logger.info("@AfterThrowing targetObject : {}, args : {}, method : {}, throwable : {}",
  57. targetObject, args, method, throwable);
  58. }
  59. }

日志打印(异常的情况就没演示了):

  1. 2018-01-06 10:34:13.207 INFO 7176 --- [ main] Example$$EnhancerBySpringCGLIB$$ed744e46 : @Around targetObject : com.nicchagil.exercise.springbootexercise.service.UserService@67b100fe, args : [1], method : public com.nicchagil.exercise.springbootexercise.mapper.entity.User com.nicchagil.exercise.springbootexercise.service.UserService.selectByPrimaryKey(java.lang.Long)
  2. 2018-01-06 10:34:13.223 INFO 7176 --- [ main] Example$$EnhancerBySpringCGLIB$$ed744e46 : @Before targetObject : com.nicchagil.exercise.springbootexercise.service.UserService@67b100fe, args : [1], method : public com.nicchagil.exercise.springbootexercise.mapper.entity.User com.nicchagil.exercise.springbootexercise.service.UserService.selectByPrimaryKey(java.lang.Long)
  3. 2018-01-06 10:34:13.582 INFO 7176 --- [ main] Example$$EnhancerBySpringCGLIB$$ed744e46 : @Around result : User [id=1, name=Nick Huang, age=20, createTime=Sat Nov 25 00:00:00 CST 2017]
  4. 2018-01-06 10:34:13.582 INFO 7176 --- [ main] Example$$EnhancerBySpringCGLIB$$ed744e46 : @AfterReturning targetObject : com.nicchagil.exercise.springbootexercise.service.UserService@67b100fe, args : [1], method : public com.nicchagil.exercise.springbootexercise.mapper.entity.User com.nicchagil.exercise.springbootexercise.service.UserService.selectByPrimaryKey(java.lang.Long), returningObject : User [id=1, name=Nick Huang, age=20, createTime=Sat Nov 25 00:00:00 CST 2017]

【Spring】简单的Spring AOP注解示例的更多相关文章

  1. Spring第三天——AOP注解实现与事务管理

    大致内容: aspectJ的aop操作(基于注解,对比day02配置操作)(会用) *jdbcTemplate操作(实现CRUD) *spring配置连接池 *spring事务管理 一.AspectJ ...

  2. 【译】Spring 4 @PropertySource和@Value注解示例

    前言 译文链接:http://websystique.com/spring/spring-propertysource-value-annotations-example/ 本篇文章将展示如何通过@P ...

  3. Spring AOP注解形式简单实现

    实现步骤: 1:导入类扫描的注解解析器 命名空间:xmlns:context="http://www.springframework.org/schema/context" xsi ...

  4. 简单理解Spring之IOC和AOP及代码示例

    Spring是一个开源框架,主要实现两件事,IOC(控制反转)和AOP(面向切面编程). IOC 控制反转,也可以称为依赖倒置. 所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B, ...

  5. JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP、IOC)

    接上篇<JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构.调试.部署>,通过一个简单的JSP WEB网站了解了JAVA WEB相关的知识,比如:Ser ...

  6. Spring AOP—注解配置方法的使用

    Spring除了支持Schema方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明. 1 启用对@AspectJ的支持 Spring默认不支持@AspectJ风格的切面声明,为了支持需 ...

  7. 【译】Spring 4 @Profile注解示例

    前言 译文链接:http://websystique.com/spring/spring-profile-example/ 本文将探索Spring中的@Profile注解,可以实现不同环境(开发.测试 ...

  8. Spring详解(六)------AOP 注解

    上一篇博客我们讲解了 AspectJ 框架如何实现 AOP,然后具体的实现方式我们是通过 xml 来进行配置的.xml 方式思路清晰,便于理解,但是书写过于麻烦.这篇博客我们将用 注解 的方式来进行 ...

  9. Spring框架-IOC和AOP简单总结

    参考博客: https://blog.csdn.net/qq_22583741/article/details/79589910 1.Spring框架是什么,为什么,怎么用 1.1 Spring框架是 ...

随机推荐

  1. DWR实现扫一扫登录功能

    前言 <DWR实现后台推送消息到Web页面>一文中已对DWR作了简介,并列出了集成步骤.本文中再一次使用到DWR,用以实现扫一扫登录功能. 业务场景 web端首页点击"登陆&qu ...

  2. ftp应用

    ftp的基本应用: 下载easyfzs ftp,仿真模拟ftp服务器. 类库: using System; using System.Collections.Generic; using System ...

  3. magento模板文件结构详解

    来自: 南国佳木(茶者,南方之嘉木也.) 2015-09-01 23:14:43 模板文件主要分为xml布局文件和html文件 Layout(布局)文件夹存放的是此模板的.xml文件(也就是模版的结构 ...

  4. 用python实现计算1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))类似的公式计算

    作业需求: 开发一个简单的python计算器 1.实现加减乘除及拓号优先级解析 2.用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 ...

  5. jquery选择器和基本语句

    $("#aa"); //根据ID找 $(".aa"); //根据class找 $("div"); //根据标签名找 $("[id= ...

  6. winserver2008 management note

    1,磁盘online及介质保护 Windows server 2008 增加的磁盘无法初始化-提示:介质受写入保护.插了下相关说明,在VMware的帖子找到了解决办法: 开始-运行,cmd.打开命令提 ...

  7. jsp页面传参大汇总-转帖收藏

    http://blog.csdn.net/ssy_shandong/article/details/9328985/

  8. windows远程控制ubuntu---基于ssh

    要实现windows下连接ubuntu需要安装以下软件: 1. windows下安装winSCP 2. Ubuntu下安装OpenSSH Server 可以使用命令行安装openSSH Server: ...

  9. Css定位之absolute_慕课网课程笔记

    absolute和float 绝对定位和浮动有相似之处,即都有破坏性和包裹性,破坏性是指其会导致包裹自身的复原塌陷,包裹性是float的天赋技能,对于绝对定位来说,其会包括子元素 越独立越强大 1.去 ...

  10. ElasticSearch作为Windows服务启动

           由于公司服务器用的Windows服务器,所以你懂得…… 直接下载elasticsearch中文发行版.下载地址是:https://github.com/medcl/elasticsear ...