【Spring Boot】Spring AOP动态代理,以及静态

【SpringBoot】SpringAOP动态代理与静态代理解析✨

动态代理vs静态代理🔄

在SpringAOP中,代理是实现面向切面编程的核心机制。Spring主要使用两种代理方式:

1.JDK动态代理-基于接口实现
2.CGLIB代理-基于类继承实现

JDK动态代理示例🚀

```java
publicinterfaceUserService{
voidsaveUser();
}

publicclassUserServiceImplimplementsUserService{
@Override
publicvoidsaveUser(){
System.out.println("保存用户");
}
}

//代理处理器
publicclassMyInvocationHandlerimplementsInvocationHandler{
privateObjecttarget;

publicMyInvocationHandler(Objecttarget){
this.target=target;
}

@Override
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
System.out.println("前置处理🌟");
Objectresult=method.invoke(target,args);
System.out.println("后置处理🌈");
returnresult;
}
}

//使用代理
UserServiceproxy=(UserService)Proxy.newProxyInstance(
UserService.class.getClassLoader(),
newClass[]{UserService.class},
newMyInvocationHandler(newUserServiceImpl())
);
proxy.saveUser();
```

CGLIB代理示例🛠️

```java
publicclassUserService{
publicvoidsaveUser(){
System.out.println("保存用户");
}
}

//CGLIB代理
publicclassCglibProxyimplementsMethodInterceptor{
@Override
publicObjectintercept(Objectobj,Methodmethod,Object[]args,MethodProxyproxy)throwsThrowable{
System.out.println("方法调用前🎯");
Objectresult=proxy.invokeSuper(obj,args);
System.out.println("方法调用后🎉");
returnresult;
}
}

//使用代理
Enhancerenhancer=newEnhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback(newCglibProxy());
UserServiceproxy=(UserService)enhancer.create();
proxy.saveUser();
```

静态代理📌

静态代理需要手动为每个目标类编写代理类:

```java
publicclassUserServiceProxyimplementsUserService{
privateUserServiceuserService;

publicUserServiceProxy(UserServiceuserService){
this.userService=userService;
}

@Override
publicvoidsaveUser(){
System.out.println("前置处理");
userService.saveUser();
System.out.println("后置处理");
}
}
```

SpringAOP的选择🤔

SpringAOP默认使用JDK动态代理,如果目标类没有实现接口,则自动切换到CGLIB代理。可以通过配置强制使用CGLIB:

```java
@EnableAspectJAutoProxy(proxyTargetClass=true)
```

动态代理相比静态代理的优势在于无需为每个类编写代理代码,更加灵活高效!🎯
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值