• 【从零开始学Spring笔记】AOP的注解开发


    大家可以关注作者的账号,关注从零开始学Spring笔记文集。也可以根据目录前往作者的博客园博客进行学习。本片文件将基于黑马程序员就业班视频进行学习以及资料的分享,并记录笔记和自己的看法。欢迎大家一起学习和讨论。

    【从零开始学Spring笔记】Spring学习路线

    创建项目测试

    第一步:创建web项目,引入jar包
    引入和AOP的XML开发同样的11个jar包

    可以在以前下载解压后的libs文件夹中寻找,同时也上传到百度云了,下载即可。下载链接在本系列文集的第一篇【从零开始学Spring笔记】Spring4学习路线中寻找。

    第二步:引入Spring的配置文件
    在 src下创建applicationContext.xml
    引入aop约束。
    约束:spring framework-4.2.4.RELEASEdocsspring framework-referencehtm|xsd-configuration.html


    观看本系列文集的【从零开始学Spring笔记】Spring配置,配置aop XML文件的提示。

    第三步:编写目标类并配置
    和之前一样,建立接口和实现类,并配置

    <!-- 配置目标对象:被增强的对象 -->
    	<bean id = "productDao" class="com.tyust.spring.demo2.ProductDaoImpl"></bean>
    

    第四步:编写一个切面类,并交给Spring

    package com.tyust.spring.demo1;
    
    public class MyAspect {
    	
    	public void before() {
    		System.out.println("前置增强======================================");
    	}
    
    }
    
    
    	<bean id="myAspect" class="com.tyust.spring.demo1.MyAspect"></bean>
    

    第五步:使用注解的AOP对象目标类进行增强

    <!-- 开启注解的AOP开发 -->
    	<aop:aspectj-autoproxy/>
    

    在切面类上使用增强

    @Aspect
    public class MyAspect {
    	
    	@Before(value = "excution(* com.tyust.spring.demo1.OrderDao.save(..))")
    	public void before() {
    		System.out.println("前置增强======================================");
    	}
    
    }
    

    第六步:编写测试类

    package com.tyust.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;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class SpringDemo1 {
    	
    	@Resource(name = "orderDao")
    	private OrderDao orderDao;
    	
    	@Test
    	public void demo1() {
    		orderDao.save();
    		orderDao.delete();
    		orderDao.update();
    		orderDao.find();
    		
    	}
    }
    
    

    输出结果

    注解的AOP的通知的类型

    package com.tyust.spring.demo1;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.After;
    import org.aspectj.lang.annotation.AfterReturning;
    import org.aspectj.lang.annotation.AfterThrowing;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    
    @Aspect
    public class MyAspect {
    	
    	@Before(value = "execution(* com.tyust.spring.demo1.OrderDao.save(..))")
    	public void before() {
    		System.out.println("前置增强======================================");
    	}
    	
    	@AfterReturning(value = "execution(* com.tyust.spring.demo1.OrderDao.delete(..))",returning = "result")
    	public void afterReturning(Object result) {
    		System.out.println("后置增强======================================"+ result);
    	}
    	
    	@Around(value = "execution(* com.tyust.spring.demo1.OrderDao.update(..))")
    	public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
    		System.out.println("环绕qian增强======================================");
    		Object obj = joinPoint.proceed();
    		System.out.println("环绕hou增强======================================");
    		return obj;
    	}
    	
    	@AfterThrowing(value = "execution(* com.tyust.spring.demo1.OrderDao.find(..))",throwing = "ex")
    	public void afterThrowing(Throwable ex) {
    		System.out.println("异常抛出增强======================================"+ex.getMessage());
    	}
    	
    	@After(value = "execution(* com.tyust.spring.demo1.OrderDao.find(..))")
    	public void after() {
    		System.out.println("最终增强======================================");
    	}
    }
    

    输出结果
    image.png

    AOP的注解的切入点的注解

       @Pointcut(value = "execution(* com.tyust.spring.demo1.OrderDao.find(..))")
       private void pointCut1() {}
       
       @After(value = "MyAspect.pointCut1()")
       public void after() {
       	System.out.println("最终增强======================================");
       }
    

    可以让配置变得更方便

    总结

    @Aspect:定义切面类的注解

    通知类型:

    • @Before:前置通知
    • @AfterReturing:后置通知
    • @Around:环绕通知
    • @After:最终通知
    • @AfterThrowing:异常抛出通知

    @Pointcut:定义切入点的注解

  • 相关阅读:
    用函数装饰一首诗
    [转]最常用的15大Eclipse开发快捷键技巧
    [转]python 模块 chardet下载及介绍
    python手动设置递归调用深度
    view-xpath
    开源项目的贡献流程
    MIT许可证
    scrapy分布式的几个重点问题
    【bzoj1026】[SCOI2009]windy数 数位dp
    【bzoj5064】B-number 数位dp
  • 原文地址:https://www.cnblogs.com/zllk/p/12663864.html
Copyright © 2020-2023  润新知