Spring源码(一)之AOP

/**
 * 执行流程.
 *
 *	1.为容器中注册AnnotationAwareAspectJAutoProxyCreator
 *		1.1获取AopTest 这个类上注解的所有信息,进行相应类的加载
 * 			invokeBeanFactoryPostProcessors(beanFactory);
 * 				PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
 * 				1.2//获取注解对应类的定义
 * 				invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
 * 					1.3 ConfigurationClassPostProcessor 此时调用此方法 ,这个后置处理是bean容器初始化时候自行加入的,
 * 						可以去看register(componentClasses);
 * 							1.4执行:postProcessor.postProcessBeanDefinitionRegistry(registry);
 * 									(加载类的定义信息  Set<ConfigurationClass> 为传入的参数,扫描到的所有类)
 * 										--> this.reader.loadBeanDefinitions(configClasses);
 * 							1.5 如果是AopTest 需要获取注解Import导入的方法
 * 									-->loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars());
 * 							1.6 调用注册bean定义的方法(AspectJAutoProxyRegistrar 为实现类),
 * 									此时为bean容器中注册AnnotationAwareAspectJAutoProxyCreator
 *									-->registrar.registerBeanDefinitions(metadata, this.registry));
 *
 * 2.	开始注册所有后置处理器BeanPostProcessors  ->>>   registerBeanPostProcessors(beanFactory);
 * 		2.1获取容器中所有BeanPostProcessor 名称
 * 			String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
 * 		2.2 注册实现 PriorityOrdered  的 BeanPostProcessors
 * 			sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
 * 		2.3 真正开始创建     org.springframework.beans.factory.support.DefaultListableBeanFactory
 * 			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
 * 				->> 开始创建单实例bean
 * 					sharedInstance = getSingleton(beanName, () -> {
 * 						try {
 * 							return createBean(beanName, mbd, args);
 *                                                }
 * 						catch (BeansException ex) {
 * 							// Explicitly remove instance from singleton cache: It might have been put there
 * 							// eagerly by the creation process, to allow for circular reference resolution.
 * 							// Also remove any beans that received a temporary reference to the bean.
 * 							destroySingleton(beanName);
 * 							throw ex;
 *                        }
 *                   });
 *  3.开始创建我们的目标对象
 *  	3.1 对象创建完毕
 *  	3.2--->>属性填充
 *			populateBean(beanName, mbd, instanceWrapper);
 *		3.3--->> 此时AOP代理的Processer开始发挥作用
 * 			exposedObject = initializeBean(beanName, exposedObject, mbd);
 *
 *		 真正生成代理对象的方法
		 * 		Object wrappedBean = bean;
		 * 		if (mbd == null || !mbd.isSynthetic()) {
 * 					//应用 processor.postProcessBeforeInitialization(result, beanName); 	前置处理器
		 * 			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		 *      }
		 *
		 * 		try {
		 * 			invokeInitMethods(beanName, wrappedBean, mbd);
		 *        }
		 * 		catch (Throwable ex) {
		 * 			throw new BeanCreationException(
		 * 					(mbd != null ? mbd.getResourceDescription() : null),
		 * 					beanName, "Invocation of init method failed", ex);
		 *        }
		 * 		if (mbd == null || !mbd.isSynthetic()) {
		 * 			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		 *      }
 *
 *  4.   AOP生成代理对象 其实走的后置处理器
 *  	wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
 *  		4.1//判断是否需要代理
 * 			Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
 * 			4.2开始进行代理对象创建
 * 			Object proxy = createProxy(
 * 					bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
 *
 * 			//执行代理类的创建,如果有接口,创建JDK动态代理
 * 			if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
 * 				return new JdkDynamicAopProxy(config);
 *          }
 *          //创建cgblib 动态代理
 * 			return new ObjenesisCglibAopProxy(config);
 *
 * 5. 执行Cglib intercept 方法
 *
 *
 */

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值