在线记录源码调试之@EnableAspectJAutoProxy与Spring AOP(二)创建cglib动态代理

测试用例1

连接点

@Component
public class UserServiceImpl implements UserService {

    @Override
    public void save(UserInfo userInfo) {
        System.out.println("执行保存:"+userInfo.getName());
    }
}

测试用例2

切点pointCut、切面testAspect、前置通知methodBefore和后置通知methodAfter

@Aspect
@Component
public class TestAspect {

    @Pointcut("execution(* com.helloworld.service.impl.UserServiceImpl.*(..))")
    public void pointCut(){};

    @Before(value = "pointCut()")
    public void methodBefore(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("执行目标方法【"+methodName+"】的<前置通知>,入参"+ Arrays.asList(joinPoint.getArgs()));
    }

    @After(value = "pointCut()")
    public void methodAfter(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        System.out.println("执行目标方法【"+methodName+"】的<后置通知>,入参"+Arrays.asList(joinPoint.getArgs()));
    }
}

测试用例3

测试用例:启动引导类,新建spring容器对象AnnotationConfigApplicationContext

@Configuration
@ComponentScan
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class DemoApplication {
    public static void main( String[] args ) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(DemoApplication.class);
        UserService userService = (UserService) ctx.getBean("userServiceImpl");
        UserInfo userInfo = (UserInfo) ctx.getBean("user_zhangsan");
        userService.save(userInfo);
    }
}

首先定位到创建第一个bean实例DemoApplication

将断点打到AbstractAutowireCapableBeanFactory.doCreateBean方法,则代码执行过程如下

代码块1:main

构造器

参数:args=[]

package com.helloworld;

public class DemoApplication {

    public static void main( String[] args ) { //args=[];

        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(DemoApplication.class);

        "(1) 构造器"

        "参数:annotatedClasses=class com.helloworld.DemoApplication,"

				......
    }

}

代码块2:AnnotationConfigApplicationContext()

刷新

参数:annotatedClasses=class com.helloworld.DemoApplication,

package org.springframework.context.annotation;

public class AnnotationConfigApplicationContext extends GenericApplicationContext implements AnnotationConfigRegistry{

	public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { //annotatedClasses=class com.helloworld.DemoApplication,;
				......

		refresh();

		"(2) 刷新"

	}

}

代码块3:refresh

完成Bean工厂初始化

package org.springframework.context.support;

public class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext{

	@Override
	public void refresh() throws BeansException, IllegalStateException {
				......

				finishBeanFactoryInitialization(beanFactory); //11. 初始化剩下的 (non-lazy-init) 单例. 	beanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@1dfe2924: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,demoApplication,testAspect,userController,userServiceImpl,user_zhangsan,org.springframework.aop.config.internalAutoProxyCreator]; root of factory hierarchy; 

				"(3) 完成Bean工厂初始化"

				"参数:beanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@1dfe2924: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,demoApplication,testAspect,userController,userServiceImpl,user_zhangsan,org.springframework.aop.config.internalAutoProxyCreator]; root of factory hierarchy"

				"11. 初始化剩下的 (non-lazy-init) 单例. 	beanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@1dfe2924: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,demoApplication,testAspect,userController,userServiceImpl,user_zhangsan,org.springframework.aop.config.internalAutoProxyCreator]; root of factory hierarchy;"

				......
	}

}

代码块4:finishBeanFactoryInitialization

预实例化单例

参数:beanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@1dfe2924: defining beans [org.springfra…

package org.springframework.context.support;

public class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext{

	protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { //beanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@1dfe2924: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,demoApplication,testAspect,userController,userServiceImpl,user_zhangsan,org.springframework.aop.config.internalAutoProxyCreator]; root of factory hierarchy;
				......

		beanFactory.preInstantiateSingletons(); //5.实例化所有剩余(非懒加载)单例对象 	beanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@1dfe2924: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,demoApplication,testAspect,userController,userServiceImpl,user_zhangsan,org.springframework.aop.config.internalAutoProxyCreator]; root of factory hierarchy; 

		"(4) 预实例化单例"

		"5.实例化所有剩余(非懒加载)单例对象 	beanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@1dfe2924: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,demoApplication,testAspect,userController,userServiceImpl,user_zhangsan,org.springframework.aop.config.internalAutoProxyCreator]; root of factory hierarchy;"

	}

}

代码块5:preInstantiateSingletons

获取Bean

package org.springframework.beans.factory.support;

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory{

	@Override
	public void preInstantiateSingletons() throws BeansException {
				......

					getBean(beanName); //6.如果beanName对应的bean不是FactoryBean,只是普通Bean,通过beanName获取bean实例 	beanName=org.springframework.context.annotation.internalConfigurationAnnotationProcessor; beanName=org.springframework.context.annotation.internalAutowiredAnnotationProcessor; beanName=org.springframework.context.annotation.internalCommonAnnotationProcessor; beanName=org.springframework.context.event.internalEventListenerProcessor; beanName=org.springframework.context.event.internalEventListenerFactory; beanName=demoApplication; beanName=testAspect; beanName=userController; beanName=userServiceImpl; beanName=user_zhangsan; beanName=org.springframework.aop.config.internalAutoProxyCreator; 

					"(5) 获取Bean"

					"参数:name=demoApplication"

					"6.如果beanName对应的bean不是FactoryBean,只是普通Bean,通过beanName获取bean实例 	beanName=org.springframework.context.annotation.internalConfigurationAnnotationProcessor; beanName=org.springframework.context.annotation.internalAutowiredAnnotationProcessor; beanName=org.springframework.context.annotation.internalCommonAnnotationProcessor; beanName=org.springframework.context.event.internalEventListenerProcessor; beanName=org.springframework.context.event.internalEventListenerFactory; beanName=demoApplication; beanName=testAspect; beanName=userController; beanName=userServiceImpl; beanName=user_zhangsan; beanName=org.springframework.aop.config.internalAutoProxyCreator;"

				......
	}

}

代码块6:getBean

获取bean

参数:name=demoApplication

package org.springframework.beans.factory.support;

public class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory{

	@Override
	public Object getBean(String name) throws BeansException { //name=demoApplication;

		return doGetBean(name, null, null, false); //获取name对应的bean实例,如果不存在,则创建一个

		"(6) 获取bean"

		"参数:name=demoApplication"
		"参数:typeCheckOnly=false"

		"获取name对应的bean实例,如果不存在,则创建一个"

	}

}

代码块7:doGetBean

获取单例

参数:name=demoApplication

参数:typeCheckOnly=false

package org.springframework.beans.factory.support;

public class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory{

	@SuppressWarnings("unchecked")
	protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, //name=demoApplication;typeCheckOnly=false;
			@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
				......

					sharedInstance = getSingleton(beanName, () -> {

					"(7) 获取单例"

					"参数:beanName=demoApplication"

				......
	}

}

代码块8:getSingleton

创建Bean

参数:beanName=demoApplication

package org.springframework.beans.factory.support;

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry{

	public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { //beanName=demoApplication;
				......

					singletonObject = singletonFactory.getObject(); //6.执行singletonFactory的getObject方法获取bean实例

					"(8) 创建Bean"

					"参数:beanName=demoApplication"
					"参数:mbd=Root bean: class [com.helloworld.DemoApplication$$EnhancerBySpringCGLIB$$23a7051a]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null"

					"6.执行singletonFactory的getObject方法获取bean实例"

				......
	}

}

代码块9:createBean

创建bean

参数:beanName=demoApplication

参数:mbd=Root bean: class [com.helloworld.DemoApplication E n h a n c e r B y S p r i n g C G L I B EnhancerBySpringCGLIB EnhancerBySpringCGLIB23a7051a]; scope=singleton; abstract=false;…

package org.springframework.beans.factory.support;

public class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory{

	@Override
	protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) //beanName=demoApplication;mbd=Root bean: class [com.helloworld.DemoApplication$$EnhancerBySpringCGLIB$$23a7051a]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null;
			throws BeanCreationException {
				......

			Object beanInstance = doCreateBean(beanName, mbdToUse, args); //5.创建Bean实例(真正创建Bean的方法)

			"(9) 创建bean"

			"参数:beanName=demoApplication"
			"参数:mbd=Root bean: class [com.helloworld.DemoApplication$$EnhancerBySpringCGLIB$$23a7051a]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null"

			"5.创建Bean实例(真正创建Bean的方法)"

				......
	}

}

代码块10:doCreateBean

创建bean实例

参数:beanName=demoApplication

参数:mbd=Root bean: class [com.helloworld.DemoApplication E n h a n c e r B y S p r i n g C G L I B EnhancerBySpringCGLIB EnhancerBySpringCGLIB23a7051a]; scope=singleton; abstract=false;…

package org.springframework.beans.factory.support;

public class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory{

	protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) //beanName=demoApplication;mbd=Root bean: class [com.helloworld.DemoApplication$$EnhancerBySpringCGLIB$$23a7051a]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null;
			throws BeanCreationException {
				......

			instanceWrapper = createBeanInstance(beanName, mbd, args); //3.根据beanName、mbd、args,使用对应的策略创建Bean实例,并返回包装类BeanWrapper 	instanceWrapper=org.springframework.beans.BeanWrapperImpl: wrapping object [com.helloworld.DemoApplication$$EnhancerBySpringCGLIB$$23a7051a@6ee4d9ab]; 

			"(10) 创建bean实例"

			"3.根据beanName、mbd、args,使用对应的策略创建Bean实例,并返回包装类BeanWrapper 	instanceWrapper=org.springframework.beans.BeanWrapperImpl: wrapping object [com.helloworld.DemoApplication$$EnhancerBySpringCGLIB$$23a7051a@6ee4d9ab];"

				......
	}

}

