【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)
```
动态代理相比静态代理的优势在于无需为每个类编写代理代码,更加灵活高效!🎯
动态代理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)
```
动态代理相比静态代理的优势在于无需为每个类编写代理代码,更加灵活高效!🎯

被折叠的 条评论
为什么被折叠?



