1. 工作流程及核心概念
- Spring容器启动
- 读取所有切面配置中的切入点,未配置的切入点不进行读取
- 初始化bean,判断bean对应的类中的方法是否匹配到任意切入点
- 匹配成功:在Spring框架中,Bean初始化时会通过扫描程序中的带有特定注解的Bean,并将它们织入到匹配的切入点上。
- 匹配失败:如果一个Bean对应的类中的方法没有匹配到任何切入点,这个Bean仍然会被正常初始化,只是没有被织入到任何切面中。
具体来说,当Spring容器初始化Bean的时候,如果该Bean的类上标记了某个AOP注解,例如@Aspect,则Spring容器会自动创建一个代理来拦截该类所在的切点,使得切面代码能够运行在切点的前、后、抛出异常等关键位置,从而实现特定的功能。
如果某个Bean的类上没有任何AOP注解(如@Aspect),或者虽然注解了但该类的方法没有匹配到任何切入点,那么Spring就会将该类普通实例化,不再实现任何AOP操作。这意味着该Bean将不参与任何AOP操作,而是普通的Bean行为,可以像普通的Java对象一样进行调用等操作。
- 获取bean执行方法
获取到的bean是代理对象时 ,根据代理对象的运行模式运行原始方法与增强的内容,完成操作
1.1 代理对象
这里对上面的代理对象做出一点补充:
- 在AOP中,代理对象是实现切面的核心机制之一。在Spring框架中,当Bean需要织入切面时,Spring容器会对该Bean进行代理,生成代理对象并在运行时拦截指定的连接点,执行切面定义的特定行为,从而实现AOP的横切关注点(pointcut)。
- 具体来说,Spring框架支持两种类型的代理:JDK动态代理和CGLib动态代理。当代理Target对象是一个接口类型时,Spring将使用JDK动态代理来创建代理对象。否则,Spring将使用CGLib动态代理来创建代理对象。无论是哪种类型的代理,Spring在Bean初始化时都会对其进行代理,生成一个新的代理对象,并在运行时将连接点织入到代理对象中,从而实现AOP的目的。
- 因此,如果某个Bean是代理对象,通常意味着它已经被Spring框架代理并实现了AOP的横切关注点,可以在运行时通过代理对象进行调用,触发相应的切面逻辑。同时,代理对象通常会包含与其对应的目标对象的引用,以便在代理中可以调用目标对象中的代码。
- 实际上就是代理对象实现了和目标对象相同的接口或继承了目标对象的所有方法,并且在代理对象中引入了切面逻辑。