小结:调用栈

首先定位到创建第一个bean实例DemoApplication

  1. *DemoApplication.main()
  2. *AnnotationConfigApplicationContext.AnnotationConfigApplicationContext()
  3. *AbstractApplicationContext.refresh()
  4. *AbstractApplicationContext.finishBeanFactoryInitialization()
  5. *DefaultListableBeanFactory.preInstantiateSingletons()
  6. *AbstractBeanFactory.getBean()
  7. *AbstractBeanFactory.doGetBean()
  8. *DefaultSingletonBeanRegistry.getSingleton()
  9. *AbstractAutowireCapableBeanFactory.createBean()
  10. *AbstractAutowireCapableBeanFactory.doCreateBean()

在创建DemoApplication之前首先调用上一篇文章中注册的后置处理器的前置方法

将断点打到AspectMetadata.AspectMetadata()方法,则代码执行过程如下

代码块11:createBean

实例化前解析

参数:beanName=demoApplication

参数:mbd=Root bean: class [com.helloworld.DemoApplication E n h a n c e r B y S p r i n g C G L I B EnhancerBySpringCGLIB EnhancerBySpringCGLIB23a7051a]; scope=singleton; abstract=false;…

package org.springframework.beans.factory.support;

public class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory{

	@Override
	protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) //beanName=demoApplication;mbd=Root bean: class [com.helloworld.DemoApplication$$EnhancerBySpringCGLIB$$23a7051a]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null;
			throws BeanCreationException {
				......

			Object bean = resolveBeforeInstantiation(beanName, mbdToUse); //3.实例化前的处理,给InstantiationAwareBeanPostProcessor一个机会返回代理对象来替代真正的bean实例,达到“短路”效果

			"(11) 实例化前解析"

			"参数:beanName=demoApplication"
			"参数:mbd=Root bean: class [com.helloworld.DemoApplication$$EnhancerBySpringCGLIB$$23a7051a]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null"

			"3.实例化前的处理,给InstantiationAwareBeanPostProcessor一个机会返回代理对象来替代真正的bean实例,达到“短路”效果"

				......
			Object beanInstance = doCreateBean(beanName, mbdToUse, args);
			"(9)"

	}

}

代码块12:resolveBeforeInstantiation

在实例化之前应用Bean后处理器

参数:beanName=demoApplication

参数:mbd=Root bean: class [com.helloworld.DemoApplication E n h a n c e r B y S p r i n g C G L I B EnhancerBySpringCGLIB EnhancerBySpringCGLIB23a7051a]; scope=singleton; abstract=false;…

package org.springframework.beans.factory.support;

public class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory{

	@Nullable
	protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) { //beanName=demoApplication;mbd=Root bean: class [com.helloworld.DemoApplication$$EnhancerBySpringCGLIB$$23a7051a]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null;
				......

					bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName); //3.实例化前的后置处理器应用(处理InstantiationAwareBeanPostProcessor)

					"(12) 在实例化之前应用Bean后处理器"

					"参数:beanClass=class com.helloworld.DemoApplication$$EnhancerBySpringCGLIB$$23a7051a"
					"参数:beanName=demoApplication"

					"3.实例化前的后置处理器应用(处理InstantiationAwareBeanPostProcessor)"

				......
	}

}

代码块13:applyBeanPostProcessorsBeforeInstantiation

实例化前的后处理

参数:beanClass=class com.helloworld.DemoApplication E n h a n c e r B y S p r i n g C G L I B EnhancerBySpringCGLIB EnhancerBySpringCGLIB23a7051a

参数:beanName=demoApplication

package org.springframework.beans.factory.support;

public class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory{

	@Nullable
	protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) { //beanClass=class com.helloworld.DemoApplication$$EnhancerBySpringCGLIB$$23a7051a;beanName=demoApplication;
				......

				Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName); //该方法可以返回一个构造完成的Bean实例,从而不会继续执行创建Bean实例的“正规的流程”,达到“短路”的效果。

				"(13) 实例化前的后处理"

				"参数:beanClass=class com.helloworld.DemoApplication$$EnhancerBySpringCGLIB$$23a7051a"
				"参数:beanName=demoApplication"

				"该方法可以返回一个构造完成的Bean实例,从而不会继续执行创建Bean实例的“正规的流程”,达到“短路”的效果。"

				......
	}

}

代码块14:postProcessBeforeInstantiation

应跳过

参数:beanClass=class com.helloworld.DemoApplication E n h a n c e r B y S p r i n g C G L I B EnhancerBySpringCGLIB EnhancerBySpringCGLIB23a7051a

参数:beanName=demoApplication

package org.springframework.aop.framework.autoproxy;

public class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor{

	@Override
	public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) { //beanClass=class com.helloworld.DemoApplication$$EnhancerBySpringCGLIB$$23a7051a;beanName=demoApplication;
				......

			if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) {

			"(14) 应跳过"

			"参数:beanClass=class com.helloworld.DemoApplication$$EnhancerBySpringCGLIB$$23a7051a"
			"参数:beanName=demoApplication"

				......
	}

}

代码块15:shouldSkip

查找候选通知

参数:beanClass=class com.helloworld.DemoApplication E n h a n c e r B y S p r i n g C G L I B EnhancerBySpringCGLIB EnhancerBySpringCGLIB23a7051a

参数:beanName=demoApplication

package org.springframework.aop.aspectj.autoproxy;

public class AspectJAwareAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator{

	@Override
	protected boolean shouldSkip(Class<?> beanClass, String beanName) { //beanClass=class com.helloworld.DemoApplication$$EnhancerBySpringCGLIB$$23a7051a;beanName=demoApplication;
				......

		List<Advisor> candidateAdvisors = findCandidateAdvisors(); //1-先获取所有的增强器列表 	candidateAdvisors=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,; 

		"(15) 查找候选通知"

		"1-先获取所有的增强器列表 	candidateAdvisors=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,;"

				......
	}

}

代码块16:findCandidateAdvisors

构建aspectJ通知

package org.springframework.aop.aspectj.annotation;

public class AnnotationAwareAspectJAutoProxyCreator extends AspectJAwareAdvisorAutoProxyCreator{

	@Override
	protected List<Advisor> findCandidateAdvisors() {
				......

			advisors.addAll(this.aspectJAdvisorsBuilder.buildAspectJAdvisors()); //* 使用 @Aspect 注解方式在这里解析* buildAspectJAdvisors 是重点,这个方法找出所有增强方法,存到 BeanFactory 中。**** 以我们 calculate 的 logAspect 为例,这里就是找到它的 所有切面方法【before、after、Around、等】

			"(16) 构建aspectJ通知"

			"* 使用 @Aspect 注解方式在这里解析* buildAspectJAdvisors 是重点,这个方法找出所有增强方法,存到 BeanFactory 中。**** 以我们 calculate 的 logAspect 为例,这里就是找到它的 所有切面方法【before、after、Around、等】"

				......
	}

}

代码块17:buildAspectJAdvisors

构造器

package org.springframework.aop.aspectj.annotation;

public class BeanFactoryAspectJAdvisorsBuilder {

	public List<Advisor> buildAspectJAdvisors() {
				......

								MetadataAwareAspectInstanceFactory factory = // 	factory=BeanFactoryAspectInstanceFactory: bean name 'testAspect'; 

								new BeanFactoryAspectInstanceFactory(this.beanFactory, beanName);

								"(17) 构造器"

								"参数:beanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@1dfe2924: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,demoApplication,testAspect,userController,userServiceImpl,user_zhangsan,org.springframework.aop.config.internalAutoProxyCreator]; root of factory hierarchy"
								"参数:name=testAspect"

								"factory=BeanFactoryAspectInstanceFactory: bean name 'testAspect';"

				......
	}

}

代码块18:BeanFactoryAspectInstanceFactory()

构造器

