Bean的生命周期和AOP

本文详细介绍了Spring Bean的生命周期,从四个阶段展开,包括创建、属性注入、初始化和销毁。重点讲解了初始化阶段中Aware接口的执行、后置处理器的作用以及AOP在初始化方法执行后的应用。同时,阐述了与AOP相关的后置处理器如何创建代理并执行拦截器链。
摘要由CSDN通过智能技术生成

一:从bean的生命周期四个阶段开始说起。

先附上源码:

// 忽略了无关代码
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
      throws BeanCreationException {
    
   // Instantiate the bean.
   BeanWrapper instanceWrapper = null;
   if (instanceWrapper == null) {
       // 实例化阶段!
      instanceWrapper = createBeanInstance(beanName, mbd, args);
   }

// Eagerly cache singletons to be able to resolve circular references
		// even when triggered by lifecycle interfaces like BeanFactoryAware.
	boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
				isSingletonCurrentlyInCreation(beanName));
	if (earlySingletonExposure) {
		if (logger.isTraceEnabled()) {
			logger.trace("Eagerly caching bean '" + beanName +
					"' to allow for resolving potential circular references");
		}
		addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
	}
    
   // Initialize the bean instance.
   Object exposedObject = bean;
   try {
       // 属性赋值阶段!
      populateBean(beanName, mbd, instanceWrapper);
       // 初始化阶段!
      exposedObject = initializeBean(beanName, exposedObject, mbd);
   }
}

第一阶段  createBeanInstance()方法实例化bean 

顺便提一下 为了解决循环依赖问题向缓存暴露bean工厂 

第二阶段  populateBean() 属性注入

第三阶段  initializeBean() 方法 进入初始化阶段

第四阶段  销毁

二:初始化阶段到底都干了些什么?AOP发生在哪里?

先说答案:

        初始化阶段执行Aware接口 和 后置处理器方法  执行初始化方法

        AOP发生在初始化方法执行后

附上initializeBean()源码

protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
		if (System.getSecurityManager() != null) {
			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
				invokeAwareMethods(beanName, bean);
				return null;
			}, getAccessControlContext());
		}
		else {
            // 1: 执行Aware接口方法
			invokeAwareMethods(beanName, bean);
		}

		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
            // 2: 剩余的Aware接口方法 + 后置处理器
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {
            // 3: 初始化方法
			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()) {
            // 后置处理器(在这里完成AOP代理)
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}

		return wrappedBean;
	}

第一步 执行部分Aware接口  

private void invokeAwareMethods(String beanName, Object bean) {
		if (bean instanceof Aware) {
			if (bean instanceof BeanNameAware) {
				((BeanNameAware) bean).setBeanName(beanName);
			}
			if (bean instanceof BeanClassLoaderAware) {
				ClassLoader bcl = getBeanClassLoader();
				if (bcl != null) {
					((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
				}
			}
			if (bean instanceof BeanFactoryAware) {
				((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
			}
		}
	}

实现了BeanNameAware BeanClassLoaderAware BeanFactoryAware的bean会执行 ,这三个接口分别会获得b

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Bean的生命周期是指在Spring容器中,一个Bean从被实例化到最终销毁的整个过程。根据引用的描述,Bean的生命周期包括以下几个步骤: (1)实例化Bean:根据配置情况调用Bean构造方法或工厂方法来创建Bean的实例。 (2)属性注入:利用依赖注入的方式,将Bean中所有属性的配置值进行注入。 (3)Aware接口回调:如果Bean实现了特定的Aware接口,Spring将会在这一步调用相应的方法,以便让Bean感知到容器的一些信息。 (4)初始化方法:在Bean的所有属性被注入后,执行Bean的初始化方法,可以通过配置指定初始化方法的名称。 (5)Bean后置处理器:在Bean的初始化方法执行前后,会调用注册的Bean后置处理器来对Bean进行增强处理。 (6)销毁方法:在容器关闭或者明确销毁Bean的情况下,执行Bean的销毁方法,可以通过配置指定销毁方法的名称。 根据引用和引用的描述,AOP(面向切面编程)是Spring的一种特殊处理,主要在Bean的生命周期中进行。在AOP中,可以通过配置切点、切面和通知等来实现对Bean的增强功能,如日志记录、事务管理等。AOP的实现依赖于动态代理或字节码增强技术,可以在Bean的实例化过程中动态地为其织入额外的行为。 综上所述,Bean的生命周期AOPSpring中的两个重要概念。Bean的生命周期包括实例化、属性注入、初始化、销毁等步骤,而AOP则是在Bean的生命周期中对其进行增强处理的一种特殊机制。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值