Spring的AOP-AspectJ注解方式
目录
Spring的AOP-AspectJ注解方式
1.创建类,在类里面定义方法
2.创建增强类
3.进行通知的配置
(1)在Spring 配置文件中,开启直接扫描
(2)使用注解创建User 和 UserProxy 对象
(3)在增强类上面添加注解@Aspect
(4)在Spring 配置文件中开启生成代理对象
4.配置不同类型的通知
(1)在增强类的里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置
5.测试:
全部进行测试:
测试结果:
观察:
7.如果有多个增强类同时对一个方法进行增强,可以设置增强类的优先级
(1)在增强类上面添加注解@Order(数字类型值)
结果:
Spring的AOP-AspectJ注解方式
(需要看上一章把xjar包都导入才可以执行以下)
1.创建类,在类里面定义方法
新建一个aop_annotation包
在aop_annotation包内新建一个User类
User类代码如下:
package com.lbj.spring5.aop_annotation;public class User {public void add(){System.out.println("add。。。");}
}
2.创建增强类
package com.lbj.spring5.aop_annotation;//增强的类
public class UserProxy {//前置通知public void before(){System.out.println("before");}
}
3.进行通知的配置
(1)在Spring 配置文件中,开启直接扫描
bean2.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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><!--开启注解扫描/开启组件扫描--><context:component-scan base-package="com.lbj.spring5.aop_annotation"></context:component-scan>
</beans>
(2)使用注解创建User 和 UserProxy 对象
一个是被增强的User类
一个是增强的UserProxy类
(3)在增强类上面添加注解@Aspect
(4)在Spring 配置文件中开启生成代理对象
4.配置不同类型的通知
(1)在增强类的里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置
package com.lbj.spring5.aop_annotation;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;//增强的类
@Component
@Aspect //生成代理对象
public class UserProxy {//前置通知//@Before注解表示作为前置通知@Before(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void before(){System.out.println("before");}
}
5.测试:
注意事项:当我们使用了maven搭建项目的时候,bean1.xml文件需要到resources文件里面才能被使用
测试代码:
package com.lbj.spring5.test;import com.lbj.spring5.aop_annotation.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestAop {@Testpublic void testAopAnnotation(){//加载配置文件ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");//得到对象,引入依赖User user = context.getBean("user", User.class);//调用对象的方法user.add();}
}
测试结果:
全部进行测试:
package com.lbj.spring5.aop_annotation;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;//增强的类
@Component
@Aspect //生成代理对象
public class UserProxy {//前置通知//@Before注解表示作为前置通知@Before(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void before(){System.out.println("before...");}//最终通知@After(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void after(){System.out.println("after...");}//后置通知、返回通知@AfterReturning(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void afterReturning(){System.out.println("afterReturning...");}//异常通知@AfterThrowing(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void afterThrowing(){System.out.println("afterThrowing...");}//环绕通知@Around(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{System.out.println("beforeAround...");//被增强的方法执行proceedingJoinPoint.proceed();System.out.println("afterAround...");}
}
测试类:
package com.lbj.spring5.test;import com.lbj.spring5.aop_annotation.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** Created by 14811 on 2020/12/23.*/
public class TestAop {@Testpublic void testAopAnnotation(){//加载配置文件ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");//得到对象,引入依赖User user = context.getBean("user", User.class);//调用对象的方法user.add();}
}
测试结果:
手动测试异常类:
明显10/0 是异常的
package com.lbj.spring5.aop_annotation;import org.springframework.stereotype.Component;//被增强的类
@Component
public class User {public void add(){int i=10/0;System.out.println("add...");}
}
测试结果:
观察:
after不管有没有异常都会执行
afterReturning 只要出现异常就不会执行
6.相同的切入点抽取
作用是:把一些重复写的写成公共部分
进行方法调用即可
7.如果有多个增强类同时对一个方法进行增强,可以设置增强类的优先级
(1)在增强类上面添加注解@Order(数字类型值)
数字类型值:越小,优先等级越高
对比:
结果:
8.完全注解开发:
(1)创建配置类,不需要创建xml配置文件
@Configuration
@ComponentScan(basePackages={''包路径''})
@EnableAspectJAutoProsy(proxyTargetClass=true)
public class ConfigAop{
}
Spring的AOP-AspectJ注解方式相关推荐
- Spring(四)AOP的注解方式用法
1. Spring使用AspectJ进行AOP的开发:(注解的方式) 1.1 引入相关的jar包: * spring的传统AOP的开发的包 spring-aop-4.2.4.RELEASE.jar c ...
- 面向切面(AOP)之Spring接口方式 schema配置方式 aspectj注解方式
一.初识AOP 关于AOP的学习可以参看帮助文档:spring-3.2.0.M2\docs\reference\html目录下index.html的相关章节 1.AOP:Aspect-O ...
- spring AOP自定义注解方式实现日志管理
转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接 ...
- Spring 之AOP AspectJ切入点语法详解(最全了,不需要再去其他地找了)---zhangkaitao
Spring 之AOP AspectJ切入点语法详解(最全了,不需要再去其他地找了) http://jinnianshilongnian.iteye.com/blog/1415606 --zha ...
- spring实现AOP环绕通知方式
spring实现AOP环绕通知方式 点关注不迷路,欢迎再来! 精简博客内容,尽量已行业术语来分享. 努力做到对每一位认可自己的读者负责. 帮助别人的同时更是丰富自己的良机. 目录 spring实现AO ...
- Spring框架(五):Spring事务简述(注解方式)
一.Spring事务的概述 事务的作用是什么? 简单来说,就是在数据层保障一系列的数据库操作同成功同失败(提交和回滚) Spring事务作用︰在数据层或[业务层]保障一系列的数据库操作同成功同失败. ...
- Spring依赖注入(注解方式)
Spring依赖注入(注解方式) 在Spring中,尽管使用XML配置文件就可以实现Bean的装配工作,但如果应用中Bean的数量较多,会导致XML配置文件过于臃肿,从而给程序的维护与升级带来一定的困 ...
- Spring整合Mybatis之注解方式,(注解整合Junit)
Spring整合Mybatis之注解方式 我有一篇博客详细写了我自己使用xml的方法Spring整合MyBatis,现在我就把核心配置文件中的每个bean的配置使用注解的方式实现 注解整合MyBati ...
- aop注解配置切点 spring_springboot aop 自定义注解方式实现一套完善的日志记录
一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能. 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型(增删改查),详细描述,返回值. 二:项目结构图 如果想学习Java ...
- 【Spring】配置事务 注解方式与非注解方式
Spring的事务配置非注解方式 <!--通知--><tx:advice id="txAdvice" transaction-manager="txTr ...
最新文章
- 控制寄存器和系统地址寄存器
- 借用计算机不及时归还,陕西省农村信用社笔试试题(二)
- 润乾报表列太多导致渲染速度慢_报表自动化: 如何选择可视化大屏开发利器
- Android安卓APK反编译逆向
- first OData Batch operation when Sales Pipeline is launched
- poj 3261 Milk Patterns 后缀数组 最长重复子串
- 【渝粤教育】电大中专计算机常用工具软件 (2)作业 题库
- 学用 TStringGrid [1] - ColCount、RowCount、Cells
- SIFT算法中概念简单解释
- 新版Elemen Plus 国际化 1.0.2-beta.59(包含59)
- 2年的程序员之路 ,分享给你们
- c语言让系统蓝屏,0x000000116,教您解决电脑蓝屏代码0x000000116
- java模拟摇摆小球程序代码_Android实现左右摆动的球体动画效果
- FCKeditor上传漏洞总结
- pdps修改服务器,Tecnomatix PDPS二次开发功能介绍
- Java 编程思想 读书笔记
- golang 如何快速测试代码
- AMBA总线协议(一)——一文看懂APB总线协议
- VSCode 安装Flutter 教程
- 微信文件夹的dat文件怎么打开_微信dat文件怎么打开?
热门文章
- StringBuilder String string.Concat 字符串拼接速度再议
- 使用HDFS客户端java api读取hadoop集群上的信息
- arm-linux-gnueabi和arm-linux-gnueabihf 的区别
- oracle数据库卸载(需要完全卸载oracl才能重装)
- 正确的 zip 压缩与解压代码
- 使用HTML5的Canvas画布来剪裁用户头像
- The Best and the Worst
- 计算机网络(十八)-以太网
- 随笔:朋友圈扫街图有感(爱情)
- 开启httponly之后登陆失败_二次元约会模拟《少女都市》正式版登陆Steam 橘势大好...