参数:beanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@1dfe2924: defining beans [org.springfra…

参数:name=testAspect

package org.springframework.aop.aspectj.annotation;

public class BeanFactoryAspectInstanceFactory implements MetadataAwareAspectInstanceFactory{

	public BeanFactoryAspectInstanceFactory(BeanFactory beanFactory, String name, @Nullable Class<?> type) { //beanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@1dfe2924: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,demoApplication,testAspect,userController,userServiceImpl,user_zhangsan,org.springframework.aop.config.internalAutoProxyCreator]; root of factory hierarchy;name=testAspect;
				......

		this.aspectMetadata = new AspectMetadata(resolvedType, name);

		"(18) 构造器"

		"参数:aspectClass=class com.helloworld.aop.TestAspect"
		"参数:aspectName=testAspect"

	}

}

代码块19:AspectMetadata()

创建切面对象元数据对象

参数:aspectClass=class com.helloworld.aop.TestAspect

参数:aspectName=testAspect

package org.springframework.aop.aspectj.annotation;

public class AspectMetadata implements Serializable{

	public AspectMetadata(Class<?> aspectClass, String aspectName) { //aspectClass=class com.helloworld.aop.TestAspect;aspectName=testAspect;

		this.aspectName = aspectName; //切面的名称 	this.aspectName=testAspect; 

		"(19) 创建切面对象元数据对象"

		"切面的名称 	this.aspectName=testAspect;"

				......
	}

}

小结:调用栈

在创建DemoApplication之前首先调用上一篇文章中注册的后置处理器的前置方法

  1. DemoApplication.main()
  2. AnnotationConfigApplicationContext.AnnotationConfigApplicationContext()
  3. AbstractApplicationContext.refresh()
  4. AbstractApplicationContext.finishBeanFactoryInitialization()
  5. DefaultListableBeanFactory.preInstantiateSingletons()
  6. AbstractBeanFactory.getBean()
  7. AbstractBeanFactory.doGetBean()
  8. DefaultSingletonBeanRegistry.getSingleton()
  9. *AbstractAutowireCapableBeanFactory.createBean()
  10. *AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation()
  11. *AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation()
  12. *AbstractAutoProxyCreator.postProcessBeforeInstantiation()
  13. *AspectJAwareAdvisorAutoProxyCreator.shouldSkip()
  14. *AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors()
  15. *BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors()
  16. *BeanFactoryAspectInstanceFactory.BeanFactoryAspectInstanceFactory()
  17. *AspectMetadata.AspectMetadata()

实例化切面前置通知

将断点打到InstantiationModelAwarePointcutAdvisorImpl.InstantiationModelAwarePointcutAdvisorImpl()方法,则代码执行过程如下

代码块20:buildAspectJAdvisors

查找aop通知

package org.springframework.aop.aspectj.annotation;

public class BeanFactoryAspectJAdvisorsBuilder {

	public List<Advisor> buildAspectJAdvisors() {
				......
								MetadataAwareAspectInstanceFactory factory =
										new BeanFactoryAspectInstanceFactory(this.beanFactory, beanName);
								"(17)"


								List<Advisor> classAdvisors = this.advisorFactory.getAdvisors(factory); //生成spring aop advisor,该方法中会解析Advice和Pointcut注解 	classAdvisors=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,; 

								"(20) 查找aop通知"

								"参数:aspectInstanceFactory=BeanFactoryAspectInstanceFactory: bean name 'testAspect'"

								"生成spring aop advisor,该方法中会解析Advice和Pointcut注解 	classAdvisors=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,;"

				......
	}

}

代码块21:getAdvisors

获取通知

参数:aspectInstanceFactory=BeanFactoryAspectInstanceFactory: bean name ‘testAspect’

package org.springframework.aop.aspectj.annotation;

public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFactory implements Serializable{

	@Override
	public List<Advisor> getAdvisors(MetadataAwareAspectInstanceFactory aspectInstanceFactory) { //aspectInstanceFactory=BeanFactoryAspectInstanceFactory: bean name 'testAspect';
				......

			Advisor advisor = getAdvisor(method, lazySingletonAspectInstanceFactory, advisors.size(), aspectName); //构造InstantiationModelAwarePointcutAdvisorImpl 	advisor=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON; advisor=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON; 

			"(21) 获取通知"

			"参数:candidateAdviceMethod=public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)"
			"参数:aspectInstanceFactory=LazySingletonAspectInstanceFactoryDecorator: decorating BeanFactoryAspectInstanceFactory: bean name 'testAspect'"
			"参数:declarationOrderInAspect=0"
			"参数:aspectName=testAspect"

			"构造InstantiationModelAwarePointcutAdvisorImpl 	advisor=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON; advisor=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON;"

				......
	}

}

代码块22:getAdvisor

构造器

参数:candidateAdviceMethod=public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)

参数:aspectInstanceFactory=LazySingletonAspectInstanceFactoryDecorator: decorating BeanFactoryAspectInstanceFactory: bean nam…

参数:declarationOrderInAspect=0

参数:aspectName=testAspect

package org.springframework.aop.aspectj.annotation;

public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFactory implements Serializable{

	@Override
	@Nullable
	public Advisor getAdvisor(Method candidateAdviceMethod, MetadataAwareAspectInstanceFactory aspectInstanceFactory, //candidateAdviceMethod=public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint);aspectInstanceFactory=LazySingletonAspectInstanceFactoryDecorator: decorating BeanFactoryAspectInstanceFactory: bean name 'testAspect';declarationOrderInAspect=0;aspectName=testAspect;
			int declarationOrderInAspect, String aspectName) {
				......

		return new InstantiationModelAwarePointcutAdvisorImpl(expressionPointcut, candidateAdviceMethod,

		"(22) 构造器"

		"参数:declaredPointcut=AspectJExpressionPointcut: () pointCut()"
		"参数:aspectJAdviceMethod=public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)"
		"参数:aspectJAdvisorFactory=org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory@420a85c4"
		"参数:aspectInstanceFactory=LazySingletonAspectInstanceFactoryDecorator: decorating BeanFactoryAspectInstanceFactory: bean name 'testAspect'"
		"参数:declarationOrder=0"
		"参数:aspectName=testAspect"

				......
	}

}

代码块23:InstantiationModelAwarePointcutAdvisorImpl()

创建切点与通知对象实例

参数:declaredPointcut=AspectJExpressionPointcut: () pointCut()

参数:aspectJAdviceMethod=public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)

参数:aspectJAdvisorFactory=org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory@420a85c4

参数:aspectInstanceFactory=LazySingletonAspectInstanceFactoryDecorator: decorating BeanFactoryAspectInstanceFactory: bean nam…

参数:declarationOrder=0

参数:aspectName=testAspect

package org.springframework.aop.aspectj.annotation;

public class InstantiationModelAwarePointcutAdvisorImpl implements InstantiationModelAwarePointcutAdvisor{

	public InstantiationModelAwarePointcutAdvisorImpl(AspectJExpressionPointcut declaredPointcut, //declaredPointcut=AspectJExpressionPointcut: () pointCut();aspectJAdviceMethod=public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint);aspectJAdvisorFactory=org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory@420a85c4;aspectInstanceFactory=LazySingletonAspectInstanceFactoryDecorator: decorating BeanFactoryAspectInstanceFactory: bean name 'testAspect';declarationOrder=0;aspectName=testAspect;
			Method aspectJAdviceMethod, AspectJAdvisorFactory aspectJAdvisorFactory,
			MetadataAwareAspectInstanceFactory aspectInstanceFactory, int declarationOrder, String aspectName) {
				......

		this.aspectJAdviceMethod = aspectJAdviceMethod; //通知方法 	this.aspectJAdviceMethod=public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint); 

		"(23) 创建切点与通知对象实例"

		"通知方法 	this.aspectJAdviceMethod=public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint);"

				......
	}

}

小结:调用栈

实例化切面前置通知

  1. DemoApplication.main()
  2. AnnotationConfigApplicationContext.AnnotationConfigApplicationContext()
  3. AbstractApplicationContext.refresh()
  4. AbstractApplicationContext.finishBeanFactoryInitialization()
  5. DefaultListableBeanFactory.preInstantiateSingletons()
  6. AbstractBeanFactory.getBean()
  7. AbstractBeanFactory.doGetBean()
  8. DefaultSingletonBeanRegistry.getSingleton()
  9. AbstractAutowireCapableBeanFactory.createBean()
  10. AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation()
  11. AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation()
  12. AbstractAutoProxyCreator.postProcessBeforeInstantiation()
  13. AspectJAwareAdvisorAutoProxyCreator.shouldSkip()
  14. AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors()
  15. *BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors()
  16. *ReflectiveAspectJAdvisorFactory.getAdvisors()
  17. *ReflectiveAspectJAdvisorFactory.getAdvisor()
  18. *InstantiationModelAwarePointcutAdvisorImpl.InstantiationModelAwarePointcutAdvisorImpl()

实例化切面后置通知

将断点打到InstantiationModelAwarePointcutAdvisorImpl.InstantiationModelAwarePointcutAdvisorImpl()方法,则代码执行过程如下

代码块24:buildAspectJAdvisors

查找通知

package org.springframework.aop.aspectj.annotation;

public class BeanFactoryAspectJAdvisorsBuilder {

	public List<Advisor> buildAspectJAdvisors() {
				......
								MetadataAwareAspectInstanceFactory factory =
										new BeanFactoryAspectInstanceFactory(this.beanFactory, beanName);
								"(17)"


								List<Advisor> classAdvisors = this.advisorFactory.getAdvisors(factory); //生成spring aop advisor,该方法中会解析Advice和Pointcut注解 	classAdvisors=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,; 

								"(24) 查找通知"

								"参数:aspectInstanceFactory=BeanFactoryAspectInstanceFactory: bean name 'testAspect'"

								"生成spring aop advisor,该方法中会解析Advice和Pointcut注解 	classAdvisors=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,;"

				......
	}

}

代码块25:getAdvisors

获取通知

