Spring笔记整理

@PostConstruct注解写在类的方法上面,在初始化前执行,例如在类里面有一个User类的属性,然后我们需要通过数据库查询到某个管理账号,然后给这个用户,这样我们就可以在@PostConstruct注解的方法里面写查询数据库这些逻辑。

 InitializingBean接口。初始化接口。

bean类继承了InitalizingBean接口,那么必须实现afterPropertiesSet()方法,该方法在bean的初始化阶段执行。

this.pupulateBean方法里面实现属性的赋值,依赖注入这些。

this.initalizeBean方法是bean的初始化方法。

this.applyBeanPostProcessorsBeforeInitialization方法里面是执行实现了BeanPostProcessor接口的bean所实现的postProcessBeforeInitialization方法。

applyBeanPostProcessorsBeforeInitialization传入目前正在执行bean生命周期的bean以及beanName。然后获取BeanFactory工厂中所有的BeanPostProcessor即调用this.getBeanPostProcessors()方法获取,然后遍历这些BeanPostProcessor的postProcessBeforeInitialization方法,参入参数是当前正在初始化的bean实例以及beanName。

然后将调用完一个postProcessBeforeInitialization方法之后的返回对象赋值给result,即图片中的result=current这行代码的执行。然后接着遍历下一个,直到current当前的对象是null,这样就把result返回,result对象是执行完所有BeanPostProcessor中的postProcessBeforeInitialization方法之后的对象。

InvokeInitMethods方法中是执行初始化方法的逻辑。就判断当前bean的类是否实现了@InitialzingBean接口,如果是那么isInitializingBean为true就有可能会执行初始化方法afterPropertiesSet。关于代码中的isExternallyManagedInitMethod方法还没有深入了解。

applyBeanPostProcessorsAfterInitialization方法的执行逻辑,跟前面的applyBeanPostProcessorsBeforeInitialization方法的逻辑是差不多的。就是获取工厂的 BeanPostProcessor然后执行后置postProcessorAfterInitialization方法,遍历每一个方法,中间可能不断改变正在初始化的bean,最后将改变后的bean返回。

推断构造方法

构建对象的时候使用无参的构造方法。

只有一个构造方法,就是用这个构造方法。

有两个有参数的构造方法,spring不知道使用哪个构造方法,就会报错。

当类中有多个构造方法时,spring会找到默认的无参数的构造方法,若找不到无参数的构造方法,那么就会报错。 

使用@Autowired注解的时候,spring会使用这个被这个注解标注的构造方法。

两个构造方法都加@Autowired方法会报错。

 @Autowired先通过byType再byName,如果在单例池没找到就会去创建这个类型的bean

当先通过byType找到多个bean之后,就会根据beanName去找,如果没有匹配的beanName就会报找不到符合的bean。但是如果通过byType只找到了一个bean,那么就算名称不相同那么也不会报错,因为就直接使用这个bean了。如下图所示。

 SpringAOP

因为UserService被代理了,UserService的bean在初始化以后,通过aop生成的是cglib的代理对象,生成完代理对象之后放入到了单例池中,而代理对象不会再执行populate方法,不会对orderService再次进行赋值,所以说最后的代理对象的OrderService属性是null。但是当我们执行最后的代理对象的test方法时,orderService却不是null。这是因为代理对象里面会有一个target属性,而这个属性的值就是UserService被代理之前的bean对象,很明显这个对象的OrderService属性是有值的,而当代理对象执行test方法时,代理对象是继承了UserService的,而代理对象类会重新父类也就是被代理对象的test方法,底层代码其实是调用target的test方法。所以说最终执行的结果中orderService不为null,如下图所示代码。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值