Spring源码-从源码层面讲解声明式事务配置文件的加载和相关对象的创建1(创建对向,属性填充,动态代理均有涉及)
<tx:advice id="myAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="checkout" propagation="REQUIRED" />
<tx:method name="updateStock" propagation="REQUIRES_NEW" />
</tx:attributes>
</tx:advice>
public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable
public interface MethodInterceptor extends Interceptor
public interface Interceptor extends Advice
myAdvice符合该条件
myAdvice的beanclass是TransactionInterceptor 所以经过实例化之后生成了一个TransactionInterceptor 的对象,
该对象有很多属性是null接下来会开始对其进行属性注入
查找需要注入的属性
1.transactionManager对象创建
transactionManager在创建的时候从缓存中取到不执行后续了。
2.transactionAttributeSource对象创建
经过实例化之后属性没值 接下来注入属性
有值了就是配置文件设置的:
<tx:attributes>
<tx:method name="checkout" propagation="REQUIRED" />
<tx:method name="updateStock" propagation="REQUIRES_NEW" />
</tx:attributes>
TransactionInterceptor实例化完成属性也有数据
getAdvice执行结束
getAdvice:117, AbstractBeanFactoryPointcutAdvisor (org.springframework.aop.support)
isAspectJAdvice:71, AspectJProxyUtils (org.springframework.aop.aspectj)
makeAdvisorChainAspectJCapableIfNecessary:52, AspectJProxyUtils (org.springframework.aop.aspectj)
extendAdvisors:95, AspectJAwareAdvisorAutoProxyCreator (org.springframework.aop.aspectj.autoproxy)
findEligibleAdvisors:98, AbstractAdvisorAutoProxyCreator (org.springframework.aop.framework.autoproxy)
getAdvicesAndAdvisorsForBean:78, AbstractAdvisorAutoProxyCreator (org.springframework.aop.framework.autoproxy)
wrapIfNecessary:348, AbstractAutoProxyCreator (org.springframework.aop.framework.autoproxy)
postProcessAfterInitialization:300, AbstractAutoProxyCreator (org.springframework.aop.framework.autoproxy)
applyBeanPostProcessorsAfterInitialization:430, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1803, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:594, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 1852661033 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$12)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveReference:330, BeanDefinitionValueResolver (org.springframework.beans.factory.support)
resolveValueIfNecessary:113, BeanDefinitionValueResolver (org.springframework.beans.factory.support)
applyPropertyValues:1702, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
populateBean:1447, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:593, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 1852661033 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$12)
getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:897, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:879, AbstractApplicationContext (org.springframework.context.support)
refresh:551, AbstractApplicationContext (org.springframework.context.support)
<init>:144, ClassPathXmlApplicationContext (org.springframework.context.support)
<init>:85, ClassPathXmlApplicationContext (org.springframework.context.support)
main:15, TxTest (com.study.spring.tx.xml)
ExposeInvocationInterceptor添加来源:
这里不为空就开始创建动态代理对象
bookDao创建为代理对象了
此时bookService还是原始对象经过exposedObject = initializeBean(beanName, exposedObject, mbd);之后也会变成代理对象的
此时对象全部创建完成:service和dao生成的是代理对象