参数:aspectInstanceFactory=BeanFactoryAspectInstanceFactory: bean name ‘testAspect’

package org.springframework.aop.aspectj.annotation;

public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFactory implements Serializable{

	@Override
	public List<Advisor> getAdvisors(MetadataAwareAspectInstanceFactory aspectInstanceFactory) { //aspectInstanceFactory=BeanFactoryAspectInstanceFactory: bean name 'testAspect';
				......

			Advisor advisor = getAdvisor(method, lazySingletonAspectInstanceFactory, advisors.size(), aspectName); //构造InstantiationModelAwarePointcutAdvisorImpl 	advisor=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON; advisor=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON; 

			"(25) 获取通知"

			"参数:candidateAdviceMethod=public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)"
			"参数:aspectInstanceFactory=LazySingletonAspectInstanceFactoryDecorator: decorating BeanFactoryAspectInstanceFactory: bean name 'testAspect'"
			"参数:declarationOrderInAspect=1"
			"参数:aspectName=testAspect"

			"构造InstantiationModelAwarePointcutAdvisorImpl 	advisor=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON; advisor=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON;"

				......
	}

}

代码块26:getAdvisor

构造器

参数:candidateAdviceMethod=public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)

参数:aspectInstanceFactory=LazySingletonAspectInstanceFactoryDecorator: decorating BeanFactoryAspectInstanceFactory: bean nam…

参数:declarationOrderInAspect=1

参数:aspectName=testAspect

package org.springframework.aop.aspectj.annotation;

public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFactory implements Serializable{

	@Override
	@Nullable
	public Advisor getAdvisor(Method candidateAdviceMethod, MetadataAwareAspectInstanceFactory aspectInstanceFactory, //candidateAdviceMethod=public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint);aspectInstanceFactory=LazySingletonAspectInstanceFactoryDecorator: decorating BeanFactoryAspectInstanceFactory: bean name 'testAspect';declarationOrderInAspect=1;aspectName=testAspect;
			int declarationOrderInAspect, String aspectName) {
				......

		return new InstantiationModelAwarePointcutAdvisorImpl(expressionPointcut, candidateAdviceMethod,

		"(26) 构造器"

		"参数:declaredPointcut=AspectJExpressionPointcut: () pointCut()"
		"参数:aspectJAdviceMethod=public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)"
		"参数:aspectJAdvisorFactory=org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory@420a85c4"
		"参数:aspectInstanceFactory=LazySingletonAspectInstanceFactoryDecorator: decorating BeanFactoryAspectInstanceFactory: bean name 'testAspect'"
		"参数:declarationOrder=1"
		"参数:aspectName=testAspect"

				......
	}

}

代码块27:InstantiationModelAwarePointcutAdvisorImpl()

创建切点与通知对象实例

参数:declaredPointcut=AspectJExpressionPointcut: () pointCut()

参数:aspectJAdviceMethod=public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)

参数:aspectJAdvisorFactory=org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory@420a85c4

参数:aspectInstanceFactory=LazySingletonAspectInstanceFactoryDecorator: decorating BeanFactoryAspectInstanceFactory: bean nam…

参数:declarationOrder=1

参数:aspectName=testAspect

package org.springframework.aop.aspectj.annotation;

public class InstantiationModelAwarePointcutAdvisorImpl implements InstantiationModelAwarePointcutAdvisor{

	public InstantiationModelAwarePointcutAdvisorImpl(AspectJExpressionPointcut declaredPointcut, //declaredPointcut=AspectJExpressionPointcut: () pointCut();aspectJAdviceMethod=public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint);aspectJAdvisorFactory=org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory@420a85c4;aspectInstanceFactory=LazySingletonAspectInstanceFactoryDecorator: decorating BeanFactoryAspectInstanceFactory: bean name 'testAspect';declarationOrder=1;aspectName=testAspect;
			Method aspectJAdviceMethod, AspectJAdvisorFactory aspectJAdvisorFactory,
			MetadataAwareAspectInstanceFactory aspectInstanceFactory, int declarationOrder, String aspectName) {
				......

		this.aspectJAdviceMethod = aspectJAdviceMethod; //通知方法 	this.aspectJAdviceMethod=public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint); 

		"(27) 创建切点与通知对象实例"

		"通知方法 	this.aspectJAdviceMethod=public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint);"

				......
	}

}

小结:调用栈

实例化切面后置通知

  1. DemoApplication.main()
  2. AnnotationConfigApplicationContext.AnnotationConfigApplicationContext()
  3. AbstractApplicationContext.refresh()
  4. AbstractApplicationContext.finishBeanFactoryInitialization()
  5. DefaultListableBeanFactory.preInstantiateSingletons()
  6. AbstractBeanFactory.getBean()
  7. AbstractBeanFactory.doGetBean()
  8. DefaultSingletonBeanRegistry.getSingleton()
  9. AbstractAutowireCapableBeanFactory.createBean()
  10. AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation()
  11. AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation()
  12. AbstractAutoProxyCreator.postProcessBeforeInstantiation()
  13. AspectJAwareAdvisorAutoProxyCreator.shouldSkip()
  14. AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors()
  15. *BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors()
  16. *ReflectiveAspectJAdvisorFactory.getAdvisors()
  17. *ReflectiveAspectJAdvisorFactory.getAdvisor()
  18. *InstantiationModelAwarePointcutAdvisorImpl.InstantiationModelAwarePointcutAdvisorImpl()

定位到创建bean实例userServiceImpl

将断点打到AbstractAutowireCapableBeanFactory.createBeanInstance方法,则代码执行过程如下

代码块28:getBean

获取bean

参数:name=userServiceImpl

package org.springframework.beans.factory.support;

public class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory{

	@Override
	public Object getBean(String name) throws BeansException { //name=userServiceImpl;

		return doGetBean(name, null, null, false); //获取name对应的bean实例,如果不存在,则创建一个

		"(28) 获取bean"

		"参数:name=userServiceImpl"
		"参数:typeCheckOnly=false"

		"获取name对应的bean实例,如果不存在,则创建一个"

	}

}

代码块29:doGetBean

获取单例

参数:name=userServiceImpl

参数:typeCheckOnly=false

package org.springframework.beans.factory.support;

public class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory{

	@SuppressWarnings("unchecked")
	protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, //name=userServiceImpl;typeCheckOnly=false;
			@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
				......

					sharedInstance = getSingleton(beanName, () -> {

					"(29) 获取单例"

					"参数:beanName=userServiceImpl"

				......
	}

}

代码块30:getSingleton

创建Bean

参数:beanName=userServiceImpl

package org.springframework.beans.factory.support;

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry{

	public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) { //beanName=userServiceImpl;
				......

					singletonObject = singletonFactory.getObject(); //6.执行singletonFactory的getObject方法获取bean实例

					"(30) 创建Bean"

					"参数:beanName=userServiceImpl"
					"参数:mbd=Root bean: class [com.helloworld.service.impl.UserServiceImpl]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\project\helloworld\target\classes\com\helloworld\service\impl\UserServiceImpl.class]"

					"6.执行singletonFactory的getObject方法获取bean实例"

				......
	}

}

代码块31:createBean

创建bean

参数:beanName=userServiceImpl

参数:mbd=Root bean: class [com.helloworld.service.impl.UserServiceImpl]; scope=singleton; abstract=false; lazyInit=false; aut…

package org.springframework.beans.factory.support;

public class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory{

	@Override
	protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) //beanName=userServiceImpl;mbd=Root bean: class [com.helloworld.service.impl.UserServiceImpl]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\project\helloworld\target\classes\com\helloworld\service\impl\UserServiceImpl.class];
			throws BeanCreationException {
				......

			Object beanInstance = doCreateBean(beanName, mbdToUse, args); //5.创建Bean实例(真正创建Bean的方法)

			"(31) 创建bean"

			"参数:beanName=userServiceImpl"
			"参数:mbd=Root bean: class [com.helloworld.service.impl.UserServiceImpl]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\project\helloworld\target\classes\com\helloworld\service\impl\UserServiceImpl.class]"

			"5.创建Bean实例(真正创建Bean的方法)"

				......
	}

}

代码块32:doCreateBean

创建Bean实例

参数:beanName=userServiceImpl

参数:mbd=Root bean: class [com.helloworld.service.impl.UserServiceImpl]; scope=singleton; abstract=false; lazyInit=false; aut…

package org.springframework.beans.factory.support;

public class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory{

	protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) //beanName=userServiceImpl;mbd=Root bean: class [com.helloworld.service.impl.UserServiceImpl]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\project\helloworld\target\classes\com\helloworld\service\impl\UserServiceImpl.class];
			throws BeanCreationException {
				......

			instanceWrapper = createBeanInstance(beanName, mbd, args); //3.根据beanName、mbd、args,使用对应的策略创建Bean实例,并返回包装类BeanWrapper 	instanceWrapper=org.springframework.beans.BeanWrapperImpl: wrapping object [com.helloworld.service.impl.UserServiceImpl@23aa363a]; 

			"(32) 创建Bean实例"

			"参数:beanName=userServiceImpl"
			"参数:mbd=Root bean: class [com.helloworld.service.impl.UserServiceImpl]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\project\helloworld\target\classes\com\helloworld\service\impl\UserServiceImpl.class]"

			"3.根据beanName、mbd、args,使用对应的策略创建Bean实例,并返回包装类BeanWrapper 	instanceWrapper=org.springframework.beans.BeanWrapperImpl: wrapping object [com.helloworld.service.impl.UserServiceImpl@23aa363a];"

				......
	}

}

