上一章我们已经学过使用XML的方式实现AOP:
https://blog.csdn.net/qq_34598667/article/details/83502426
本章我们学习一下使用注解的方式实现AOP


Spring使用注解的方式实现AOP的开发


本章所需知识点

1、开启aop注解的自动代理

< aop:aspectj-autoproxy/>

2、 AspectJ的AOP的注解:

  • @Aspect:定义切面类的注解
  • 通知类型:
    @Before:前置通知
    @AfterReturing:后置通知
    @Around:环绕通知
    @After:最终通知
    @AfterThrowing:异常抛出通知.
  • @Pointcut:定义切入点的注解

3、切入点语法表达式(与xml方式一样)

语法:execution(表达式)
表达式语法:[方法访问修饰符] 方法返回值包名.类名.方法名(方法的参数)

例1:
execution (* com.oak.service.impl.UserServiceImpl.*(…)) :匹配UserServiceImpl类中声明的所有方法。
第一个 * :代表任意修饰符及任意返回值类型
第二个 * :代表任意方法,
… :匹配任意数量任意类型的参数,若目标类与该切面在同一个包中,可以省略包名。

例2:execution public double cn.itcast.service.impl.PersonServiceImpl.*(…):匹配PersonServiceImpl类中返回值类型为double类型的所有公有方法。


实现案例

本章案例基于上一章使用xml的方式实现AOP的项目上继续完成:

1)编写目标类

创建接口InfoService
public interface InfoService {void save(); void update(); void delete(); void find();
}
创建实现类InfoServiceImpl
public class InfoServiceImpl implements InfoService{@Overridepublic void save() {System.out.println("I am the method for save ");}@Overridepublic void update() {System.out.println("I am the method for update ");}@Overridepublic void delete() {System.out.println("I am the method for delete ");}@Overridepublic void find() {System.out.println("I am the method for find ");}
}

2)配置目标类

<!--配置目标类 -->
<bean id="infoService" class="com.oak.service.InfoServiceImpl"></bean>

3)开启aop自动代理

<!--配置目标类 -->
<bean id="infoService" class="com.oak.service.InfoServiceImpl"></bean>
<!-- 开启aop的自动代理 -->
<aop:aspectj-autoproxy/>

4)编写切面类MyAspectAnno

声明切入点和通知方法


@Aspect
public class MyAspectAnno {//声明一个切入点,anyMethod为切入点名称,指定切入点,哪些方法需要通知@Pointcut("execution (* com.oak.service.InfoService.*(..))")private void anyMethod(){}//声明该方法是一个前置通知:在目标方法开始之前执行 @Before("anyMethod()")public void doBeforeCheck() {System.out.println("前置通知");}
}

5)配置切面类

<!--配置切面类-->
<bean id="myAspectAnno" class="com.oak.aop.MyAspectAnno"></bean>

6)测试

在测试类中编写测试方法

@Test
public void aopAnnoTest(){ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext.xml");InfoService infoService=cxt.getBean("infoService",InfoService.class);infoService.save();
}

测试结果是:

前置通知
I am the method for save

7)其他通知

修改切面类,使用注解加上其他通知

@Aspect
public class MyAspectAnno {//声明一个切入点,anyMethod为切入点名称,指定切入点,哪些方法需要通知@Pointcut("execution (* com.oak.service.InfoService.*(..))")private void anyMethod(){}//声明该方法是一个前置通知:在目标方法开始之前执行 @Before("anyMethod()")public void doBeforeCheck() {System.out.println("前置通知");}@AfterReturning("anyMethod()")public void doAfterReturning() {System.out.println("后置通知");}@After("anyMethod()")public void doAfter() {System.out.println("最终通知");}@AfterThrowing("anyMethod()")public void doAfterThrowing() {System.out.println("异常通知");}@Around("anyMethod()")public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {/*** 环绕通知内部一定要确保执行该方法,如果不执行该方法,业务bean中被拦截的方法就不会被执行。* 当执行该方法,如果后面还有切面的话,它的执行顺序应该是这样的:先执行后面的切面,如果后面没有切面了,* 再执行最终的目标对象的业务方法。若不执行该方法,则后面的切面,业务bean的方法都不会被执行。*/// if () { // 判断用户是否有权限,System.out.println("进入方法");Object result = pjp.proceed();System.out.println("退出方法");// }return result;}
}

注意:环绕通知内部一定要确保执行proceed()该方法,如果不执行该方法,业务bean中被拦截的方法就不会被执行。当执行该方法,如果后面还有切面的话,它的执行顺序应该是这样的:先执行后面的切面,如果后面没有切面了,再执行最终的目标对象的业务方法。若不执行该方法,则后面的切面,业务bean的方法都不会被执行。

运行测试:

