Spring Aop -@EnableAspectJAutoProxy Bean生成过程

@EnableAspectJAutoProxy文件:@Import(AspectJAutoProxyRegistrar.class)
所以AspectJAutoProxyRegistrar起关键作用,看一下它的实现:

// 继承了 ImportBeanDefinitionRegistrar 接口,该接口用于生成自定义的 Bean
	class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar
	public void registerBeanDefinitions(
			AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry){
		...
		// 注册这个组件,跟进去看一下
		AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);			
		...
	}
	@Nullable
	public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry) {
		return registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry, null);
	}

	@Nullable
	public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(
			BeanDefinitionRegistry registry, @Nullable Object source) {
		// 传入一个 class,用它来创建 Bean,它很重要,下面会详细分析。跟进去
		return registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source);
	}
	public static final String AUTO_PROXY_CREATOR_BEAN_NAME =
			"org.springframework.aop.config.internalAutoProxyCreator"; //BeanID
	
	private static BeanDefinition registerOrEscalateApcAsRequired(
			Class<?> cls, BeanDefinitionRegistry registry, @Nullable Object source) {
		...
		// 看看有没有现成的,第一次进入肯定返回 false
		if (registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)) {...}
		//根据传入的 class 创建 bean 的定义,用于生成 bean
		RootBeanDefinition beanDefinition = new RootBeanDefinition(cls);
		...
		// 生成 bean, 参数是 BeanID 和 bean 定义
		registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition);
		return beanDefinition;
	}

那么 IOC 容器对处理器的创建过程是怎样的呢
首先看一下AnnotationAwareAspectJAutoProxyCreator类(就是刚刚生成 bean 的类)的继承关系:
AnnotationAwareAspectJAutoProxyCreator类的继承关系
我们发现它实现了两个关键的接口:
BeanFactoryAware:获得BeanFactory
InstantiationAwareBeanPostProcessor:实例化的过程,这个很重要,下面会讲到它的作用。

现在进入 IOC 的创建过程,只关注 AnnotationAwareAspectJAutoProxyCreator 对应的 Bean

AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(MainConfig.class);
	public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
		this();
		register(componentClasses); //注册配置类
		refresh(); // 进入这个方法
	}
	public void refresh() throws BeansException, IllegalStateException {
		...
		// Register bean processors that intercept bean creation.
		registerBeanPostProcessors(beanFactory); // 先进入这个方法
		...
		// Instantiate all remaining (non-lazy-init) singletons.
		finishBeanFactoryInitialization(beanFactory); // 注册完处理器后会进入该方法实例化(肯定是单例)
		...
	}

1.先进入registerBeanPostProcessors:

	protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);// 进入
	}
	public static void registerBeanPostProcessors(
			ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
		// 先获取ioc容器已经定义了的需要创建对象的所有 BeanPostProcessor
		String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
		...
		// orderedPostProcessorNames 是实现了 Ordered 接口的处理器
		for (String ppName : orderedPostProcessorNames) { //上面的继承关系图可知,继承了 Ordered 接口
			//获取(如果没有就创建) Bean,跟进去
			BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
			orderedPostProcessors.add(pp);			
		}
		...
	}
	public <T> T getBean(String name, Class<T> requiredType) throws BeansException {
		return doGetBean(name, requiredType, null, false);// 跟进去
	}
	protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
			@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
		...
		// 看看有没有现成的,第一次肯定没有,接着往下走
		Object sharedInstance = getSingleton(beanName);
		...
				if (mbd.isSingleton()) {
					sharedInstance = getSingleton(beanName, () -> {
						try {
							// 创建 Bean,进去!
							return createBean(beanName, mbd, args);
						}
						...
				}
		...
	}
	protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
			throws BeanCreationException {
		...
		try {
			// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
			// 这里进去进行前置操作和后置操作,此处返回 null。原因在下面有讲到
			Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
			if (bean != null) {
				return bean;
			}
		}
		...
		try {
			// 创建 Bean,进去
			Object beanInstance = doCreateBean(beanName, mbdToUse, args);
			...
			return beanInstance;
		}
		...
	}

1.1进入 resolveBeforeInstantiation

	protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
		Object bean = null;
		if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
			// Make sure bean class is actually resolved at this point.
			// 在上面的继承关系图中发现已经实现了 InstantiationAwareBeanPostProcessor 接口
			if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
				Class<?> targetType = determineTargetType(beanName, mbd);
				if (targetType != null) {
					// 这个方法相当于前置处理
					bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
					if (bean != null) {
						// 后置处理在后面,不是这个
						bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
					}
				}
			}
			mbd.beforeInstantiationResolved = (bean != null);
		}
		return bean;
	}

1.1.1 applyBeanPostProcessorsBeforeInstantiation

	protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			// 肯定实现了 InstantiationAwareBeanPostProcessor 接口
			if (bp instanceof InstantiationAwareBeanPostProcessor) {
				InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
				// 这就是前面讲的前置操作
				Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
				if (result != null) {
					return result;
				}
			}
		}
		return null;
	}
	public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
		...
		// 获得定制的目标源,这里没有,返回 null
		TargetSource targetSource = getCustomTargetSource(beanClass, beanName);
		if (targetSource != null) {
			if (StringUtils.hasLength(beanName)) {
				this.targetSourcedBeans.add(beanName);
			}
			Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource);
			// 创建代理对象
			Object proxy = createProxy(beanClass, beanName, specificInterceptors, targetSource);
			this.proxyTypes.put(cacheKey, proxy.getClass());
			return proxy;
		}
		...
	}