代码块33:createBeanInstance

实例化bean

参数:beanName=userServiceImpl

参数:mbd=Root bean: class [com.helloworld.service.impl.UserServiceImpl]; scope=singleton; abstract=false; lazyInit=false; aut…

package org.springframework.beans.factory.support;

public class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory{

	protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) { //beanName=userServiceImpl;mbd=Root bean: class [com.helloworld.service.impl.UserServiceImpl]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\project\helloworld\target\classes\com\helloworld\service\impl\UserServiceImpl.class];
				......

		return instantiateBean(beanName, mbd); //6.没有特殊处理,则使用默认的构造函数进行bean的实例化 	org.springframework.beans.BeanWrapperImpl: wrapping object [com.helloworld.service.impl.UserServiceImpl@23aa363a]; 

		"(33) 实例化bean"

		"6.没有特殊处理,则使用默认的构造函数进行bean的实例化 	org.springframework.beans.BeanWrapperImpl: wrapping object [com.helloworld.service.impl.UserServiceImpl@23aa363a];"

	}

}

小结:调用栈

定位到创建bean实例userServiceImpl

  1. DemoApplication.main()
  2. AnnotationConfigApplicationContext.AnnotationConfigApplicationContext()
  3. AbstractApplicationContext.refresh()
  4. AbstractApplicationContext.finishBeanFactoryInitialization()
  5. DefaultListableBeanFactory.preInstantiateSingletons()
  6. AbstractBeanFactory.getBean()
  7. AbstractBeanFactory.doGetBean()
  8. DefaultSingletonBeanRegistry.getSingleton()
  9. AbstractAutowireCapableBeanFactory.createBean()
  10. AbstractAutowireCapableBeanFactory.doCreateBean()
  11. AbstractAutowireCapableBeanFactory.populateBean()
  12. AutowiredAnnotationBeanPostProcessor.postProcessProperties()
  13. InjectionMetadata.inject()
  14. AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject()
  15. DefaultListableBeanFactory.resolveDependency()
  16. DefaultListableBeanFactory.doResolveDependency()
  17. DependencyDescriptor.resolveCandidate()
  18. *AbstractBeanFactory.getBean()
  19. *AbstractBeanFactory.doGetBean()
  20. *DefaultSingletonBeanRegistry.getSingleton()
  21. *AbstractAutowireCapableBeanFactory.createBean()
  22. *AbstractAutowireCapableBeanFactory.doCreateBean()
  23. *AbstractAutowireCapableBeanFactory.createBeanInstance()

调用AbstractAutoProxyCreator的后置处理器方法

将断点打到AbstractAutoProxyCreator.postProcessAfterInitialization方法,则代码执行过程如下

代码块34:doCreateBean

初始化Bean

参数:beanName=userServiceImpl

参数:mbd=Root bean: class [com.helloworld.service.impl.UserServiceImpl]; scope=singleton; abstract=false; lazyInit=false; aut…

package org.springframework.beans.factory.support;

public class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory{

	protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) //beanName=userServiceImpl;mbd=Root bean: class [com.helloworld.service.impl.UserServiceImpl]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\project\helloworld\target\classes\com\helloworld\service\impl\UserServiceImpl.class];
			throws BeanCreationException {
				......
			instanceWrapper = createBeanInstance(beanName, mbd, args);
			"(32)"


			exposedObject = initializeBean(beanName, exposedObject, mbd); //10.对bean进行初始化

			"(34) 初始化Bean"

			"参数:beanName=userServiceImpl"
			"参数:mbd=Root bean: class [com.helloworld.service.impl.UserServiceImpl]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\project\helloworld\target\classes\com\helloworld\service\impl\UserServiceImpl.class]"

			"10.对bean进行初始化"

				......
	}

}

代码块35:initializeBean

在初始化后应用Bean后处理器

参数:beanName=userServiceImpl

参数:mbd=Root bean: class [com.helloworld.service.impl.UserServiceImpl]; scope=singleton; abstract=false; lazyInit=false; aut…

package org.springframework.beans.factory.support;

public class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory{

	protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) { //beanName=userServiceImpl;mbd=Root bean: class [com.helloworld.service.impl.UserServiceImpl]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [D:\project\helloworld\target\classes\com\helloworld\service\impl\UserServiceImpl.class];
				......

			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); //4.在初始化后应用BeanPostProcessor的postProcessAfterInitialization方法,允许对bean实例进行包装

			"(35) 在初始化后应用Bean后处理器"

			"参数:beanName=userServiceImpl"

			"4.在初始化后应用BeanPostProcessor的postProcessAfterInitialization方法,允许对bean实例进行包装"

				......
	}

}

代码块36:applyBeanPostProcessorsAfterInitialization

对象初始化后调用后置处理器

参数:beanName=userServiceImpl

package org.springframework.beans.factory.support;

public class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory{

	@Override
	public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) //beanName=userServiceImpl;
			throws BeansException {
				......

			Object current = processor.postProcessAfterInitialization(result, beanName); //执行 spring 容器中 BeanPostProcessor

			"(36) 对象初始化后调用后置处理器"

			"参数:beanName=userServiceImpl"

			"执行 spring 容器中 BeanPostProcessor"

				......
	}

}

代码块37:postProcessAfterInitialization

是否需要增强

参数:beanName=userServiceImpl

package org.springframework.aop.framework.autoproxy;

public class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor{

	@Override
	public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) { //beanName=userServiceImpl;
				......

				return wrapIfNecessary(bean, beanName, cacheKey); //代理对象

				"(37) 是否需要增强"

				"代理对象"

				......
	}

}

小结:调用栈

调用AbstractAutoProxyCreator的后置处理器方法

  1. DemoApplication.main()
  2. AnnotationConfigApplicationContext.AnnotationConfigApplicationContext()
  3. AbstractApplicationContext.refresh()
  4. AbstractApplicationContext.finishBeanFactoryInitialization()
  5. DefaultListableBeanFactory.preInstantiateSingletons()
  6. AbstractBeanFactory.getBean()
  7. AbstractBeanFactory.doGetBean()
  8. DefaultSingletonBeanRegistry.getSingleton()
  9. AbstractAutowireCapableBeanFactory.createBean()
  10. AbstractAutowireCapableBeanFactory.doCreateBean()
  11. AbstractAutowireCapableBeanFactory.populateBean()
  12. AutowiredAnnotationBeanPostProcessor.postProcessProperties()
  13. InjectionMetadata.inject()
  14. AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject()
  15. DefaultListableBeanFactory.resolveDependency()
  16. DefaultListableBeanFactory.doResolveDependency()
  17. DependencyDescriptor.resolveCandidate()
  18. AbstractBeanFactory.getBean()
  19. AbstractBeanFactory.doGetBean()
  20. DefaultSingletonBeanRegistry.getSingleton()
  21. AbstractAutowireCapableBeanFactory.createBean()
  22. *AbstractAutowireCapableBeanFactory.doCreateBean()
  23. *AbstractAutowireCapableBeanFactory.initializeBean()
  24. *AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization()
  25. *AbstractAutoProxyCreator.postProcessAfterInitialization()

根据切入点表达式,与通知进行匹配,找出匹配的通知

将断点打到AopUtils.canApply方法,则代码执行过程如下

代码块38:postProcessAfterInitialization

是否需要增强

参数:beanName=userServiceImpl

package org.springframework.aop.framework.autoproxy;

public class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor{

	@Override
	public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) { //beanName=userServiceImpl;
				......

				return wrapIfNecessary(bean, beanName, cacheKey); //代理对象

				"(38) 是否需要增强"

				"参数:beanName=userServiceImpl"
				"参数:cacheKey=userServiceImpl"

				"代理对象"

				......
	}

}

代码块39:wrapIfNecessary

获取bean的通知

参数:beanName=userServiceImpl

参数:cacheKey=userServiceImpl

package org.springframework.aop.framework.autoproxy;

public class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor{

	protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { //beanName=userServiceImpl;cacheKey=userServiceImpl;
				......

		Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null); //Create proxy if we have advice.增强方法获取 	specificInterceptors=org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,; 

		"(39) 获取bean的通知"

		"参数:beanClass=class com.helloworld.service.impl.UserServiceImpl"
		"参数:beanName=userServiceImpl"

		"Create proxy if we have advice.增强方法获取 	specificInterceptors=org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,;"

				......
	}

}

代码块40:getAdvicesAndAdvisorsForBean

查找符合条件的顾问

参数:beanClass=class com.helloworld.service.impl.UserServiceImpl

参数:beanName=userServiceImpl

package org.springframework.aop.framework.autoproxy;

public class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator{

