首页 > 其他分享 >12_Spring_AOP注解方式实现_掌握

12_Spring_AOP注解方式实现_掌握

时间:2023-07-30 12:44:50浏览次数:44  
标签:12 Spring dao 切点 springframework AOP org com public

12_Spring_AOP注解方式实现_掌握

AspectJ本身并不是spring框架中的组成部分,
是一个独立的AOP框架,一般把AspectJ和Spring框架的AOP依赖一起使用,所以要导入一个独立的依赖

实现的两种方式

1 基于注解方式实现 (熟练)

2 基于XML配置方式 (了解)

准备工作1

导入依赖

  1.      <!--spring核心容器包-->
    
  2.      <dependency>
    
  3.          <groupId>org.springframework</groupId>
    
  4.          <artifactId>spring-context</artifactId>
    
  5.          <version>5.3.5</version>
    
  6.      </dependency>
    
  7.      <!--spring切面包-->
    
  8.      <dependency>
    
  9.         <groupId>org.springframework</groupId>
    
  10.         <artifactId>spring-aspects</artifactId>
    
  11.         <version>5.3.5</version>
    
  12.     </dependency>
    
  13.     <!--织入包  spring-aspects 已经导入该包,这里可以不导入-->
    
  14.     <!--<dependency>
    
  15.         <groupId>org.aspectj</groupId>
    
  16.         <artifactId>aspectjweaver</artifactId>
    
  17.         <version>1.9.6</version>
    
  18.     </dependency>-->
    
  19.     <!--aop联盟包-->
    
  20.     <dependency>
    
  21.         <groupId>aopalliance</groupId>
    
  22.         <artifactId>aopalliance</artifactId>
    
  23.         <version>1.0</version>
    
  24.     </dependency>
    
  25.     <!--Apache Commons日志包-->
    
  26.     <dependency>
    
  27.         <groupId>commons-logging</groupId>
    
  28.         <artifactId>commons-logging</artifactId>
    
  29.         <version>1.2</version>
    
  30.     </dependency>
    
  31.     <!--德鲁伊连接池-->
    
  32.     <dependency>
    
  33.         <groupId>com.alibaba</groupId>
    
  34.         <artifactId>druid</artifactId>
    
  35.         <version>1.1.10</version>
    
  36.     </dependency>
    
  37.     <!--mysql驱动-->
    
  38.     <dependency>
    
  39.         <groupId>mysql</groupId>
    
  40.         <artifactId>mysql-connector-java</artifactId>
    
  41.         <version>8.0.22</version>
    
  42.     </dependency>
    
  43.     <!--Junit单元测试-->
    
  44.     <dependency>
    
  45.         <groupId>junit</groupId>
    
  46.         <artifactId>junit</artifactId>
    
  47.         <version>4.13.1</version>
    
  48.         <scope>test</scope>
    
  49.     </dependency>
    
  50.     <!--lombok -->
    
  51.     <dependency>
    
  52.         <groupId>org.projectlombok</groupId>
    
  53.         <artifactId>lombok</artifactId>
    
  54.         <version>1.18.12</version>
    
  55.         <scope>provided</scope>
    
  56.     </dependency>
    
  57. </dependencies>
    

准备工作2

切入点表达式: 通过一个表达式来确定AOP要增强的是哪个或者那些方法

语法结构:execution([权限修饰符][返回值类型][类的全路径名][方法名](参数 列表) )

例子1

execution(* com.msb.dao.UserDaoImpl.add(..))  //指定切点为UserDaoImpl.add方法

execution(* com.msb.dao.UserDaoImpl.*(..))      //指定切点为UserDaoImpl.所有的方法

execution(* com.msb.dao..(..))                        
//指定切点为dao包下所有的类中的所有的方法

execution(* com.msb.dao.*.add(..))                     //
指定切点为dao包下所有的类中的add的方法

execution(* com.msb.dao..add(..))                   //
指定切点为dao包下所有的类中的add开头的方法

image

基于注解方式实现

项目结构

