当前位置:首页 > 热水器 > 文章正文

什么是AOP中的Aspect它有什么用途?

编辑:[db:作者] 时间:2024-08-25 04:14:12

Spring2.0往后新增了对AspectJ切点表达式支持

@AspectJ 是AspectJ1.5新增功能,通过JDK5表明技能,许可直接在Bean类中定义切面

什么是AOP中的Aspect它有什么用途?

新版本Spring框架,建议利用AspectJ办法来开拓AOP

紧张用场:自定义开拓

Aspect关照类型

1.aop同盟定义关照类型,具有特性接口,必须实现,从而确定方法名称。

2.aspectj 关照类型,只定义类型名称。
已包办法格式。

3.before:前置关照(运用:各种校验)

在方法实行前实行,如果关照抛出非常,阻挡方法运行

4.afterReturning:后置关照(运用:常规数据处理)

方法正常返回后实行,如果方法中抛出非常,关照无法实行

必须在方法实行后才实行,以是可以得到方法的返回值。

5.around:环抱关照(运用:十分强大,可以做任何事情)

方法实行前后分别实行,可以阻挡方法的实行

必须手动实行目标方法

6.afterThrowing:抛出非常关照(运用:包装非常信息)

方法抛出非常后实行,如果方法没有抛出非常,无法实行

7.after:终极关照(运用:清理现场)

方法实行完毕后实行,无论方法中是否涌现非常

须要导入的jar包

4个: aop同盟规范 spring aop 实现 aspect 规范 spring aspect 实现

基于XML的Aspect框架操作1. 创建目标接口

package com.itheima.AspectJdaili;//利用AspectJ来实现动态代理public interface UserDao {//定义第一个接口public void Useradd();public String Userupdate();public void Userdelete();}2.创建实现类