	@Override
	@Nullable
	protected Object[] getAdvicesAndAdvisorsForBean( //beanClass=class com.helloworld.service.impl.UserServiceImpl;beanName=userServiceImpl;
			Class<?> beanClass, String beanName, @Nullable TargetSource targetSource) {
				......

		List<Advisor> advisors = findEligibleAdvisors(beanClass, beanName); //通过findEligibleAdvisors方法返回对应的通知这个方法回返回所有能应用在指定的Bean上的通知 	advisors=org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,; 

		"(40) 查找符合条件的顾问"

		"参数:beanClass=class com.helloworld.service.impl.UserServiceImpl"
		"参数:beanName=userServiceImpl"

		"通过findEligibleAdvisors方法返回对应的通知这个方法回返回所有能应用在指定的Bean上的通知 	advisors=org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,;"

				......
	}

}

代码块41:findEligibleAdvisors

查找可以申请的顾问

参数:beanClass=class com.helloworld.service.impl.UserServiceImpl

参数:beanName=userServiceImpl

package org.springframework.aop.framework.autoproxy;

public class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator{

	protected List<Advisor> findEligibleAdvisors(Class<?> beanClass, String beanName) { //beanClass=class com.helloworld.service.impl.UserServiceImpl;beanName=userServiceImpl;
				......

		List<Advisor> eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName); //2-获取应用到当前目标类的增强器列表 	eligibleAdvisors=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,; 

		"(41) 查找可以申请的顾问"

		"参数:candidateAdvisors=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,"
		"参数:beanClass=class com.helloworld.service.impl.UserServiceImpl"
		"参数:beanName=userServiceImpl"

		"2-获取应用到当前目标类的增强器列表 	eligibleAdvisors=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,;"

				......
	}

}

代码块42:findAdvisorsThatCanApply

查找可用的通知

参数:candidateAdvisors=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.hellow…

参数:beanClass=class com.helloworld.service.impl.UserServiceImpl

参数:beanName=userServiceImpl

package org.springframework.aop.framework.autoproxy;

public class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator{

	protected List<Advisor> findAdvisorsThatCanApply( //candidateAdvisors=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,;beanClass=class com.helloworld.service.impl.UserServiceImpl;beanName=userServiceImpl;
			List<Advisor> candidateAdvisors, Class<?> beanClass, String beanName) {
				......

			return AopUtils.findAdvisorsThatCanApply(candidateAdvisors, beanClass); //1-在候选增强器中找出可作用于目标Bean的增强器 	InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,; 

			"(42) 查找可用的通知"

			"参数:candidateAdvisors=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,"
			"参数:clazz=class com.helloworld.service.impl.UserServiceImpl"

			"1-在候选增强器中找出可作用于目标Bean的增强器 	InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,;"

				......
	}

}

代码块43:findAdvisorsThatCanApply

判断是否可用

参数:candidateAdvisors=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.hellow…

参数:clazz=class com.helloworld.service.impl.UserServiceImpl

package org.springframework.aop.support;

public class AopUtils {

	public static List<Advisor> findAdvisorsThatCanApply(List<Advisor> candidateAdvisors, Class<?> clazz) { //candidateAdvisors=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,;clazz=class com.helloworld.service.impl.UserServiceImpl;
				......

			if (canApply(candidate, clazz, hasIntroductions)) { // 	clazz=class com.helloworld.service.impl.UserServiceImpl; hasIntroductions=false; candidate=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON; clazz=class com.helloworld.service.impl.UserServiceImpl; hasIntroductions=false; candidate=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON; 

			eligibleAdvisors.add(candidate); //2-添加通知增强 	candidate=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON; candidate=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON;

			"(43) 判断是否可用"

			"参数:advisor=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON"
			"参数:targetClass=class com.helloworld.service.impl.UserServiceImpl"
			"参数:hasIntroductions=false"

			"clazz=class com.helloworld.service.impl.UserServiceImpl; hasIntroductions=false; candidate=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON; clazz=class com.helloworld.service.impl.UserServiceImpl; hasIntroductions=false; candidate=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON;"

				......
	}

}

代码块44:canApply

判断是否可用

参数:advisor=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.T…

参数:targetClass=class com.helloworld.service.impl.UserServiceImpl

参数:hasIntroductions=false

package org.springframework.aop.support;

public class AopUtils {

	public static boolean canApply(Advisor advisor, Class<?> targetClass, boolean hasIntroductions) { //advisor=InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON;targetClass=class com.helloworld.service.impl.UserServiceImpl;hasIntroductions=false;
				......

			return canApply(pca.getPointcut(), targetClass, hasIntroductions); //执行 	true; 

			"(44) 判断是否可用"

			"参数:pc=AspectJExpressionPointcut: () pointCut()"
			"参数:targetClass=class com.helloworld.service.impl.UserServiceImpl"
			"参数:hasIntroductions=false"

			"执行 	true;"

				......
	}

}

代码块45:canApply

使用切点表达式进行匹配

参数:pc=AspectJExpressionPointcut: () pointCut()

参数:targetClass=class com.helloworld.service.impl.UserServiceImpl

参数:hasIntroductions=false

package org.springframework.aop.support;

public class AopUtils {

	public static boolean canApply(Pointcut pc, Class<?> targetClass, boolean hasIntroductions) { //pc=AspectJExpressionPointcut: () pointCut();targetClass=class com.helloworld.service.impl.UserServiceImpl;hasIntroductions=false;
				......

						methodMatcher.matches(method, targetClass)) { // 	targetClass=class com.helloworld.service.impl.UserServiceImpl; method=public void com.helloworld.service.impl.UserServiceImpl.save(com.helloworld.entity.UserInfo); hasIntroductions=false; 

						return true;

						"(45) 使用切点表达式进行匹配"

						"targetClass=class com.helloworld.service.impl.UserServiceImpl; method=public void com.helloworld.service.impl.UserServiceImpl.save(com.helloworld.entity.UserInfo); hasIntroductions=false;"

				......
	}

}

小结:调用栈

根据切入点表达式,与通知进行匹配,找出匹配的通知

  1. DemoApplication.main()
  2. AnnotationConfigApplicationContext.AnnotationConfigApplicationContext()
  3. AbstractApplicationContext.refresh()
  4. AbstractApplicationContext.finishBeanFactoryInitialization()
  5. DefaultListableBeanFactory.preInstantiateSingletons()
  6. AbstractBeanFactory.getBean()
  7. AbstractBeanFactory.doGetBean()
  8. DefaultSingletonBeanRegistry.getSingleton()
  9. AbstractAutowireCapableBeanFactory.createBean()
  10. AbstractAutowireCapableBeanFactory.doCreateBean()
  11. AbstractAutowireCapableBeanFactory.populateBean()
  12. AutowiredAnnotationBeanPostProcessor.postProcessProperties()
  13. InjectionMetadata.inject()
  14. AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject()
  15. DefaultListableBeanFactory.resolveDependency()
  16. DefaultListableBeanFactory.doResolveDependency()
  17. DependencyDescriptor.resolveCandidate()
  18. AbstractBeanFactory.getBean()
  19. AbstractBeanFactory.doGetBean()
  20. DefaultSingletonBeanRegistry.getSingleton()
  21. AbstractAutowireCapableBeanFactory.createBean()
  22. AbstractAutowireCapableBeanFactory.doCreateBean()
  23. AbstractAutowireCapableBeanFactory.initializeBean()
  24. AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization()
  25. *AbstractAutoProxyCreator.postProcessAfterInitialization()
  26. *AbstractAutoProxyCreator.wrapIfNecessary()
  27. *AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean()
  28. *AbstractAdvisorAutoProxyCreator.findEligibleAdvisors()
  29. *AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply()
  30. *AopUtils.findAdvisorsThatCanApply()
  31. *AopUtils.canApply()
  32. *AopUtils.canApply()

创建aop代理对象

将断点打到CglibAopProxy.CglibAopProxy()方法,则代码执行过程如下

代码块46:wrapIfNecessary

创建代理

参数:beanName=userServiceImpl

参数:cacheKey=userServiceImpl

package org.springframework.aop.framework.autoproxy;

public class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor{

	protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { //beanName=userServiceImpl;cacheKey=userServiceImpl;
				......
		Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
		"(39)"


			Object proxy = createProxy(

			"(46) 创建代理"

			"参数:beanClass=class com.helloworld.service.impl.UserServiceImpl"
			"参数:beanName=userServiceImpl"
			"参数:specificInterceptors=org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,"
			"参数:targetSource=SingletonTargetSource for target object [com.helloworld.service.impl.UserServiceImpl@23aa363a]"

				......
	}

}

代码块47:createProxy

获取代理

参数:beanClass=class com.helloworld.service.impl.UserServiceImpl

参数:beanName=userServiceImpl

参数:specificInterceptors=org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR,InstantiationModelAwarePoin…

参数:targetSource=SingletonTargetSource for target object [com.helloworld.service.impl.UserServiceImpl@23aa363a]

package org.springframework.aop.framework.autoproxy;

public class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor{

	protected Object createProxy(Class<?> beanClass, @Nullable String beanName, //beanClass=class com.helloworld.service.impl.UserServiceImpl;beanName=userServiceImpl;specificInterceptors=org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,;targetSource=SingletonTargetSource for target object [com.helloworld.service.impl.UserServiceImpl@23aa363a];
			@Nullable Object[] specificInterceptors, TargetSource targetSource) {
				......

		return proxyFactory.getProxy(getProxyClassLoader()); //创建代理

		"(47) 获取代理"

		"创建代理"

	}

}

代码块48:getProxy

创建AOP代理

package org.springframework.aop.framework;

public class ProxyFactory extends ProxyCreatorSupport{