image
开启注解扫描和AOP切面编程自动生成代理对象配置

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
  3.     xmlns:p="http://www.springframework.org/schema/p"
    
  4.     xmlns:c="http://www.springframework.org/schema/c"
    
  5.     xmlns:util="http://www.springframework.org/schema/util"
    
  6.     xmlns:context="http://www.springframework.org/schema/context"
    
  7.     xmlns:aop="http://www.springframework.org/schema/aop"
    
  8.     xsi:schemaLocation="
    
  9.    http://www.springframework.org/schema/beans
    
  10.    http://www.springframework.org/schema/beans/spring-beans.xsd
    
  11.    http://www.springframework.org/schema/util
    
  12.    http://www.springframework.org/schema/util/spring-util.xsd
    
  13.    http://www.springframework.org/schema/context
    
  14.    http://www.springframework.org/schema/context/spring-context.xsd
    
  15.    http://www.springframework.org/schema/aop
    
  16.    http://www.springframework.org/schema/aop/spring-aop.xsd
    
  17. ">
  18. <!--spring 包扫描  -->
    
  19. <context:component-scan base-package="com.msb"/>
    
  20. <!--aop autoProxy 自动生成代理对象 -->
    
  21. <aop:aspectj-autoproxy/>
    

准备接口

UserDao和EmpDao

  1. package com.msb.dao;

  2. /**

    • @Author: Ma HaiYang
    • @Description: MircoMessage:Mark_7001
  3. */

  4. public interface EmpDao {

  5.  int addEmp(Integer empno,String ename,String job);
    
  6. }

  7. package com.msb.dao;

  8. /**

    • @Author: Ma HaiYang
    • @Description: MircoMessage:Mark_7001
  9. */

  10. public interface UserDao {

  11.  int addUser(Integer userid,String username);
    
  12. }

接口实现类

  1. package com.msb.dao.impl;

  2. import com.msb.dao.UserDao;

  3. import org.springframework.stereotype.Repository;

  4. /**

    • @Author: Ma HaiYang
    • @Description: MircoMessage:Mark_7001
  5. */

  6. @Repository

  7. public class UserDaoImpl implements UserDao {

  8. public int addUser(Integer userid,String username){
    
  9.     System.out.println("userdao add ... ...");
    
  10.     //int i =1/0;
    
  11.     return 1;
    
  12. }
    
  13. }

  14. package com.msb.dao.impl;

  15. import com.msb.dao.EmpDao;

  16. import com.msb.dao.UserDao;

  17. import org.springframework.stereotype.Repository;

  18. /**

    • @Author: Ma HaiYang
    • @Description: MircoMessage:Mark_7001
  19. */

  20. @Repository

  21. public class EmpDaoImpl implements EmpDao {

  22. public int addEmp(Integer empno,String ename,String job){
    
  23.     System.out.println("empDao add ... ...");
    
  24.     return 1;
    
  25. }
    
  26. }