1.1.2 applyBeanPostProcessorsAfterInitialization

	public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
			throws BeansException {

		Object result = existingBean;
		for (BeanPostProcessor processor : getBeanPostProcessors()) {
			// 标志为代理
			Object current = processor.postProcessAfterInitialization(result, beanName);
			if (current == null) {
				return result;
			}
			result = current;
		}
		return result;
	}

1.2 doCreateBean

	protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
			throws BeanCreationException {
		...
		if (instanceWrapper == null) {
			// 创建 Bean 包装器 (反射)
			instanceWrapper = createBeanInstance(beanName, mbd, args);
		}
		...
		try {
			// 设置参数 
			populateBean(beanName, mbd, instanceWrapper);
			// 初始化,进去看看,有前置操作和后置操作
			exposedObject = initializeBean(beanName, exposedObject, mbd);
		}
	}
	protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
		...
			// 调用 Aware 方法(实现哪些 Aware 接口)
			invokeAwareMethods(beanName, bean);
		...
		// 前置操作和后置操作的实现需要继承 BeanPostProcessorsr 接口
		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
			// 前置操作,这里是怎么进去的怎么出来
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {
			// 反射调用初始化方法
			// 顺便提一下初始化和销毁的用法:
			// @Bean(initMethod="", destroyMethod="")
			// 接口:InitializingBean, DisposableBean
            // JSR250(jdk--javax):
			//     @PostConstruct
	        //     @PreDestroy
			invokeInitMethods(beanName, wrappedBean, mbd);
		}
		...
		if (mbd == null || !mbd.isSynthetic()) {
			// 后置操作,进入
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}
		
		// Bean 创建结束,返回
		return wrappedBean;
	}
	public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
			throws BeansException {

		Object result = existingBean;
		for (BeanPostProcessor processor : getBeanPostProcessors()) {
			// 上面讲的后置处理,进入
			Object current = processor.postProcessAfterInitialization(result, beanName);
			if (current == null) {
				return result;
			}
			result = current;
		}
		return result;
	}
	public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
		if (bean != null) {
			Object cacheKey = getCacheKey(bean.getClass(), beanName);
			if (this.earlyProxyReferences.remove(cacheKey) != bean) {
				// 包装,进入
				return wrapIfNecessary(bean, beanName, cacheKey);
			}
		}
		return bean;
	}
	protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
		...
		// Create proxy if we have advice.(被增强的类),进入,拿到可用的可用的通知方法
		Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
		if (specificInterceptors != DO_NOT_PROXY) {
			this.advisedBeans.put(cacheKey, Boolean.TRUE);
			Object proxy = createProxy(
					bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
			this.proxyTypes.put(cacheKey, proxy.getClass());
			return proxy;
		}
		...
	}
	protected Object[] getAdvicesAndAdvisorsForBean(
			Class<?> beanClass, String beanName, @Nullable TargetSource targetSource) {
		// 找一些合适的通知,进入
		List<Advisor> advisors = findEligibleAdvisors(beanClass, beanName);
		if (advisors.isEmpty()) {
			return DO_NOT_PROXY;
		}
		return advisors.toArray();
	}
	protected List<Advisor> findEligibleAdvisors(Class<?> beanClass, String beanName) {
		// 进入
		List<Advisor> candidateAdvisors = findCandidateAdvisors();
		// 检查是否可用
		List<Advisor> eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName);
		extendAdvisors(eligibleAdvisors);
		if (!eligibleAdvisors.isEmpty()) {
			// 排序,通知方法的执行时机
			eligibleAdvisors = sortAdvisors(eligibleAdvisors);
		}
		return eligibleAdvisors;
	}
	protected List<Advisor> findCandidateAdvisors() {
		Assert.state(this.advisorRetrievalHelper != null, "No BeanFactoryAdvisorRetrievalHelper available");
		// 进入
		return this.advisorRetrievalHelper.findAdvisorBeans();
	}
	public List<Advisor> findAdvisorBeans() {
		...
			// 把切面类中的通知方法加进来
			advisors.add(this.beanFactory.getBean(name, Advisor.class));
		...
	}
  1. 现在进入 finishBeanFactoryInitialization 看看它是怎么初始化单例 Bean 的
	protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
		...
		// Instantiate all remaining (non-lazy-init) singletons.
		beanFactory.preInstantiateSingletons();// 关注它就可以
	}
	public void preInstantiateSingletons() throws BeansException {
		...
				getBean(beanName);// 它是关键
		...
	}
	public Object getBean(String name) throws BeansException {
		// 又回到这里,下面就和刚刚的一样了
		return doGetBean(name, null, null, false);
	}

小结:

未完待续(内容安排不合理,打算重写)。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值