,那么直接报错。
Spring的设计思想是这样的:
-
如果只有一个构造器,那么没有选择,只能使用这个构造器
-
如果有多个,只选择没有入参的构造器,因为无参构造方法本身表示了一种默认的意义
-
还要一种就是使用了@Autowired注解修饰,那么就表示人工干预 了Spring选择的权利,直接选择程序员指定的构造器,如果有参,里面的参数bean对象(单例)会从单例缓存池中取。
a.先按照bean类型进行查找,如果只找到一个实例,那么直接注入。
b.如果找到多个实例,那么会进行匹配入参name名字来确定唯一一个实例。
c如果没有找到,则会报错,无法创建当前Bean对象
综上所述,Spring会根据Bean的构造器情况进行选择,如果需要人工干预,可以使用@Autowired注解修饰。
AOP的大致流程
在创建对象时,Spring会判断当前对象是否需要进行AOP代理。为了确定当前Bean对象是否需要代理,大致流程如下:
- Spring启动时寻找所有使用@AspectJ注解的切面Bean对象
- 搜索切面bean的各个方法是否有包含了@Before、@After、@Around注解。
- 检查当前Bean或方法是否符合我们编写的Pointcut切面条件。
- Spring创建代理对象通常采用cglib代理,JDK代理是另一种模式。后续我们会详细分析此逻辑。
具体流程如下:
- 首先当前bean被确认为需要进行代理,将会生成BeanProxy对象,而不是我们构造出来的Bean。
- 当前BeanProxy会重写符合切面方法的方法
- 当前BeanProxy被依赖注入时,给其他Bean的属性赋值时也会是代理对象。
- BeanProxy代理对象都有一个target属性,用于注入被代理对象,即我们正常构造并进行属性注入的Bean对象
- 当BeanProxy的切面方法被调用时,首先调用我们编写的切面逻辑,然后调用被代理对象的方法(即我们编写的业务方法)。这里也不太准确,具体得看你写的什么样的切面注解,不过大致都是这样来调用的链路。
Spring事务
一谈到事务,大家首先想到的肯定是@Transaction注解,而这种注解也会被Spring创建对象时检测到,然后会生成代理对象,这种方式其实工作中用到的也特别多,用起来也特别爽,那我们也大概讲下事务的逻辑处理吧,其大致流程如下:
- 首先如果当前Bean有@Transaction注解,那么当前bean会成为代理对象。
- 当被调用到具体的方法时。Spring则会利用事务管理器TransactionManage获取一个数据库连接。
- 直接将当前数据库连接的自动提交关闭,autocommit=false。
- 开始执行我们的业务方法,执行业务SQL操作。
- 如果执行完方法后,没有异常则提交事务,如果出现异常则进行回滚。
以上是简单的事务处理流程,深入细节会涉及到Spring的事务传播级别,如果现在说的话,会陷入不必要的思考,自此我们的 [Spring入门系列] 也结篇了,在接下来的 [Spring源码系列] 中,我将更加详细地讲解这些内容。
「准备开车,可坐稳了别被摔下来」
先对这些流程有个印象,并带着疑惑来进一步探究Spring的内部机制,好了,今天就讲到这里,我是小雨,我们下期再见。