public class UserDaolmp implements UserDao{//定义第一个接口的实现类public void Useradd() {System.out.println("增加AspectJ代理");}public String Userupdate() {System.out.println("修正AspectJ代理");//这里设置一个非常,看看非常关照的反响int i=1/0;return "后置关照第二个形参可以返回目标方法的返回值";}public void Userdelete() {System.out.println("删除AspectJ代理");}3.创建切面类,供应各种切面方法

public class MyAspect {/ 参数1:import org.aspectj.lang.JoinPoint;这个参数用于描述连接点(目标方法)(在没被调用前是连接点,调用后才会成为切入点) 得到目标方法的方法名,润色符等等 getSignature():方法署名,获取封装了署名信息的工具,在该工具中可以获取到目标方法名,所属类的Class等信息 getName() 方法的名称 /public void mybefore(JoinPoint joinPoint){//在自定义的前置关照方法中可以设置进行传参System.out.println("前增强关照:"+joinPoint.getSignature().getName());}/ 自定义一个后置关照方法(可以有参数 参数1.可以获取一些目标方法的信息 2.得到目标方法的返回值 类型是Object) /public void myafter(JoinPoint joinPoint,Object rev){//记得在xml配置文件中定义returning属性时,须要和后置关照第二个形参同等 这里都为rev(这里目标类中的方法返回值都为void)//我们修正一个System.out.println("后增强:"+joinPoint.getSignature().getName()+",-->"+rev);}/ 自定义一个环抱关照方法(JoinPoint的子接口ProceedingJoinPoint) 环抱关照方法:对目标方法实行环抱实行 返回值为一个Object类型的值 为了担保方法有无返回值 环抱关照都须要返回值(保险一点) 记得要抛出非常 /public Object myaround(ProceedingJoinPoint joinPoint) throws Throwable{System.out.println("前增强");//手动实行目标方法 Object obj=joinPoint.proceed(); System.out.println("后增强");return obj;}/ 自定义一个非常关照方法(JoinPoint joinPoint,Throwable e) 非常关照:在产生非常后实行,如果后面还有方法,在发生非常后停滞实行 第二个参数:用于获取目标方法的详细 (跟后置关照一样,要和xml中的throwing属性值同等) getMessage():输出非常的详细信息 /public void mythrowing(JoinPoint joinPoint,Throwable e){System.out.println("非常关照实行成功"+e.getMessage());}/ 自定义一个终极关照方法 ,这个关照方法类似与finally语句快(在程序末了实行完前实行,就算发生非常也会实行) /public void myfinally(){System.out.println("终极关照,类似与finally语句快");}}4.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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here --> <!-- 利用AspectJ来实现动态代理 --> <!--1.创建目标类工具 --> <bean id="userDao" class="com.itheima.AspectJdaili.UserDaolmp"></bean> <!-- 2.创建关照类工具 --><bean id="my" class="com.itheima.AspectJdaili.MyAspect"></bean><!-- 真正意义是对切入点进行增强然后动态代理类去整合,然后通过目标类类去输出 --> <aop:config><aop:aspect ref="my"><!-- 这个ref引用,将自定义的关照类转换成真正的关照 --><aop:pointcut expression="execution( com.itheima.AspectJdaili.UserDaolmp.(..))" id="mypointcut"></aop:pointcut><!-- 前置关照,关照方法先实行--><aop:before method="mybefore" pointcut-ref="mypointcut"/><!-- 后置关照,关照方法在目标方法实行后实行--><aop:after-returning method="myafter" pointcut-ref="mypointcut" returning="rev"></aop:after-returning><!-- 环抱关照,关照方法在目标方法的前后实行--><aop:around method="myaround" pointcut-ref="mypointcut"></aop:around><!-- 非常关照,目标方法发生非常后实行 --><aop:after-throwing method="mythrowing" pointcut-ref="mypointcut" throwing="e"></aop:after-throwing><!-- 终极关照,目标方法和其他关照实行完后实行--> <aop:after method="myfinally" pointcut-ref="mypointcut"></aop:after> </aop:aspect></aop:config></beans>利用Aspect表明1. 创建目标接口

package com.itheima.AspectJzhujie;//利用AspectJ来实现动态代理public interface UserDao {//定义第一个接口public void Useradd();public String Userupdate();public void Userdelete();}2.创建实现类

@Service("userDao")public class UserDaolmp implements UserDao{//定义第一个接口的实现类public void Useradd() {System.out.println("增加AspectJ代理");}public String Userupdate() {System.out.println("修正AspectJ代理");//这里设置一个非常,看看非常关照的反响 return "后置关照第二个形参可以返回目标方法的返回值";}public void Userdelete() {System.out.println("删除AspectJ代理");}}3.创建切面类

@Component("my")//当然这里可以不写id,由于等会配置切面类的表明须要在这个类进行,两个表明都在这里实行@Aspect//替代了<aop:aspect ref="my">配置切面类@Aspect//替代了<aop:aspect ref="my">配置切面类 用于或者关照public class MyAspect {//这时候我们想像之前一样利用公共的切入点//替代了<aop:pointcut expression="execution( com.itheima.AspectJdaili.UserDaolmp.(..))" id="mypointcut">//这时候我们可以定义一个公共切入点的方法,加上表明,使他变成一个公共切入点表明代替了expression= 而方法名代替了id@Pointcut("execution( com.itheima.AspectJzhujie.UserDaolmp.(..))")public void myPointcut(){}//替代了<aop:before method="mybefore" pointcut=""execution( com.itheima.AspectJdaili.UserDaolmp.(..))""/>//切入点只对当前关照有效//@Before("execution( com.itheima.AspectJzhujie.UserDaolmp.(..))")//前置关照表明public void mybefore(JoinPoint joinPoint){//在自定义的前置关照方法中可以设置进行传参System.out.println("前增强关照:"+joinPoint.getSignature().getName());}//替整体代了<aop:after-returning method="myafter" pointcut-ref="mypointcut" returning="rev">//而表明紧张是替代了<aop:after-returning method="myafter"//@AfterReturning(value="myPointcut()", returning="rev")//value相称于Pointcut-ref returning的属性直接加到上面就可以了public void myafter(JoinPoint joinPoint,Object rev){System.out.println("后增强:"+joinPoint.getSignature().getName()+",-->"+rev);}//环抱关照:表明替代了<aop:around method="myaround" pointcut-ref="mypointcut">//而表明紧张更换了<aop:around method="myaround" value在关照表明中即是pointcut-ref//@Around(value="myPointcut()")public Object myaround(ProceedingJoinPoint joinPoint) throws Throwable{System.out.println("前增强");//手动实行目标方法 Object obj=joinPoint.proceed(); System.out.println("后增强");return obj;}//非常关照:表明代替了<aop:after-throwing method="mythrowing" pointcut-ref="mypointcut" throwing="e">//而表明紧张替代了<aop:after-throwing method="mythrowing",value可以写入切入点的id 也可以直接写入切入点的详细方法//记得把非常属性写入表明,两者的值要同等Throwable e和throwing="e"//@AfterThrowing(value="execution( com.itheima.AspectJzhujie.UserDaolmp.(..))",throwing="e")public void mythrowing(JoinPoint joinPoint,Throwable e){System.out.println("非常关照实行成功"+e.getMessage());}//终极关照:表明替代了<aop:after method="myfinally" pointcut-ref="mypointcut">//而表明紧张替代了<aop:after method="myfinally" value可以写入切入点的id(pointcut-ref) 也可以直接写入切入点的详细方法@After(value="myPointcut()")public void myfinally(){System.out.println("终极关照,类似与finally语句快");}}4.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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 利用AOP表明来代替AspectJ实现动态代理 --> <!-- 编写扫描 --> <context:component-scan base-package="com.itheima.AspectJzhujie"></context:component-scan> <!-- 确保AOP表明生效(@Aspect,@before等等之类的)使aspectj自动动态代理 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> <!--1.表明替代创建目标类工具 --> </beans>

本站所发布的文字与图片素材为非商业目的改编或整理,版权归原作者所有,如侵权或涉及违法,请联系我们删除,如需转载请保留原文地址:http://www.baanla.com/rsq/115456.html

XML地图 | 自定链接

Copyright 2005-20203 www.baidu.com 版权所有 | 琼ICP备2023011765号-4 | 统计代码

声明:本站所有内容均只可用于学习参考,信息与图片素材来源于互联网,如内容侵权与违规,请与本站联系,将在三个工作日内处理,联系邮箱:123456789@qq.com