spring底层原理

在这里插入图片描述

bean的生命周期

UserService.class —> 无参构造 —> 对象 —> 依赖注入 —> Bean对象

依赖注入底层原理

  1. 找到对象中添加了@Autowired的属性
  2. 给属性设置值

单例bean

Map<beanName,Bean对象> 单例池
getbean首先会去单例池中找,如果找不到创建并放入单例池

UserService.class —> 无参构造 —> 对象 —> 依赖注入 —> 放入Map(单例池) —> Bean对象

初始化前

UserService.class —> 无参构造 —> 对象 —> 依赖注入 —> 初始化前(a() )—> 放入Map(单例池) —> Bean对象

class UserService{
	private Usre admin;

	@PostConstruct
	public void a(){
		//MySQL --> 管理员信息 --> User对象 ---> admin
	}
}

初始化

UserService.class —> 无参构造 —> 对象 —> 依赖注入 —> 初始化前(@PostConstruct)—> 初始化 (InitializingBean)—> 放入Map(单例池) —> Bean对象

public class UserServiceImpl  implements UserService, InitializingBean {
	private Usre admin;

    @Override
    public void afterPropertiesSet() throws Exception {
		//MySQL --> 管理员信息 --> User对象 ---> admin
    }
	protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
			throws BeanCreationException {
		......
		if (instanceWrapper == null) {
			instanceWrapper = createBeanInstance(beanName, mbd, args);
		}
		final Object bean = instanceWrapper.getWrappedInstance();

		......

		// Initialize the bean instance.
		Object exposedObject = bean;
		try {
			//填充bean,处理Autowired注解
			populateBean(beanName, mbd, instanceWrapper);
			//初始化bean
			exposedObject = initializeBean(beanName, exposedObject, mbd);
		}
		......
		return exposedObject;
	}




	protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
		......
		else {
			//aware回调
			invokeAwareMethods(beanName, bean);
		}
		//初始化前
		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
			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);
		}

		return wrappedBean;
	}




protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
			throws Throwable {

		//判断是否实现 InitializingBean 接口
		boolean isInitializingBean = (bean instanceof InitializingBean);
		if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
			if (logger.isTraceEnabled()) {
				logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
			}
			//判断安全管理器是否打开
			if (System.getSecurityManager() != null) {
				try {
					AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {					//多态调用实现类方法
						((InitializingBean) bean).afterPropertiesSet();
						return null;
					}, getAccessControlContext());
				}
				catch (PrivilegedActionException pae) {
					throw pae.getException();
				}
			}
			else {
				//多态调用实现类方法
				((InitializingBean) bean).afterPropertiesSet();
			}
		}
		......
	}

初始化后

UserService.class —> 无参构造 —> 对象 —> 依赖注入 —> 初始化前(@PostConstruct)—> 初始化 (InitializingBean)—> 【初始化后(AOP)–>代理对象】—> 放入Map(单例池) —> Bean对象

此时代理对象会被放入到单例池中去

推断构造方法

UserService.class —> 【推断构造方法】 —> 对象 —> 依赖注入 —> 初始化前(@PostConstruct)—> 初始化 (InitializingBean)—> 初始化后(AOP)–>代理对象—> 放入Map(单例池) —> Bean对象

在这里插入图片描述
只有一个有参构造,spring会去找一个对象构造对象

在这里插入图片描述
在这里插入图片描述

AOP

在这里插入图片描述
在这里插入图片描述
UserService.class —> 推断构造方法 —> 普通对象 —> 依赖注入 —> 初始化前(@PostConstruct)—> 初始化 (InitializingBean)—> 初始化后(AOP)–>【代理对象—> 放入Map(单例池) 】—> Bean对象

在这里插入图片描述
在这里插入图片描述

事务原理

在这里插入图片描述
在这里插入图片描述
由于声明式事务使用的是AOP
在这里插入图片描述

事务失效原理

当有事务的传播行为时
在这里插入图片描述
解决方法一:拆类法
在这里插入图片描述
在这里插入图片描述

解决方法二:自己注入自己(spring已解决循环依赖问题)
在这里插入图片描述

方法三:获取当前代理对象
在这里插入图片描述

@configuration

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悠闲的线程池

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值