	public Object getProxy(@Nullable ClassLoader classLoader) {

		return createAopProxy().getProxy(classLoader); //创建AOP代理,并获取代理对象

		"(48) 创建AOP代理"

		"创建AOP代理,并获取代理对象"

	}

}

代码块49:createAopProxy

创建AOP代理

package org.springframework.aop.framework;

public class ProxyCreatorSupport extends AdvisedSupport{

	protected final synchronized AopProxy createAopProxy() {
				......

		return getAopProxyFactory().createAopProxy(this); //此处的this实际上就是ProxyFactory

		"(49) 创建AOP代理"

		"参数:config=org.springframework.aop.framework.ProxyFactory: 0 interfaces []; 3 advisors [org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR, InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON, InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON]; targetSource [SingletonTargetSource for target object [com.helloworld.service.impl.UserServiceImpl@23aa363a]]; proxyTargetClass=true; optimize=false; opaque=false; exposeProxy=false; frozen=false"

		"此处的this实际上就是ProxyFactory"

	}

}

代码块50:createAopProxy

init

参数:config=org.springframework.aop.framework.ProxyFactory: 0 interfaces []; 3 advisors [org.springframework.aop.interceptor…

package org.springframework.aop.framework;

public class DefaultAopProxyFactory implements AopProxyFactory{

	@Override
	public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { //config=org.springframework.aop.framework.ProxyFactory: 0 interfaces []; 3 advisors [org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR, InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON, InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON]; targetSource [SingletonTargetSource for target object [com.helloworld.service.impl.UserServiceImpl@23aa363a]]; proxyTargetClass=true; optimize=false; opaque=false; exposeProxy=false; frozen=false;
				......

			return new ObjenesisCglibAopProxy(config); //否则使用 CGLIB 代理

			"(50) init"

			"参数:config=org.springframework.aop.framework.ProxyFactory: 0 interfaces []; 3 advisors [org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR, InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON, InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON]; targetSource [SingletonTargetSource for target object [com.helloworld.service.impl.UserServiceImpl@23aa363a]]; proxyTargetClass=true; optimize=false; opaque=false; exposeProxy=false; frozen=false"

			"否则使用 CGLIB 代理"

				......
	}

}

代码块51:CglibAopProxy()

构造器

参数:config=org.springframework.aop.framework.ProxyFactory: 0 interfaces []; 3 advisors [org.springframework.aop.interceptor…

package org.springframework.aop.framework;

public class CglibAopProxy implements AopProxy{

	public CglibAopProxy(AdvisedSupport config) throws AopConfigException { //config=org.springframework.aop.framework.ProxyFactory: 0 interfaces []; 3 advisors [org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR, InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON, InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON]; targetSource [SingletonTargetSource for target object [com.helloworld.service.impl.UserServiceImpl@23aa363a]]; proxyTargetClass=true; optimize=false; opaque=false; exposeProxy=false; frozen=false;
				......

		this.advised = config; //此处的config就是之前的ProxyFactory 	this.advised=org.springframework.aop.framework.ProxyFactory: 0 interfaces []; 3 advisors [org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR, InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON, InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON]; targetSource [SingletonTargetSource for target object [com.helloworld.service.impl.UserServiceImpl@23aa363a]]; proxyTargetClass=true; optimize=false; opaque=false; exposeProxy=false; frozen=false; 

		"(51) 构造器"

		"此处的config就是之前的ProxyFactory 	this.advised=org.springframework.aop.framework.ProxyFactory: 0 interfaces []; 3 advisors [org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR, InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON, InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON]; targetSource [SingletonTargetSource for target object [com.helloworld.service.impl.UserServiceImpl@23aa363a]]; proxyTargetClass=true; optimize=false; opaque=false; exposeProxy=false; frozen=false;"

				......
	}

}

小结:调用栈

创建aop代理对象

  1. DemoApplication.main()
  2. AnnotationConfigApplicationContext.AnnotationConfigApplicationContext()
  3. AbstractApplicationContext.refresh()
  4. AbstractApplicationContext.finishBeanFactoryInitialization()
  5. DefaultListableBeanFactory.preInstantiateSingletons()
  6. AbstractBeanFactory.getBean()
  7. AbstractBeanFactory.doGetBean()
  8. DefaultSingletonBeanRegistry.getSingleton()
  9. AbstractAutowireCapableBeanFactory.createBean()
  10. AbstractAutowireCapableBeanFactory.doCreateBean()
  11. AbstractAutowireCapableBeanFactory.populateBean()
  12. AutowiredAnnotationBeanPostProcessor.postProcessProperties()
  13. InjectionMetadata.inject()
  14. AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject()
  15. DefaultListableBeanFactory.resolveDependency()
  16. DefaultListableBeanFactory.doResolveDependency()
  17. DependencyDescriptor.resolveCandidate()
  18. AbstractBeanFactory.getBean()
  19. AbstractBeanFactory.doGetBean()
  20. DefaultSingletonBeanRegistry.getSingleton()
  21. AbstractAutowireCapableBeanFactory.createBean()
  22. AbstractAutowireCapableBeanFactory.doCreateBean()
  23. AbstractAutowireCapableBeanFactory.initializeBean()
  24. AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization()
  25. AbstractAutoProxyCreator.postProcessAfterInitialization()
  26. *AbstractAutoProxyCreator.wrapIfNecessary()
  27. *AbstractAutoProxyCreator.createProxy()
  28. *ProxyFactory.getProxy()
  29. *ProxyCreatorSupport.createAopProxy()
  30. *DefaultAopProxyFactory.createAopProxy()
  31. *CglibAopProxy.CglibAopProxy()

创建userServiceImpl的代理对象

将断点打到SpringObjenesis.newInstance方法,则代码执行过程如下

代码块52:wrapIfNecessary

创建代理

参数:beanName=userServiceImpl

参数:cacheKey=userServiceImpl

package org.springframework.aop.framework.autoproxy;

public class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor{

	protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { //beanName=userServiceImpl;cacheKey=userServiceImpl;
				......
		Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
		"(39)"


			Object proxy = createProxy(

			"(52) 创建代理"

			"参数:beanClass=class com.helloworld.service.impl.UserServiceImpl"
			"参数:beanName=userServiceImpl"
			"参数:specificInterceptors=org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,"
			"参数:targetSource=SingletonTargetSource for target object [com.helloworld.service.impl.UserServiceImpl@23aa363a]"

				......
	}

}

代码块53:createProxy

获取代理

参数:beanClass=class com.helloworld.service.impl.UserServiceImpl

参数:beanName=userServiceImpl

参数:specificInterceptors=org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR,InstantiationModelAwarePoin…

参数:targetSource=SingletonTargetSource for target object [com.helloworld.service.impl.UserServiceImpl@23aa363a]

package org.springframework.aop.framework.autoproxy;

public class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor{

	protected Object createProxy(Class<?> beanClass, @Nullable String beanName, //beanClass=class com.helloworld.service.impl.UserServiceImpl;beanName=userServiceImpl;specificInterceptors=org.springframework.aop.interceptor.ExposeInvocationInterceptor.ADVISOR,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodAfter(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,InstantiationModelAwarePointcutAdvisor: expression [pointCut()]; advice method [public void com.helloworld.aop.TestAspect.methodBefore(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON,;targetSource=SingletonTargetSource for target object [com.helloworld.service.impl.UserServiceImpl@23aa363a];
			@Nullable Object[] specificInterceptors, TargetSource targetSource) {
				......

		return proxyFactory.getProxy(getProxyClassLoader()); //创建代理

		"(53) 获取代理"

		"创建代理"

	}

}

代码块54:getProxy

获取代理

package org.springframework.aop.framework;

public class ProxyFactory extends ProxyCreatorSupport{

	public Object getProxy(@Nullable ClassLoader classLoader) {

		return createAopProxy().getProxy(classLoader); //创建AOP代理,并获取代理对象

		"(54) 获取代理"

		"创建AOP代理,并获取代理对象"

	}

}

代码块55:getProxy

创建代理类和实例,经典的cglib创建动态代理的步骤

package org.springframework.aop.framework;

public class CglibAopProxy implements AopProxy{

	@Override
	public Object getProxy(@Nullable ClassLoader classLoader) {
				......
		if (logger.isTraceEnabled()) { //1. 循环 PropertySources
			logger.trace("Creating CGLIB proxy: " + this.advised.getTargetSource());
		}

		try {
			Class<?> rootClass = this.advised.getTargetClass(); //得到要被代理的class类 	rootClass=class com.helloworld.service.impl.UserServiceImpl; 
			Assert.state(rootClass != null, "Target class must be available for creating a CGLIB proxy");

			Class<?> proxySuperClass = rootClass; //代理对象的父类(cglib是采用继承的方式是创建代理对象的,所以将被代理的类作为代理对象的父类) 	proxySuperClass=class com.helloworld.service.impl.UserServiceImpl; 
			if (ClassUtils.isCglibProxyClass(rootClass)) {
				proxySuperClass = rootClass.getSuperclass();
				Class<?>[] additionalInterfaces = rootClass.getInterfaces(); //添加需要被代理的接口
				for (Class<?> additionalInterface : additionalInterfaces) {
					this.advised.addInterface(additionalInterface);
				}
			}

			// Validate the class, writing log messages as necessary.
			validateClassIfNecessary(proxySuperClass, classLoader); //验证一下 	proxySuperClass=class com.helloworld.service.impl.UserServiceImpl; 

			// Configure CGLIB Enhancer...
			Enhancer enhancer = createEnhancer(); //除去不必要代码
			if (classLoader != null) { //2.targetTypeName不为空,并且classLoader不为null
				enhancer.setClassLoader(classLoader); //设置classLoader
				if (classLoader instanceof SmartClassLoader &&
						((SmartClassLoader) classLoader).isClassReloadable(proxySuperClass)) {
					enhancer.setUseCache(false);
				}
			}
			enhancer.setSuperclass(proxySuperClass); //设置其要继承的类 	proxySuperClass=class com.helloworld.service.impl.UserServiceImpl; 
			enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised)); //设置其接口
			enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE); //设置命名策略
			enhancer.setStrategy(new ClassLoaderAwareUndeclaredThrowableStrategy(classLoader)); //设置字节码生成策略器,这里设置为 ClassLoaderAwareUndeclaredThrowableStrategy,为对  DefaultGeneratorStrategy 一层封装

			Callback[] callbacks = getCallbacks(rootClass); //生成需要的callback  也就是将我们的advisor按照一定的规则写入到实现了MethodInterceptor的类中 	callbacks=org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor@101639ae,org.springframework.aop.framework.CglibAopProxy$StaticUnadvisedInterceptor@4c550889,org.springframework.aop.framework.CglibAopProxy$SerializableNoOp@1d2bd371,org.springframework.aop.framework.CglibAopProxy$StaticDispatcher@44040454,org.springframework.aop.framework.CglibAopProxy$AdvisedDispatcher@65fe9e33,org.springframework.aop.framework.CglibAopProxy$EqualsInterceptor@18bc345,org.springframework.aop.framework.CglibAopProxy$HashCodeInterceptor@42f8285e,; 
			Class<?>[] types = new Class<?>[callbacks.length]; //创建每个位置其对应的callback,主要是用ProxyCallbackFilter来决定调用哪个callback
			for (int x = 0; x < types.length; x++) { // 	x=0; x=1; x=2; x=3; x=4; x=5; x=6; 
				types[x] = callbacks[x].getClass(); // 	types[x]=class org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor; types[x]=class org.springframework.aop.framework.CglibAopProxy$StaticUnadvisedInterceptor; types[x]=class org.springframework.aop.framework.CglibAopProxy$SerializableNoOp; types[x]=class org.springframework.aop.framework.CglibAopProxy$StaticDispatcher; types[x]=class org.springframework.aop.framework.CglibAopProxy$AdvisedDispatcher; types[x]=class org.springframework.aop.framework.CglibAopProxy$EqualsInterceptor; types[x]=class org.springframework.aop.framework.CglibAopProxy$HashCodeInterceptor; 
			}
			// fixedInterceptorMap only populated at this point, after getCallbacks call above
			enhancer.setCallbackFilter(new ProxyCallbackFilter(
					this.advised.getConfigurationOnlyCopy(), this.fixedInterceptorMap, this.fixedInterceptorOffset));
			enhancer.setCallbackTypes(types); //设置回调类型 	types=class org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor,class org.springframework.aop.framework.CglibAopProxy$StaticUnadvisedInterceptor,class org.springframework.aop.framework.CglibAopProxy$SerializableNoOp,class org.springframework.aop.framework.CglibAopProxy$StaticDispatcher,class org.springframework.aop.framework.CglibAopProxy$AdvisedDispatcher,class org.springframework.aop.framework.CglibAopProxy$EqualsInterceptor,class org.springframework.aop.framework.CglibAopProxy$HashCodeInterceptor,; 

			// Generate the proxy class and create a proxy instance.

			return createProxyClassAndInstance(enhancer, callbacks); //创建并返回代理类

			"(55) 构建代理类实例"

			"参数:callbacks=org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor@101639ae,org.springframework.aop.framework.CglibAopProxy$StaticUnadvisedInterceptor@4c550889,org.springframework.aop.framework.CglibAopProxy$SerializableNoOp@1d2bd371,org.springframework.aop.framework.CglibAopProxy$StaticDispatcher@44040454,org.springframework.aop.framework.CglibAopProxy$AdvisedDispatcher@65fe9e33,org.springframework.aop.framework.CglibAopProxy$EqualsInterceptor@18bc345,org.springframework.aop.framework.CglibAopProxy$HashCodeInterceptor@42f8285e,"

			"创建并返回代理类"

				......
		}
		catch (CodeGenerationException | IllegalArgumentException ex) {
			throw new AopConfigException("Could not generate CGLIB subclass of " + this.advised.getTargetClass() +
					": Common causes of this problem include using a final class or a non-visible class",
					ex);
		}
		catch (Throwable ex) {
			// TargetSource.getTarget() failed
			throw new AopConfigException("Unexpected AOP exception", ex);
		}
	}

}

代码块56:createProxyClassAndInstance

新实例

参数:callbacks=org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor@101639ae,org.springframework.aop.fra…

package org.springframework.aop.framework;

public class ObjenesisCglibAopProxy extends CglibAopProxy{

