利用自动装配类SeataAutoConfiguration引入AbstractAutoProxyCreator类型
的后置处理器SeataAutoDataSourceProxyCreator。并且由后置处理器初始化引介通知IntroductionAdvisor
类型的DefaultIntroductionAdvisor
以及MethodInterceptor
类型的通知SeataAutoDataSourceProxyAdvice
。
1、SeataAutoDataSourceProxyCreator
public class SeataAutoDataSourceProxyCreator extends AbstractAutoProxyCreator {
private final Advisor advisor = new DefaultIntroductionAdvisor(new SeataAutoDataSourceProxyAdvice());
@Override
protected Object[] getAdvicesAndAdvisorsForBean(Class<?> beanClass, String beanName, TargetSource
customTargetSource) throws BeansException {
return new Object[]{
advisor};
}
@Override
protected boolean shouldSkip(Class<?> beanClass, String beanName) {
return SeataProxy.class.isAssignableFrom(beanClass) ||
!DataSource.class.isAssignableFrom(beanClass) ||
Arrays.asList(excludes).contains(beanClass.getName());
}
}
了解引介通知的前提下得知,SeataAutoDataSourceProxyCreator后置处理器主要是对DataSource
生成代理。
2、SeataAutoDataSourceProxyAdvice
执行DataSource相关方法都会被DataSourceProxy
代理类代理完成。
public class SeataAutoDataSourceProxyAdvice implements MethodInterceptor, IntroductionInfo {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
DataSourceProxy dataSourceProxy = DataSourceProxyHolder.get().putDataSource((DataSource) invocation.getThis());
Method method = invocation.getMethod();
Object[] args = invocation.getArguments();
Method m = BeanUtils.findDeclaredMethod(DataSourceProxy.class, method.getName(), method.getParameterTypes());
if (m != null) {
return m.invoke(dataSourceProxy, args);//由DataSourceProxy完成对DataSource相关方法的代理执行
} else {
return invocation.proceed();
}
}
@Override
public Class<?>[] getInterfaces() {
return new Class[]{
SeataProxy.class};
}
}
3、DataSourceProxy
核心代理数据库连接的获取。
public class DataSourceProxy extends AbstractDataSourceProxy implements Resource {
public ConnectionProxy getConnection() throws SQLException {
Connection targetConnection = targetDataSource.getConnection();
return new ConnectionProxy(this, targetConnection);
}
}
4、AbstractConnectionProxy
在这里插入代码片