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