spring aop实例讲解_abaqus实例详解pdf

spring aop实例讲解_abaqus实例详解pdfSpringAOP原理详解及实例1.SpringAOP简介在软件业,AOP为AspectOrientedProgramming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

观前提示:

本文所使用的Eclipse版本为Photon Release (4.8.0),IDEA版本为ultimate 2019.1,JDK版本为1.8.0_141,Tomcat版本为9.0.12。

1.Spring AOP简介

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
在这里插入图片描述

2.AOP与OOP对比

AOP、OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。

AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。

上面的陈述可能过于理论化,举个简单的例子,对于“雇员”这样一个业务实体进行封装,自然是OOP/OOD的任务,我们可以为其建立一个“Employee”类,并将“雇员”相关的属性和行为封装其中。而用AOP设计思想对“雇员”进行封装将无从谈起。

同样,对于“权限检查”这一动作片断进行划分,则是AOP的目标领域。而通过OOD/OOP对一个动作进行封装,则有点不伦不类。

换而言之,OOD/OOP面向名词领域,AOP面向动词领域。

3.AOP使用场景

AOP用来封装横切关注点,具体可以在下面的场景中使用:

  1. Authentication 权限

  2. Caching 缓存

  3. Context passing 内容传递

  4. Error handling 错误处理

  5. Lazy loading 懒加载

  6. Debugging 调试

  7. logging, tracing, profiling and monitoring 记录跟踪 优化 校准

  8. Performance optimization 性能优化

  9. Persistence 持久化

  10. Resource pooling 资源池

  11. Synchronization 同步

  12. Transactions 事务

4.AOP相关概念

  1. 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用基于模式或者基于@Aspect注解的方式来实现。

  2. 连接点(Joinpoint): 在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在Spring AOP中,一个连接点总是表示一个方法的执行。

  3. 通知/增强(Advice): 在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。spring aop advice的类型:
    1、前置通知(before advice),在目标方法执行之前执行。
    2、返回后通知(after returning advice),在方法正常执行结束之后的通知,可以访问到方法的返回值。
    3、抛出异常后通知(after throwing advice),在目标方法出现异常时执行的代码,可以访问到异常对象,且可以指定出现特定异常执行此方法。
    4、后置通知:(after[finally] advice),在目标方法执行之后执行(无论是否发生异常)。
    5、环绕通知:(around advice),可以实现上述所有功能。

  4. 切入点(Pointcut): 指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点:例如,使用正则表达式。 Spring定义了Pointcut接口,用来组合MethodMatcher和ClassFilter,可以通过名字很清楚的理解, MethodMatcher是用来检查目标类的方法是否可以被应用此通知,而ClassFilter是用来检查Pointcut是否应该应用到目标类上

  5. 引入(Introduction): 添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 IsModified接口,来简化缓存。Spring中要使用Introduction, 可有通过DelegatingIntroductionInterceptor来实现通知,通过DefaultIntroductionAdvisor来配置Advice和代理类要实现的接口

  6. 目标对象(Target Object): 包含连接点的对象。也被称作被通知或被代理对象。POJO

  7. AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。

  8. 织入(Weaving): 组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

5.AOP实例

需要的jar包:Jar包链接详情点我

需要的jar包
aspectjrt-1.9.2.jar、aspectjweaver-1.9.2.jar
在这里插入图片描述

5.1 基于xml配置方式

这里我使用的是Eclipse

目录结构
在这里插入图片描述
applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

  <bean id="userService" class="cn.com.demo.service.UserService"/>
  
  <bean id="logAopDemo" class="cn.com.demo.aop.LogAop"/>
  
  <!-- 面向切面编程 -->
  <aop:config>
    <aop:aspect ref="logAopDemo">
      <!-- 定义切点 -->
      <aop:pointcut expression="execution(* *..*(..))" id="pointCut"/>
      <!-- 声明前置通知 (在切点方法被执行前调用)-->
      <aop:before method="beforeAdvice" pointcut-ref="pointCut"/>
      <!-- 声明后置通知 (在切点方法被执行后调用)-->
      <aop:after method="afterAdvice" pointcut-ref="pointCut"/>
    </aop:aspect>
  </aop:config>
