5个点轻松搞定Spring AOP底层实现原理_springboot aop底层实现原理

这个可以看我之前的文章:当我变成一个服务员和售货员教你一分钟了解并学废Spring AOP!!!

二、Spring框架的AOP的底层实现

Srping框架的AOP技术底层也是采用的代理技术,代理的方式提供了两种

基于JDK的动态代理

必须是面向接口的,只有实现了具体接口的类才能生成代理对象

基于CGLIB动态代理

  • 对于没有实现了接口的类,也可以产生代理,产生这个类的子类的方式
  • Spring的传统AOP中根据类是否实现接口,来采用不同的代理方式
  • 如果实现类接口,使用JDK动态代理完成AOP
  • 如果没有实现接口,采用CGLIB动态代理完成AOP
  • 对于没有实现了接口的类,也可以产生代理,产生这个类的子类的方式
  • Spring的传统AOP中根据类是否实现接口,来采用不同的代理方式
  • 如果实现类接口,使用JDK动态代理完成AOP
  • 如果没有实现接口,采用CGLIB动态代理完成AOP

基于Spring的AOP简单实现

注意一下,在讲解之前,说明一点:使用Spring AOP,要成功运行起代码,只用Spring提供给开发者的jar包是不够的,请额外上网下载两个jar包:

  1. aopalliance.jar
  2. aspectjweaver.jar

三、通过配置的方式实现aop通知效果

xml配置

<bean id="logger" class="com.ahpome.company.utils

[video(video-8PGqMbZO-1716354551447)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=1804892953)(image-https://img-blog.csdnimg.cn/img_convert/d03a705143646f4f3f6ea879d59b2788.png)(title-必看视频!获取2024年最新Java开发全套学习资料 备注Java)]

.Logger" />

<aop:config>

<aop:aspect id="loggerAspect" ref="logger"> // 定义切面 aspect

<aop:pointcut id="loggerRef" expression="execution(\* com.ahpome.company..\*.\*(..)) and !bean(logger)" /> //定义 切入点

<aop:around method="record" pointcut-ref="loggerRef" /> //通知 环绕通知 :around;前置通知 :before;后置通知:after;最终通知:after-returning;异常通知:after-throwing

</aop:aspect>

</aop:config>

logger.java

public Object record(ProceedingJoinPoint pjp){

Log log = new Log();

try {

log.setOperator("admin");

String mname = pjp.getSignature().getName();

log.setOperName(mname);

Object[] args = pjp.getArgs();

log.setOperParams(Arrays.toString(args));

//执行目标方法,返回的是目标方法的返回值,本例中 void

Object obj = pjp.proceed();

if(obj != null){

log.setResultMsg(obj.toString());

}else{

log.setResultMsg(null);

}

log.setOperResult("success");

System.out.println("1111");

return obj;

} catch (Throwable e) {

log.setOperResult("failure");

log.setResultMsg(e.getMessage());

} finally{

// logService.saveLog(log);

}

return null; 注意:这里如果是返回null即使你调用的时候返回是null,即使你的方法中含有返回值

}

}

JDK动态代理

接口

public interface UserService {

void save();

int select();

}

接口实现类

public class UserServiceImpl implements UserService {

@Override

public void save() {

System.out.println("保存用户信息成功");

}

@Override

public int select() {

System.out.println("查询用户信息成功");

return 10;

}

}

JDK动态代理工厂类

public class JdkProxyFactory implements InvocationHandler {

private Object target;

public JdkProxyFactory(Object target) {

this.target = target;

}

/\*\*

\* 获取代理对象,当前类继承InvocationHandler

\*

\* @return

\*/

public Object getProxyObject() {

return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);

}

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

//添加功能

System.out.println("增强代码,添加日志功能");


### 最后

小编精心为大家准备了一手资料

![](https://img-blog.csdnimg.cn/img_convert/64e10ea7f3292a2fda76116767140472.webp?x-oss-process=image/format,png)


![](https://img-blog.csdnimg.cn/img_convert/55bd577b37da24f2be329c35cdb83e65.webp?x-oss-process=image/format,png)

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

1.  BAT面试的20道高频数据库问题解析
2.  Java面试宝典
3.  Netty实战
4.  算法

![](https://img-blog.csdnimg.cn/img_convert/b523ec5ef1fd81ca6b616e4b71f46f0c.webp?x-oss-process=image/format,png)

**BATJ面试要点及Java架构师进阶资料**

![](https://img-blog.csdnimg.cn/img_convert/776152d1e4c729a1ba3b729ca4542d33.webp?x-oss-process=image/format,png)

ookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

1.  BAT面试的20道高频数据库问题解析
2.  Java面试宝典
3.  Netty实战
4.  算法

[外链图片转存中...(img-MubFuXwy-1716399484197)]

**BATJ面试要点及Java架构师进阶资料**

[外链图片转存中...(img-uRqY1IJr-1716399484197)]

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值