设为首页 加入收藏

TOP

Spring入门系列:浅析知识点(二)
2023-07-25 21:32:38 】 浏览:45
Tags:Spring
,那么直接报错。

Spring的设计思想是这样的:

  1. 如果只有一个构造器,那么没有选择,只能使用这个构造器

  2. 如果有多个,只选择没有入参的构造器,因为无参构造方法本身表示了一种默认的意义

  3. 还要一种就是使用了@Autowired注解修饰,那么就表示人工干预 了Spring选择的权利,直接选择程序员指定的构造器,如果有参,里面的参数bean对象(单例)会从单例缓存池中取。

    a.先按照bean类型进行查找,如果只找到一个实例,那么直接注入。
    b.如果找到多个实例,那么会进行匹配入参name名字来确定唯一一个实例。
    c如果没有找到,则会报错,无法创建当前Bean对象

综上所述,Spring会根据Bean的构造器情况进行选择,如果需要人工干预,可以使用@Autowired注解修饰。

AOP的大致流程

在创建对象时,Spring会判断当前对象是否需要进行AOP代理。为了确定当前Bean对象是否需要代理,大致流程如下:

  1. Spring启动时寻找所有使用@AspectJ注解的切面Bean对象
  2. 搜索切面bean的各个方法是否有包含了@Before、@After、@Around注解。
  3. 检查当前Bean或方法是否符合我们编写的Pointcut切面条件。
  4. Spring创建代理对象通常采用cglib代理,JDK代理是另一种模式。后续我们会详细分析此逻辑。

具体流程如下:

  1. 首先当前bean被确认为需要进行代理,将会生成BeanProxy对象,而不是我们构造出来的Bean。
  2. 当前BeanProxy会重写符合切面方法的方法
  3. 当前BeanProxy被依赖注入时,给其他Bean的属性赋值时也会是代理对象。
  4. BeanProxy代理对象都有一个target属性,用于注入被代理对象,即我们正常构造并进行属性注入的Bean对象
  5. 当BeanProxy的切面方法被调用时,首先调用我们编写的切面逻辑,然后调用被代理对象的方法(即我们编写的业务方法)。这里也不太准确,具体得看你写的什么样的切面注解,不过大致都是这样来调用的链路。

Spring事务

一谈到事务,大家首先想到的肯定是@Transaction注解,而这种注解也会被Spring创建对象时检测到,然后会生成代理对象,这种方式其实工作中用到的也特别多,用起来也特别爽,那我们也大概讲下事务的逻辑处理吧,其大致流程如下:

  1. 首先如果当前Bean有@Transaction注解,那么当前bean会成为代理对象。
  2. 当被调用到具体的方法时。Spring则会利用事务管理器TransactionManage获取一个数据库连接。
  3. 直接将当前数据库连接的自动提交关闭,autocommit=false。
  4. 开始执行我们的业务方法,执行业务SQL操作。
  5. 如果执行完方法后,没有异常则提交事务,如果出现异常则进行回滚。

以上是简单的事务处理流程,深入细节会涉及到Spring的事务传播级别,如果现在说的话,会陷入不必要的思考,自此我们的 [Spring入门系列] 也结篇了,在接下来的 [Spring源码系列] 中,我将更加详细地讲解这些内容。

「准备开车,可坐稳了别被摔下来」

先对这些流程有个印象,并带着疑惑来进一步探究Spring的内部机制,好了,今天就讲到这里,我是小雨,我们下期再见。
image

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇三天吃透Redis八股文 下一篇通俗解释 JVM CAS 机制

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目