美文网首页
service调用过程分析

service调用过程分析

作者: Young_5942 | 来源:发表于2020-01-08 16:03 被阅读0次
    seviceexecute.png

    测试代码:

    @Service
    public class StockServiceImpl implements StockService {
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        @Override
        public String getStockName() {
            String s = jdbcTemplate.queryForObject("select `name` from stock where id = 1;", String.class);
            return s;
        }
    }
    

    在创建bean时,spring通过jdk动态代理为StockService创建动态代理类,上图为运行时调用过程
    运行时从JdkDynamicAopProxy的invoke方法开始,然后调用AopUtils的invokeJoinpointUsingReflection方法,
    再通过method.invoke(target, args) 调用到StockServiceImpl的getStockName方法,开始执行jdbcTemplate.queryForObject
    然后调用jdbcTemplate的execute方法,此时先通过JdbcAccessor类的obtainDataSource()方法获取数据源,默认为HikariDataSource数据源,然后通过DataSourceUtils.getConnection(obtainDataSource()) 获取连接,下面的过程就是jdbc的执行过程。返回结果之前 先关闭statement和释放连接(数据源层面来看归还连接)

    其中DataSourceUtils.getConnection(obtainDataSource()) 获取连接的过程中,还会如下代码:

    ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
            if (conHolder != null && (conHolder.hasConnection() || conHolder.isSynchronizedWithTransaction())) {
                conHolder.requested();
                if (!conHolder.hasConnection()) {
                    logger.debug("Fetching resumed JDBC Connection from DataSource");
                    conHolder.setConnection(fetchConnection(dataSource));
                }
                return conHolder.getConnection();
            }
    

    如果conHolder 中不为空的话,那么会直接返回连接,什么时候不为空呢?
    首先通过TransactionSynchronizationManager获得ConnectionHolder,
    如果当前线程有绑定的事务,那么spring为了保证同一个事务中使用同一个连接,会将连接绑定到线程,那么此处conHolder就不为空了

    相关文章

      网友评论

          本文标题:service调用过程分析

          本文链接:https://www.haomeiwen.com/subject/lvjsactx.html