Srping全注解开发---AOP模块

本文详细介绍了如何在Spring框架中配置切面类和业务逻辑类,使用@EnableAspectJAutoProxy开启基于注解的AOP模式,并展示了如何定义切点表达式和使用JoinPoint对象在不同通知方法中操作目标方法。
摘要由CSDN通过智能技术生成

}

}


在配置类中将切面类和业务逻辑类都加入到容器中


切记给配置类上加上@EnableAspectJAutoProxy,开启基于注解的aop模式

@EnableAspectJAutoProxy

@Configuration

public class MyConfig

{

@Bean

public MyAspect myAspect()

{

return new MyAspect();

}

@Bean

public calculator calculator()

{

return new calculator();

}

}


测试


public class Main

{

//传入的是配置类的位置,一开始是加载配置类,之前是加载配置文件的位置

private static AnnotationConfigApplicationContext ioc= new AnnotationConfigApplicationContext(MyConfig.class);

public static void main(String[] args)

{

calculator bean = ioc.getBean(calculator.class);

System.out.println(bean.add(1,2));

}

}

在这里插入图片描述


注意:spring中很多Enablexxx都是开启某一项功能


在切面类的方法中获取切入方法的相关信息


joinpoint必须出现在方法参数的首位

@Aspect//表明是一个切面类

public class MyAspect

{

//抽取公共的切入点表达式

//1.本类引用:直接写方法名()

//2.其他切面引用:方法的全类名()

@Pointcut(“execution(public int com.math.calculator.*(…))”)

public void point(){};

//在目标方法之前切入,切入点表达式(指定切入哪个方法)

//本类方法引用切点表达式演示:

@Before(“point()”)

public void logStart(JoinPoint joinPoint)

{

System.out.println("目标方法运行前 "+“方法名:”+joinPoint.getSignature().getName());

}

//外部方法引用切点表达式演示:

@After(“com.aop.MyAspect.point()”)

public void logAfter()

{

System.out.println(“目标方法结束后…”);

}

//joinpoint必须出现在方法参数的首位

@AfterReturning(value = “point()”,returning = “res”)

public void logReturning(JoinPoint js,Object res)

{

System.out.println(js.getSignature().getName()+"方法正常返回后 "+“方法返回值:”+res);

}

//joinpoint必须出现在方法参数的首位

@AfterThrowing(value = “point()”,throwing = “ex”)

public void logThrowing(JoinPoint js,Exception ex)

{

System.out.println(js.getSignature().getName()+"方法出现异常后 "+“异常是:”+ex);

}

}

在这里插入图片描述


JoinPoint对象详细使用方法,参考下面这篇文章

SpringAop中JoinPoint对象的使用方法


AOP注解开发三部曲


1.将业务逻辑组件和切面类加入到容器中,告诉spring容器哪一个是切面类(@Aspect)

2.在切面类上的每一个通知方法上标注通知注解,告诉Spring何时何地运行(切入点表达式)

3.开启基于注解的aop模式


AOP原理剖析部分

========================================================================

AOP原理[看给容器中注册了什么组件,这个组件什么时候工作,这个组件的功能是什么]:

@EnableAspectJAutoProxy:

==> @Import({AspectJAutoProxyRegistrar.class}):给容器中导入AspectJAutoProxyRegistrar

==>利用AspectJAutoProxyRegistrar自定义给容器中注册bean

==>给容器中注册一个AnnotationAwareAspectJAutoProxyCreator(AspectJ自动代理创建器)


下面展示AspectJ自动代理创建器往上的父类层级关系:

AnnotationAwareAspectJAutoProxyCreator

–>AspectJAwareAdvisorAutoProxyCreator

—>AbstractAdvisorAutoProxyCreator

—>AbstractAutoProxyCreator

implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware

后置处理器,自动装配 BeanFactory


创建和注册AnnotationAwareAspectJAutoProxyCreator的流程:


1.传入配置类,创建ioc容器

2.注册配置类,调用refresh()刷新容器

public AnnotationConfigApplicationContext(Class<?>… annotatedClasses) {

this();

this.register(annotatedClasses);//注册配置类

this.refresh();//刷新容器

}

3. refresh方法中===> this.registerBeanPostProcessors(beanFactory);

注册bean的后置处理器来方便拦截bean的创建

3.1 先获取到ioc容器中已经定义的需要创建对象的所有BeanPostProcessor

3.2 给容器中加别的BeanPostProcessor

3.3 优先注册实现了PriorityOrdered接口的BeanPostProcessor

3.4 再给容器中注册实现了Ordered接口的BeanPostProcessor

3.5 没实现优先级接口的BeanPostProcessor

3.6 注册BeanPostProcessor,其实就是创建BeanPostProcessor保存在容器中

创建internalAutoProxyCreator的BeanPostProcessor[AnnotationAwareAspectJAutoProxyCreator]

(1).创建bean的实例

(2).populateBean:给Bean的各种属性赋值

(3).initializeBean:初始化Bean

(3.1).invokeAwareMethods():处理Aware接口的方法回调

(3.2).applyBeanPostProcessorsBeforeInitialization:应用后置处理器的postProcessBeforeInitialization

(3.3).invokeInitMethods():执行自定义的初始化方法

(3.4).applyBeanPostProcessorsAfterInitialization执行后置处理器的postProcessAfterInitialization

(4).BeanPostProcessor(AnnotationAwareAspectJAutoProxyCreator)创建成功


在这里插入图片描述


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结:如果我们需要对某个业务逻辑组件进行增强,那么最后我们从容器中拿到的这个业务逻辑组件实际是一个被增强了的代理对象


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性

Java面试宝典2021版

最常见Java面试题解析(2021最新版)

2021企业Java面试题精选

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
少文章的可读性

Java面试宝典2021版

[外链图片转存中…(img-5TTlY1rO-1713341033373)]

[外链图片转存中…(img-rCrtTh5j-1713341033373)]

最常见Java面试题解析(2021最新版)

[外链图片转存中…(img-twsgfy1N-1713341033373)]

[外链图片转存中…(img-Pijp3nvI-1713341033374)]

2021企业Java面试题精选

[外链图片转存中…(img-L2yQy37M-1713341033374)]

[外链图片转存中…(img-35urUM2l-1713341033374)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值