进入方法
前置通知
I am the method for save
退出方法
最终通知
后置通知

Spring使用注解的方式实现AOP的开发——Spring AOP(七)相关推荐

  1. Spring基于注解的方式一

    Spring基于注解的方式一 Spring注解简介 之前的时候我们学习的Spring都是基于Spring配置文件的形式来编写,现在很多的情况下使用SpringBoot的时候是基于注解的形式,这里我们首 ...

  2. Spring基于注解的方式二

    Spring基于注解二 上一次介绍了很多的关于spring的基本的注解,这篇文章描述一下关于Spring注解的基本的原理,从简单的例子入手 @Configuration @Import({Color. ...

  3. Spring使用注解的方式来实现简单的打印机功能,附完整代码,菜鸟教程

    上一篇写的是正常情况下的Spring实现打印机的功能,必须在applicationcontext.xml中实现依赖注入,还要在print 中实现set,get方法,比较麻烦. 为此,老师又讲了实现注解 ...

  4. spring boot 注解的方式写DSL 查询 @Query

    实现类: import org.springframework.data.domain.Pageable;// 不要query 直接写dsl ?0 ?1 参数 Pageable 分页 @Query(& ...

  5. Spring Boot入门系列(十八)整合mybatis,使用注解的方式实现增删改查

    之前介绍了Spring Boot 整合mybatis 使用xml配置的方式实现增删改查,还介绍了自定义mapper 实现复杂多表关联查询.虽然目前 mybatis 使用xml 配置的方式 已经极大减轻 ...

  6. Spring中注解大全

    Spring中注解大全 @Controller 标识一个该类是Spring MVC controller 处理器,用来创建处理http请求的对象 @Controller public class Te ...

  7. Spring注解@NonNull作用 Spring注解@Nullable作用 Spring NonNull 注解作用 Spring Nullable注解作用

    Spring注解@NonNull作用 Spring注解@Nullable作用 Spring NonNull 注解作用 Spring Nullable注解作用 一.概述 在看Spring源码的时候,经常 ...

  8. 第五章 Spring进阶-注解方式实现AOP(1)

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 徒弟:师傅,我 ...

  9. 面向切面(AOP)之Spring接口方式 schema配置方式 aspectj注解方式

    一.初识AOP   关于AOP的学习可以参看帮助文档:spring-3.2.0.M2\docs\reference\html目录下index.html的相关章节      1.AOP:Aspect-O ...

  10. (转)Spring使用AspectJ进行AOP的开发:注解方式

    http://blog.csdn.net/yerenyuan_pku/article/details/69790950 Spring使用AspectJ进行AOP的开发:注解方式 之前我已讲过Sprin ...

最新文章

  1. 姿态迁移CoCosNet v2
  2. 在vi里面实现字符串的批量替换
  3. 【loj#2524】【bzoj5303】 [Haoi2018]反色游戏(圆方树)
  4. Strange Optimization(扩展欧几里得)
  5. c语言怎么循环输入单个字符,c语言 帮我检查一下 输入一段文字,每行用回车结束,文字输入完毕可以使用某个特殊字符作为结束,...
  6. 前端学习(2612):vuex实现计算
  7. shell比较运算符
  8. oracel动态sql实例
  9. 4个空格 tab vetur_python学习的10个小技巧
  10. angular ts 表格_angular+ng-zorro路由、表格组件
  11. 基于JAVA+SpringMVC+MYSQL的苗木销售系统
  12. 用VB实现带图片的XP风格的按钮控件
  13. 递归:若函数包含了对其自身的调用,该函数为递归的。《Python核心编程》P305...
  14. Java并发编程实战-高屋建瓴
  15. 360篡改html文件打开方式,Chrome浏览器被360导航篡改怎么办
  16. win0如何查看计算机工作组,win10家庭版如何查看工作组计算机
  17. 安装错误 Package requirements (json-c) were not met: No package ‘json-c‘ found
  18. 这几excel操作技巧,每一个都是大神和菜鸟的分水岭!
  19. gsoap 调用 java_Qt5 + gSOAP 调用 Webservice
  20. LLBL Gen Pro 3.X 下使用 Template 模版绑定(一)

热门文章

  1. 实现一个定时任务管理器
  2. rsync linux 教程,rsync 用法教程
  3. svn sync主从同步学习
  4. NailTech 公司网站制作思路
  5. C#委托之个人理解(转)
  6. [转载] 财经郎眼20120526:山东首富挑战国家电网
  7. spring boot mail发送邮件异常解决
  8. mysql5.5.8安装图解_MySQL 5.5.8安装详细步骤-阿里云开发者社区
  9. 记录一次项目中代码大致优化方向
  10. 分布式文件存储FastDFS之安装Nginx实现文件访问