AOP就是进行动态代理,在创建一个Bean的过程中,Spring在最后一步会去判断当前正在创建的这个Bean是不是需要进行AOP,如果需要则会进行动态代理。
如何判断当前Bean对象需不需要进行AOP:
1. 找出所有的切面Bean
2. 遍历切面中的每个方法,看是否写了@Before、@After等注解
3. 如果写了,则判断所对应的Pointcut是否和当前Bean对象的类是否匹配
4. 如果匹配则表示当前Bean对象有匹配的的Pointcut,表示需要进行AOP
利用cglib进行AOP的大致流程:
生成代理类UserServiceProxy,代理类继承UserService
代理类中重写了父类的方法,比如UserService中的test()方法
代理类中还会有一个target属性,该属性的值为被代理对象(也就是通过UserService类推断构造方法实例化出来的对象,进行了依赖注入、初始化等步骤的
对象)
代理类中的test()方法被执行时的逻辑如下:
a. 执行切面逻辑(@Before)
b. 调用target.test()
当我们从Spring容器得到UserService的Bean对象时,拿到的就是UserServiceProxy所生
成的对象,也就是代理对象。
UserService代理对象.xxx()>>>>执行切面逻辑>>>>target.xxx()
注意target对象不是代理对象,而是被代理对象。