</beans>

注:aop:aspect 子节点还可配置

<aop:config>
    <aop:aspect ref="logAopDemo">
      <!-- 定义切点 -->
      <aop:pointcut expression="execution(* *..*(..))" id="pointCut"/>
      <!-- 声明前置通知 (在切点方法被执行前调用)-->
      <aop:before method="beforeAdvice" pointcut-ref="pointCut"/>
      <!-- 声明后置通知 (在切点方法被执行后调用)-->
      <aop:after method="afterAdvice" pointcut-ref="pointCut"/>
      <aop:after-returning method="aferReturning" pointcut-ref="pointCut"/>
      <aop:after-throwing method="aferThrowing" pointcut-ref="pointCut"/>
      <aop:around method="around" pointcut-ref="pointCut"/>
    </aop:aspect>
  </aop:config>

日志类LogAop.java

package cn.com.demo.aop;

public class LogAop { 
   

	public void beforeAdvice() { 
   
		System.out.println("beforeAdvice");
	}
	
	public void afterAdvice() { 
   
		System.out.println("afterAdvice");
	}
}

UserService.java

package cn.com.demo.service;

public class UserService { 
   

	public void insertUser() { 
   
		System.out.println("插入用户成功");
	}
	
	public boolean updateUser() { 
   
		System.out.println("更新用户成功");
		return true;
	}
}

测试类TestAop

package cn.com.demo.test;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.com.demo.service.UserService;

public class TestAop { 
   
	
	private ClassPathXmlApplicationContext ac;

	@Before
	public void before() { 
   
		ac = new ClassPathXmlApplicationContext("*/applicationContext.xml");
	}
	
	@Test
	public void test() { 
   
		try { 
   
			UserService userService = (UserService) ac.getBean("userService");
			userService.insertUser();
			userService.updateUser();
		} catch (Exception e) { 
   
			e.printStackTrace();
		}
	}
}

测试结果
在这里插入图片描述

5.2 基于注解配置方式

这里我使用的是Eclipse

目录结构
在这里插入图片描述
applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

  <bean id="userService" class="cn.com.demo.service.UserService"/>
  <!-- 启用注释驱动自动注入 -->
  <!-- <context:annotation-config/> -->
  <!-- 配置自动扫描的包 -->
  <context:component-scan base-package="cn.com.demo"></context:component-scan>
  <!-- 开启aop注解方式,此步骤不能少,这样java类中的aop注解才会生效 -->
  <aop:aspectj-autoproxy/>
</beans>

<aop:aspectj-autoproxy/>为开启aop注解方式,此步骤必不能少,这样java类中的aop注解才会生效。
日志类LogAop.java

package cn.com.demo.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAop { 
   

	@Pointcut("execution(* cn.com.demo.service.UserService.insertUser(..))")
	public void ponitCut() { 
   
		
	}
	
	@Before("ponitCut()")
	public void beforeAdvice() { 
   
		System.out.println("beforeAdvice");
	}
	
	@After("ponitCut()")
	public void afterAdvice() { 
   
		System.out.println("afterAdvice");
	}
	
	//环绕通知。注意要有ProceedingJoinPoint参数传入
	@Around("ponitCut()")
	public void around(ProceedingJoinPoint pjp) throws Throwable { 
   
		System.out.println("注解类型环绕通知..环绕前");
		pjp.proceed();//执行方法
		System.out.println("注解类型环绕通知..环绕后");
	}
}

UserService.java

package cn.com.demo.service;

public class UserService { 
   

	public void insertUser() { 
   
		System.out.println("插入用户成功");
	}
	
	public boolean updateUser() { 
   
		System.out.println("更新用户成功");
		return true;
	}
}

测试类TestAop

package cn.com.demo.test;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.com.demo.service.UserService;

public class TestAop { 
   
	
	private ClassPathXmlApplicationContext ac;

