Spring(AOP)

news/2025/1/7 21:15:25/

 aop引入案例

1.0版本

public void saveAdmin(Admin admin){
            jdbcTemplate.update("insert into admin(account,password)value(?,?)","cccc","2222");
  }
  
 
1.1版本
  public void saveAdmin(Admin admin){
            验证功能()
            jdbcTemplate.update("insert into admin(account,password)value(?,?)","cccc","2222");

  }
  public void updateAdmin(Admin admin){
            验证功能()
            jdbcTemplate.update("insert into admin(account,password)value(?,?)","cccc","2222");

  }
 
1.2版本
  public void saveAdmin(Admin admin){
          
            //业务代码
            if(admin.getAccount!=null){
              jdbcTemplate.update("insert into admin(account,password)value(?,?)","cccc","2222");
            }
         
  }
  
 
非业务代码: 
  验证功能(){
  
  }
  输出日志(){
  
  }
  提交事务(){
  
  }
  统一异常处理(){
  
  }

      开发好一个版本后,后期如果需要添加新的功能,就需要修改原来的代码, 加入调用新功能的代码. 这样开发就很麻烦,会存在大量的冗余代码.   
      利用 AOP 可以对业务逻辑和非业务逻辑进行隔离,从而使得各部分之间的 耦合度降低,提高程序的可重用性,同时提高了开发的效率 , AOP是一种编程技巧,不是代替OOP的
   AOP将程序中的一些非业务代码进行提取,在不需要修改原来代码的情况下,为程序添加额外的功能.非业务代码(验证权限,打印日志,提交事务,统一异常处理), AOP思想不是spring框架特有的,只是spring框架引入使用了这一思想
               AOP是通过一个 代理对象 来实现对非业务代码进行调用的 
                代理对象(4s 中介  手机店)
             告诉代理对象,调用哪个方法时,让代理对象去帮助我们调用哪个方法
                底层实现: 使用的是动态代理模式
AOP 的基本概念
连接点(Joinpoint): 类中可以被增强的方法,这个方法就被称为连接点
切入点(pointcut): 类中有很多方法可以被增强,但实际中只有 add 和 update 被增了,那么 add 和 update 方法就被称为切入点(实际实现的连接点)
通知(Advice): 通知是指一个切面在特定的连接点要做的事情(增强的功能)。通 知分为方法执行前通知,方法执行后通知,环绕通知等.
切面(Aspect): 把通知添加到切入点的整个过程称为切面.
目标(Target): 代理的目标对象(连接点,切入点所在类)
代理(Proxy): 向目标对象应用通知时创建的代理对象

springAOP 实现(具体操作)

(1)下载 AOP 相关 jar

< dependency >
< groupId >org.springframework</ groupId >
< artifactId >spring-aspects</ artifactId >
< version >5.2.2.RELEASE</ version >
</ dependency >

(2) 方式一:基于aspectj的xml配置

public class MyUtil {public void printLog(){System.out.println("打印日志");}public void commit(){System.out.println("提交事务");}public void exceptionAdmin(Throwable e){System.out.println("异常:"+e.getMessage());}
}

 

@Repository(value = "adminDao")
public class AdminDao {@AutowiredJdbcTemplate jdbcTemplate;public void saveAdmin(Admin admin){System.out.println("保存管理员");}public void saveAdmin(){System.out.println("保存管理员1");}public void updateAdmin(){System.out.println("修改管理员");}
}

//在.xml中配置
<bean id="myutil" class="com.ffyc.ssm.util.MyUtil"></bean><aop:config><aop:pointcut id="saveAdmin" expression="execution(* com.ffyc.ssm.dao.AdminDao.saveAdmin(..))"/><aop:aspect ref="myutil"><aop:before method="printLog" pointcut-ref="saveAdmin"></aop:before><aop:after-returning method="printLog" pointcut-ref="saveAdmin"></aop:after-returning><aop:after method="printLog" pointcut-ref="saveAdmin"></aop:after><aop:after-throwing method="exceptionAdmin" pointcut-ref="saveAdmin" throwing="e"></aop:after-throwing></aop:aspect></aop:config>

环绕通知

 方式二:注解

 在方法上注释

 


http://www.ppmy.cn/news/98970.html

相关文章

STL好难(3):vector的使用

目录 1.vector的介绍和使用 2.vector的常见构造&#xff1a; 3.vector的遍历方式 &#x1f349;[ ] 下标 &#x1f349;通过迭代器进行访问&#xff1a; &#x1f349;范围for&#xff1a; 4.vector的迭代器 &#x1f349;begin 和 end &#x1f349;rbegin 和 rend …

js实例化一个对象过程

实例化一个对象的过程发生了什么&#xff1f; 新建一个新的空对象 将this指向这个对象 将prototype上的值赋给对象 返回这个对象 上面是答案&#xff0c;我是因为遇到以下的问题发生了新的思考&#xff1a; 实现链式调用myCalculator(121).add(1).minus(2).multi(3).div(…

Java的包:提高代码可维护性和可扩展性的神器

&#x1f9d1;‍&#x1f4bb;CSDN主页&#xff1a;夏志121的主页 &#x1f4cb;专栏地址&#xff1a;Java基础进阶核心技术专栏 目录 &#x1f354; 一、包名 &#x1f9c6; 二、类的导入 &#x1f958; 三、静态导入 &#x1f958; 四、在包中增加类 &#x1f371; 五、…

R语言实践——使用rWCVP在WCVP中匹配名称

使用rWCVP在WCVP中匹配名称 加载库工作流1. 示例数据&#xff1a;IUCN红色名录2. 将匹配的名称解析为接受名2.1 模糊匹配2.2 多项匹配2.3 将评估与接受的名称相关联 3. 可视化匹配过程4. 得到最终数据集 加载库 世界维管植物名录提供了所有已知维管植物物种的全球共识观点&…

SpringBoot集成ElasticSearch

文章目录 前言一、ElasticSearch本地环境搭建二、SpringBoot整合ElasticSearch1.pom中引入ES依赖2.application.yaml配置elasticsearch3.ElasticSearchClientConnect连接ES客户端工具类4.ElasticSearchResult封装响应结果5.Person实体类6.Person实体类7.ElasticsearchControlle…

const

关键字const用来定义常量&#xff0c;如果一个变量被const修饰&#xff0c;那么它的值就不能再被改变。 const的存在一定有它的合理性&#xff0c;const修饰符有以下的优点&#xff1a; 预编译指令只是对值进行简单的替换&#xff0c;不能进行类型检查可以保护被修饰的东西&…

2023年最新无脑安装 Go lang 环境配置并编写、运行、打包第一个 Golang 程序详细步骤,附带图文教程

GO语言也称为Golang&#xff0c;由谷歌出品&#xff0c;随着云计算的发展而不断壮大&#xff0c;近年来&#xff0c;使用GO语言的程序员越来越多&#xff0c;GO程序员一般被称为GOpher。GO语言在语法上与C语言相类似&#xff0c;GO语言有以下的特点&#xff1a; 开源 &#xf…

多线程和多进程

线程和进程 最近经常看到多线程和多进程&#xff0c;这两个概念在某些方向还是很像的&#xff0c;但是进程和线程到底有啥联系&#xff0c;又有啥区别&#xff0c;很多人并没有完全弄明白&#xff0c;最近学操作系统的时候&#xff0c;老师经常叫线程为进程的进程&#xff0c;…