	@Override
	@SuppressWarnings("unchecked")
	protected Object createProxyClassAndInstance(Enhancer enhancer, Callback[] callbacks) { //callbacks=org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor@101639ae,org.springframework.aop.framework.CglibAopProxy$StaticUnadvisedInterceptor@4c550889,org.springframework.aop.framework.CglibAopProxy$SerializableNoOp@1d2bd371,org.springframework.aop.framework.CglibAopProxy$StaticDispatcher@44040454,org.springframework.aop.framework.CglibAopProxy$AdvisedDispatcher@65fe9e33,org.springframework.aop.framework.CglibAopProxy$EqualsInterceptor@18bc345,org.springframework.aop.framework.CglibAopProxy$HashCodeInterceptor@42f8285e,;
				......

				proxyInstance = objenesis.newInstance(proxyClass, enhancer.getUseCache()); //如果没有配置spring.objenesis.ignore,则创建代理实现

				"(56) 新实例"

				"参数:clazz=class com.helloworld.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$479344f1"
				"参数:useCache=true"

				"如果没有配置spring.objenesis.ignore,则创建代理实现"

				......
	}

}

代码块57:newInstance

返回代理对象实例

参数:clazz=class com.helloworld.service.impl.UserServiceImpl E n h a n c e r B y S p r i n g C G L I B EnhancerBySpringCGLIB EnhancerBySpringCGLIB479344f1

参数:useCache=true

package org.springframework.objenesis;

public class SpringObjenesis implements Objenesis{

	public <T> T newInstance(Class<T> clazz, boolean useCache) { //clazz=class com.helloworld.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$479344f1;useCache=true;
				......

		return getInstantiatorOf(clazz).newInstance();

		"(57) 返回代理对象实例,完成动态代理的创建"

	}

}

小结:调用栈

创建userServiceImpl的代理对象

  1. DemoApplication.main()
  2. AnnotationConfigApplicationContext.AnnotationConfigApplicationContext()
  3. AbstractApplicationContext.refresh()
  4. AbstractApplicationContext.finishBeanFactoryInitialization()
  5. DefaultListableBeanFactory.preInstantiateSingletons()
  6. AbstractBeanFactory.getBean()
  7. AbstractBeanFactory.doGetBean()
  8. DefaultSingletonBeanRegistry.getSingleton()
  9. AbstractAutowireCapableBeanFactory.createBean()
  10. AbstractAutowireCapableBeanFactory.doCreateBean()
  11. AbstractAutowireCapableBeanFactory.populateBean()
  12. AutowiredAnnotationBeanPostProcessor.postProcessProperties()
  13. InjectionMetadata.inject()
  14. AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject()
  15. DefaultListableBeanFactory.resolveDependency()
  16. DefaultListableBeanFactory.doResolveDependency()
  17. DependencyDescriptor.resolveCandidate()
  18. AbstractBeanFactory.getBean()
  19. AbstractBeanFactory.doGetBean()
  20. DefaultSingletonBeanRegistry.getSingleton()
  21. AbstractAutowireCapableBeanFactory.createBean()
  22. AbstractAutowireCapableBeanFactory.doCreateBean()
  23. AbstractAutowireCapableBeanFactory.initializeBean()
  24. AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization()
  25. AbstractAutoProxyCreator.postProcessAfterInitialization()
  26. *AbstractAutoProxyCreator.wrapIfNecessary()
  27. *AbstractAutoProxyCreator.createProxy()
  28. *ProxyFactory.getProxy()
  29. *CglibAopProxy.getProxy()
  30. *ObjenesisCglibAopProxy.createProxyClassAndInstance()
  31. *SpringObjenesis.newInstance()

完整代码版

##文章过长,完整代码版单独发布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值