	@Before
	public void before() { 
   
		ac = new ClassPathXmlApplicationContext("*/applicationContext.xml");
	}
	
	@Test
	public void test() { 
   
		try { 
   
			UserService userService = (UserService) ac.getBean("userService");
			userService.insertUser();
		} catch (Exception e) { 
   
			e.printStackTrace();
		}
	}
}

运行结果
在这里插入图片描述

5.3 @AspectJ切点函数

参考文章:@AspectJ切点函数详解

6.可能出现的问题及解决方法

6.1 java.lang.IllegalArgumentException: error at :: 0 can’t find referenced pointcut……

如果出现如下错误:
在这里插入图片描述
可能是你的aspectjweaver和aspectjrt与你的jdk版本不匹配。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169610.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 6种不同画法画平行线_平行线的画法「建议收藏」

    6种不同画法画平行线_平行线的画法「建议收藏」课题平行线的画法主备人复备人教学目标1.掌握平行线的画法,并能用画平行线的方法检验两条直线是否互相平行。2.能运用画平行线的方法画长方形和正方形。3.通过动手画一画,知道两条平行线间的垂线的特点。教学重难点正确运用直尺和三角尺画平行线教学设计复备师:我们上一节课学习了画垂线,这节课我们来学习画平行线。你们觉得该用什么工具画呢?学生可能会说:生1:用尺子来画。生2:用格子来画。师:同学们都能利用手中…

    2022年9月20日
    0
  • makefile文件编写「建议收藏」

    makefile文件编写「建议收藏」makefile文件用于管理和组织代码工程的编译和链接,其不是可执行文件,其被make工具解析并完成相关动作,下面笔者将介绍makefile中常用的一些语法说明:1、文件包含:语法:include文件名作用:将其它makefile文件包含进来,组成一个更大的makefile文件,这样有利于makefile模块化编程。通常我们将一些配置选项分开成一个独立的makefile文件,这…

    2022年6月7日
    58
  • redissonredlock_redisson lock

    redissonredlock_redisson lock1.现在错误的用法:RLocklock=redisson.getLock(String.format(LOCK_KEY,2));try{if(lock.tryLock()){//处理logger.info(“aaaaaaaaaaaaaaaaaa”);}catch(Exceptione){//处理异常}finally{…

    2022年10月15日
    0
  • 通过pycharm的database设置进行数据库的可视化

    通过pycharm的database设置进行数据库的可视化在进行python研发的时候,pycharm是一个很好的IDE,今天又发现了一个比较好的功能,就是可以直接通过这个IDE连接数据库,然后对数据库进行相关的操作,这样我们可以不适用navicatformysql这样的可视化工具了。下面来说一下怎么通过pycharm来设置吧。首先打开database,一般在pycharm的右边侧栏中,也可以通过(View–>ToolWindows–

    2022年8月25日
    3
  • 互联网快讯:华为云正式推出区块链服务;猿辅导布局素质教育;轻松筹回应裁员

    互联网快讯:华为云正式推出区块链服务;猿辅导布局素质教育;轻松筹回应裁员国内要闻1、HarmonyOS2升级用户数突破1.2亿,平均每天超100万用户升级2、华为云正式推出区块链服务,单链支持每秒5万条商品信息上链3、荣耀CEO赵明:未来可能有上市计划,星耀公司不是荣耀子品牌4、顺丰回应被浙江省消保委点名:拟于9月29日下架“签收确认”增值服务产品5、轻松筹回应裁员:系因业务调整,所有人将按法律规定结算项目工资6、阿里云推出全球首个云定义存储产品,性能大幅提升300%教育培训1、国家发改委价格司:加强学科类校外培训收费监管工作2、猿辅

    2022年7月17日
    18
  • Android中bindService的使用方法

    Android中bindService的使用方法bindService用于绑定一个服务。这样当bindService(intent,conn,flags)后,就会绑定一个服务。这样做可以获得这个服务对象本身,而用startService(intent)的方法只能启动服务。   bindService方式的一般过程:①新建Service类BindService。在BindService类里新建内部类MyBinder,继承自Bind

    2022年6月6日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号