SpringBoot AOP AspectJ切面技术介绍与实现方式
AspectJ简介
- 它不属于spring;
- AspectJ是一个AOP的框架;
- 定义了AOP语法;
- 有一个专门的编译器用来生成遵守Java字节编码规范的Class文件
什么是AspectJ
- AspectJ是使用面向切面的一个框架
- 它扩展了Java语言(它本身也是一种语言)
- 支持原生Java代码 有自己的编译器
- 将代码翻译成Java字节码文件
- 是为了方便编写AOP代码而出现的
- 使用AOP编程的三个重点 通知 切点 织入
实现AOP的方式
原生使用切面
添加AOP坐标
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
创建增强类MyAOP
对service层下的所有类的所有方法进行增强
@Component @Aspect public class MyAOP { //定义切点 @Pointcut("execution(* com.moming.service.*.*(..))") public void point(){} @Before("point()") public void before(){ System.out.println("===>前置通知"); } @After("point()") public void after(){ System.out.println("===>后置通知"); } @Around("point()") public Object arround(ProceedingJoinPoint pjp) throws Throwable { System.out.println("===>环绕前"); Object resules = pjp.proceed(); System.out.println("===>环绕后"); return resules; } @AfterReturning(value = "point()",returning = "ret") public void returning(JoinPoint jp, String ret){ Object[] args = jp.getArgs(); System.out.println("返回后通知获取参数: "+Arrays.toString(args)); System.out.println("===>返回后通知,返回值: "+ret); } @AfterThrowing("point()") public void throwing(){ System.out.println("===>异常通知"); } }
service/OrderService
@Service public class OrderService { public String order(int id){ System.out.println("===>目标方法:订单业务ID:"+id); return "001202210121010"; } }
启动类测试
@SpringBootApplication public class App2 { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(App2.class, args); OrderService bean = context.getBean(OrderService.class); System.out.println(bean.order(1)); } }
无异常时
有异常时,后续代码就不再执行了
补充配置说明
//两种占位符
//* 代表的是一个单词,b* 代表的是以b开头的单词。 例如 bds
//.. 通配符 ,代表的是0个或者多个匹配项
通过注解使用切面
声明注解NeedCut
@Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE,ElementType.METHOD}) public @interface NeedCut { }
切换注解
@Component @Aspect public class MyAOP { //定义切点 @Pointcut("@annotation(com.moming.annotation.NeedCut)") public void point(){} @Before("point()") public void before(){ System.out.println("===>前置通知"); } @After("point()") public void after(){ System.out.println("===>后置通知"); } @Around("point()") public Object arround(ProceedingJoinPoint pjp) throws Throwable { System.out.println("===>环绕前"); Object resules = pjp.proceed(); System.out.println("===>环绕后"); return resules; } @AfterReturning(value = "point()",returning = "ret") public void returning(JoinPoint jp, String ret){ Object[] args = jp.getArgs(); System.out.println("返回后通知获取参数: "+Arrays.toString(args)); System.out.println("===>返回后通知,返回值: "+ret); } @AfterThrowing("point()") public void throwing(){ System.out.println("===>异常通知"); } }
使用注解@NeedCut
@Service public class OrderService { @NeedCut public String order(int id){ System.out.println("===>目标方法:订单业务ID:"+id); return "001202210121010"; } public void add(){ System.out.println("===>添加订单"); } }
测试
@SpringBootApplication public class App2 { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(App2.class, args); OrderService bean = context.getBean(OrderService.class); System.out.println(bean.order(01)); System.out.println("-------------------"); bean.add(); } }
使用@NeedCut注解的方法才进行增强
到此这篇关于SpringBoot AOP AspectJ切面技术介绍与实现方式的文章就介绍到这了,更多相关SpringBoot AOP AspectJ切面内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java中内存异常StackOverflowError与OutOfMemoryError详解
这篇文章主要介绍了 Java中内存异常StackOverflowError与OutOfMemoryError详解的相关资料,需要的朋友可以参考下2017-03-03Spring Boot中的@ConfigurationProperties注解解读
在SpringBoot框架中,@ConfigurationProperties注解是处理外部配置的强大工具,它允许开发者将配置文件中的属性自动映射到Java类的字段上,实现配置的集中管理和类型安全,通过定义配置类并指定前缀,可以将配置文件中的属性绑定到Java对象2024-10-10spring中@Configuration和@Bean注解的用法
这篇文章主要介绍了spring中@Configuration和@Bean注解的用法,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,需要的朋友可以参考下2023-05-05
最新评论