Spring AOP 实现原理:(面试高频重点)

-
Spring基于代理模式实现功能动态扩展,包含两种形式:
-
目标类拥有接口,通过JDK动态代理实现功能扩展
-
目标类没有接口,通过CGLib组件实现功能扩展
什么是代理模式:

- 代理模式通过代理对象对元对象的实现功能扩展
- 生活中的例子:客户(客户类)需要租房,然后找到中介(代理类),房东(委托类)。代理类和委托类要共同实现租房(接口)的逻辑。中介还可以向客户收取手续费(因为代理类内部里有委托类对象,所以代理类被实例化后可以对原始逻辑进行额外扩展)
- 按照如下例子,手动创建代理类的代理模式即为静态代理。
具体例子:
###创建userService接口
public interface UserService {
public void createUser();
}
创建委托类,具体实现接口的业务逻辑
public class UserServiceImpl implements UserService {
public void createUser(){
System.out.println("执行创建用户逻辑");
}
}
创建代理类,
持有委托类的对象,为了方便嵌套代理,这里放的是公共的接口,构造方法中传入的是一个具体的委托类或者其他代理类,然后用公共接口接收。
public class UserServiceProxy implements UserService {
//持有委托类对象
private UserService userService;
public UserServiceProxy(UserService userService) {
this.userService = userService;
}
@Override
public void createUser() {
System.out.println("========="+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSSS").format(new Date()));
userService.createUser();
}
}
代理类里还可以再嵌套代理类
public class UserServiceProxy1 implements UserService {
//持有委托类对象
private UserService userService;
public UserServiceProxy1(UserService userService) {
this.userService = userService;
}
@Override
public void createUser() {
userService.createUser();
System.out.println("=====后置扩展功能====");
}
}
实例化时注意嵌套关系:
public class SpringApplication {
public static void main(String[] args) {
UserService userService = new UserServiceProxy1(new UserServiceProxy(
new UserServiceImpl()));
userService.createUser();
}
}
效果如图

总结
代理类和实现类都要实现相同接口,每次实现功能扩展都需要创建一个代理类,这样做有个坏处,随着功能的不断扩大,每个具体实现类都要拥有至少一个代理类,会使系统变得臃肿,这个时候我们就可以使用动态代理。
https://github.com/MingCaiXiong/spring-learn/commit/847a3a4e7af0bac3f91ef28c58c71dc8079a98d4