Spring的AOP的注解开发,基于AspectJ的注解开发
发布日期:2021-06-29 15:02:16 浏览次数:2 分类:技术文章

本文共 4337 字,大约阅读时间需要 14 分钟。

一、Spring的基于ApsectJ的注解的AOP开发

1、创建项目引入jar

(1)引入spring开发的jar

在这里插入图片描述

(2)引入spring开发的配置文件
  • 在src下创建applicationContext.xml
(3)编写目标类和配置目标类

将两个类交给Spring管理,然后在增强类当中设置识别切面类的注解,和将增强类当中方法设置为前置增强方法,并设置路径规定对应增强的是那个类的方法

  • 编写目标类
package com.itzheng.spring.demo1;public class OrderDao {
public void save() {
System.out.println("保存订单。。。。。。"); } public void update() {
System.out.println("修改订单。。。。。。"); } public void delete() {
System.out.println("删除订单。。。。。。"); } public void find() {
System.out.println("查询订单。。。。。。"); }}
  • 配置目标类在applicationContext.xml当中
    在这里插入图片描述
(4)编写切面类并配置
  • 编写切面类
package com.itzheng.spring.demo1;/* - 切面类:注解的切面类 */public class MyAspectAnno {
public void before() {
System.out.println("前置增强=========="); }}
  • 配置切面类
    在这里插入图片描述
(5)使用注解的AOP对象目标类进行前置增强
  • 在applicationContext配置文件当中打开注解的AOP开发(自动产生代理)。
    在这里插入图片描述
  • 在切面类上使用注解@Aspect后Spring就会把这个修饰的类,识别为切面类。
  • 前置增强,在切面类当中的方法上用@Before注解修饰,并设置对应的路径的方法,表示在这个路径上的方法上设置当前方法为前置增强的方法。
package com.itzheng.spring.demo1;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;/* - 切面类:注解的切面类 */@Aspectpublic class MyAspectAnno {
@Before(value = "execution(* com.itzheng.spring.demo1.OrderDao.save(..))") public void before() {
System.out.println("前置增强=========="); }}
(6)编写测试类
package com.itzheng.spring.demo1;import javax.annotation.Resource;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;/* - Spring的AOP的注解开发 */@RunWith(SpringJUnit4ClassRunner.class) // 引入Spring整合单元测试@ContextConfiguration("classpath:applicationContext.xml") // 加载配置文件public class SpringDemo1 {
@Resource(name = "orderDao")//注入对象 private OrderDao orderDao; @Test public void demo1() {
orderDao.save(); orderDao.update(); orderDao.delete(); orderDao.find(); }}

在这里插入图片描述

二、Spring的注解订单AOP的通知类型以及使用

1、@Before:前置通知(前置增强):在目标方法执行前实现

上面的案例就是前置增强

2、@AfterReturning:后置通知(后置增强):在目标方法执行后执行

  • (1)在MyAspectAnno类当中创建后置增强的方法:并设置注解:@AfterReturning(value = "execution(* com.itzheng.spring.demo1.OrderDao.delete(..))")
//后置通知	@AfterReturning(value = "execution(* com.itzheng.spring.demo1.OrderDao.delete(..))")	public void afterReturning() {
System.out.println("后置增强=========="); }
  • 运行测试方法
    在这里插入图片描述
  • (1)在MyAspectAnno类当中创建后置增强的方法:得到返回值
  • 修改OrderDao类当中delete方法
public String delete() {
System.out.println("删除订单。。。。。。"); return "删除成功";}
  • (2)在MyAspectAnno当中修改后置通知的方法:在@AfterReturning当中设置returning = “result”)其中result必须和afterReturning方法的参数Object result名称相同
//后置通知	@AfterReturning(value = "execution(* com.itzheng.spring.demo1.OrderDao.delete(..))",returning = "result")	public void afterReturning(Object result) {
System.out.println("后置增强=========="+result); }
  • 测试方法
    在这里插入图片描述

3、@Around:环绕通知(环绕增强)

  • 在MyAspectAnno类当中创建around方法并在方法上设置ProceedingJoinPoint链接点参数,通过连接点joinPoint.proceed()执行@Around注解对应的方法
//环绕通知	@Around(value = "execution(* com.itzheng.spring.demo1.OrderDao.update(..))")	public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
//ProceedingJoinPoint链接点 System.out.println("环绕前增强=========="); Object object = joinPoint.proceed();//执行目标方法 System.out.println("环绕后增强=========="); return object; }
  • 执行测试方法
    在这里插入图片描述

3、AfterThrowing:异常抛出通知(异常抛出增强)

(1)异常抛出增强案例(不捕获异常)
  • 在MyAspectAnno类当中创建afterThrowing方法并设置@AfterThrowing注解设置对应路径方法
//异常抛出通知	@AfterThrowing(value = "execution(* com.itzheng.spring.demo1.OrderDao.find(..))")	public void afterThrowing() {
System.out.println("异常抛出通知======="); }
  • 修改OrderDao类当中的find方法设置异常
public void find() {
int i = 1/0; System.out.println("查询订单。。。。。。"); }
  • 测试
    在这里插入图片描述
(2)异常抛出增强案例(捕获异常)
  • 在MyAspectAnno类当中@AfterReturning注解上设置throwing = "e"属性
//异常抛出通知	@AfterThrowing(value = "execution(* com.itzheng.spring.demo1.OrderDao.find(..))",throwing = "e")	public void afterThrowing(Throwable e) {
System.out.println("异常抛出通知======="+e); }
  • 测试并捕获异常
    在这里插入图片描述

4、After :最终通知(最终增强)

  • 在MyAspectAnno类当中创建after方法,设置@After注解在目标类的find方法
//最终通知	@After(value = "execution(* com.itzheng.spring.demo1.OrderDao.find(..))")	public void after() {
System.out.println("最终通知======================"); }
  • 在有异常的情况下也会执行
    在这里插入图片描述

三、Spring的AOP的注解的切入点的注解

1、创建MyAspectAnno类当中创建切入点注解以及对应的方法:Pointcut

//配置切入点注解	@Pointcut(value="execution(* com.itzheng.spring.demo1.OrderDao.find(..))")	private void printcut1() {
}

2、在其他方法上使用@Pointcut当中路径对应的目标方法的路径

  • 当前类名称.@Pointcut修饰切入点地方方法
    在这里插入图片描述
  • 测试正常运行
    在这里插入图片描述
  • 注意当实习类没有使用接口Spring的底层的动态代理使用的是
    在这里插入图片描述
    在这里插入图片描述

转载地址:https://code100.blog.csdn.net/article/details/107227344 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Spring的JDBC的模板的使用(案例+解析)
下一篇:Spring的切入点AspectJ表达式(解析)

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月26日 19时37分20秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章