Seata之RM源码解析

利用自动装配类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

在这里插入代码片

猜你喜欢

转载自blog.csdn.net/qq_36851469/article/details/128906993
今日推荐