准备切面

  1. package com.msb.aspect;
  2. import org.aspectj.lang.JoinPoint;
  3. import org.aspectj.lang.ProceedingJoinPoint;
  4. import org.aspectj.lang.annotation.*;
  5. import org.springframework.core.annotation.Order;
  6. import org.springframework.stereotype.Component;
  7. import java.util.Arrays;
  8. /**
    • @Author: Ma HaiYang
    • @Description: MircoMessage:Mark_7001
  9. */
  10. @Component
  11. @Aspect
  12. public class DaoAspect {
  13. //定义公共切点
    
  14. @Pointcut("execution(* com.msb.dao.*.add*(..))")
    
  15. public void addPointCut(){}
    
  16. /*
    
  17. * 前置通知: 切点方法执行之前先执行的功能
    
  18. * 参数列表可以用JoinPoint接收切点对象
    
  19. * 可以获取方法执行的参数
    
  20. * */
    
  21. @Before("addPointCut()")
    
  22. public void methodBefore(JoinPoint joinPoint){
    
  23.     System.out.println("Before invoked");
    
  24. }
    
  25. /*
    
  26. * 后置通知:方法执行之后要增强的功能
    
  27. * 无论切点方法是否出现异常都会执行的方法
    
  28. * 参数列表可以用JoinPoint接收切点对象
    
  29. * */
    
  30. @After("addPointCut()")
    
  31. public void methodAfter(JoinPoint joinPoint){
    
  32.     System.out.println("After invoked");
    
  33. }
    
  34. /*
    
  35.  * 返回通知:切点方法正常运行结束后增强的功能
    
  36.  * 如果方法运行过程中出现异常,则该功能不运行
    
  37.  * 参数列表可以用 JoinPoint joinPoint接收切点对象
    
  38.  * 可以用Object res接收方法返回值,需要用returning指定返回值名称
    
  39.  * */
    
  40. @AfterReturning( value = "addPointCut()",returning = "res")
    
  41. public void methodAfterReturning(JoinPoint joinPoint,Object res){
    
  42.     System.out.println("AfterReturning invoked");
    
  43. }
    
  44. /*
    
  45.  * 异常通知:切点方法出现异常时运行的增强功能
    
  46.  * 如果方法运行没有出现异常,则该功能不运行
    
  47.  * 参数列表可以用Exception ex接收异常对象 需要通过throwing指定异常名称
    
  48.  * */
    
  49. @AfterThrowing( value = "addPointCut()",throwing = "ex")
    
  50. public void methodAfterThrowing(Exception ex){
    
  51.     System.out.println("AfterThrowing invoked");
    
  52. }
    
  53. /*环绕通知:在切点方法之前和之后都进行功能的增强
    
  54. * 需要在通知中定义方法执行的位置,并在执行位置之前和之后自定义增强的功能
    
  55. * 方法列表可以通过ProceedingJoinPoint获取执行的切点
    
  56. * 通过proceedingJoinPoint.proceed()方法控制切点方法的执行位置
    
  57. * proceedingJoinPoint.proceed()方法会将切点方法的返回值获取到,并交给我们,可以做后续处理
    
  58. * 我们在环绕通知的最后需要将切点方法的返回值继续向上返回,否则切点方法在执行时接收不到返回值
    
  59. * */
    
  60. @Around("addPointCut()")
    
  61. public Object methodAround(ProceedingJoinPoint proceedingJoinPoint)
    
    throws Throwable {
  62.     System.out.println("aroundA invoked");
    
  63.     Object proceed = proceedingJoinPoint.proceed();
    
  64.     System.out.println("aroundB invoked");
    
  65.     return proceed;
    
  66. }
    
  67. }

测试代码

  1.  @Test
    
  2.  public void test1(){
    
  3.      ApplicationContext context=new
    
    ClassPathXmlApplicationContext("applicationContext.xml");
  4.      UserDao userDao = context.getBean( UserDao.class);
    
  5.      int add = userDao.addUser(10,"晓明");
    
  6.  } 
    

image

image

有多个增强类对同一个方法进行增强,通过@Order注解设置增强类优先级

数字越小,优先级越高

数字越小,其代理位置越靠近注入位置

image

image

完全使用注解开发

创建配置类

  1. package com.msb.config;
  2. import org.springframework.context.annotation.ComponentScan;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.context.annotation.EnableAspectJAutoProxy;
  5. /**
    • @Author: Ma HaiYang
    • @Description: MircoMessage:Mark_7001
  6. */
  7. @Configuration
  8. @ComponentScan(basePackages = "com.msb")
  9. @EnableAspectJAutoProxy(proxyTargetClass = true)
  10. public class SpringConfig {
  11. }

测试代码

  1.  @Test
    
  2.  public void test2(){
    
  3.      ApplicationContext context=new
    
    AnnotationConfigApplicationContext(SpringConfig.class);
  4.      UserDao userDao = context.getBean( UserDao.class);
    
  5.      int add = userDao.addUser(10,"晓明");
    
  6.  }
    

Generated with Mybase Desktop 8.2.13

标签:12,Spring,dao,切点,springframework,AOP,org,com,public
From: https://www.cnblogs.com/01way/p/17591282.html

相关文章

  • 11_Spring_AOP概念和原理
    11_Spring_AOP概念和原理AOP切面编程一般可以帮助我们在不修改现有代码的情况下,对程序的功能进行拓展,往往用于实现日志处理,权限控制,性能检测,事务控制等AOP实现的原理就是动态代理,在有接口的情况下,使用JDK动态代理,在没有接口的情况下使用cglib动态代理为Dao层所有的......
  • 10_Spring_CGLIB动态代理
    10_Spring_CGLIB动态代理proxy动态代理面向接口1必须有接口和实现类2增强接口中定义的方法3只能读取接口中方法的上注解cglib动态代理模式面向父类packagecom.msb.testCglib;importorg.junit.Test;importorg.springframework.cglib.proxy.Enhancer;importorg.s......
  • 14_Spring_JDBCTemplate的使用
    14_Spring_JDBCTemplate的使用JdbcTemplate概述JdbcTemplate是spring框架中提供的一个对象,是对原始繁琐的JdbcAPI对象的简单封装。spring框架为我们提供了很多的操作模板类。例如:操作关系型数据的JdbcTemplate和,操作nosql数据库的RedisTemplate,操作消息队列的JmsTemplate等等......
  • 1_Spring概念介绍_了解
    1_Spring概念介绍_了解Spring是分层的全栈式的轻量级开发框架,以IOC和AOP为核心,官网是https://spring.ioSpring版本情况Spring优势1方便解耦,简化开发Spring通过容器,将对象的创建从代码中剥离出来,交给Spring控制,避免直接编码造成模块之间的耦合度高,用户也不必自己编......
  • UG12.0(UG NX12.0)下载-UG12.0直装版安装包下载 软件推荐
    UGNX12.0中文版是一款相当出众和强大的cad设计软件。UGNX12.0中文版可以快速的帮助用户进行CAD的设计,适用于模具设计、产品设计、工业设计等众多领域,可以满足大家的不同需求,是一款不可多得的出色软件!软件地址:看置顶贴软件特色1、更好的协调性ugnx12.0中文版把“主动数字样机(Ac......
  • 【SpringBoot】快速入门
    (知识目录)一、SpringBoot快速入门1.1idea创建(1)新建模块,选择SpringInitializer,一定要记得选择SpringBoot的版本为2.7.7注意上面的两个目录一定要是空目录,然后点击apply,OK即可,之后进入到主界面。(2)编写UserController类packagecom.itxiaoguo.controller;importor......
  • Spring Security安全框架在Spring Boot框架中的使用
    SpringSecurity是一个基于Spring框架的安全框架,它提供了一系列的安全服务和功能,包括身份验证、授权、防护等。在SpringBoot框架中,SpringSecurity是一个非常重要的组件,它可以帮助我们实现应用程序的安全性。本文将详细介绍SpringSecurity在SpringBoot框架中的使用,包括如何配置S......
  • springboot的controller如何拿到post请求中的json数据
    在SpringBoot的Controller中,可以使用注解@RequestBody来获取POST请求中的JSON数据。我们可以将这个注解应用到一个Controller方法的参数上,Spring将会负责读取请求正文中的数据,将其反序列化为一个Java对象,并将其作为Controller方法的参数传递。以Java代码为例,示例代码如下:@RestC......
  • abc312e <暴力>
    题目E-TangencyofCuboids思路意识到本题的数据规模可以暴力去做!\(N=100\),\(N^3\)直接遍历整个空间可做;立方体间不相交,也就是可以直接遍历立方体中的所有点进行标记,不会超过整体空间体积;立方体不相交,也就是说同一个位置尽可能被标记一次;将空间中每个立方体所占点进行标......
  • abc312d <dp, 括号匹配方案数>
    题目D-CountBracketSequences思路dp[i][j]为考虑前\(i\)个位置,待匹配的(有\(j\)个的方案数;代码点击查看代码#include<iostream>#include<algorithm>#include<vector>#include<cstring>usingnamespacestd;usingLL=longlong;usingPII=pair<......