StackOverflowError 原因?

java.lang.StackOverflowErrorjava.lang.StackOverflowError
    at java.lang.String.startsWith(String.java:1403)
    at java.lang.String.startsWith(String.java:1434)
    at org.springframework.beans.factory.BeanFactoryUtils.transformedBeanName(BeanFactoryUtils.java:83)
    at org.springframework.beans.factory.support.AbstractBeanFactory.transformedBeanName(AbstractBeanFactory.java:1133)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:242)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.aop.config.SimpleBeanFactoryAwareAspectInstanceFactory.getAspectInstance(SimpleBeanFactoryAwareAspectInstanceFactory.java:68)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
    at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
    at cn.itcast.utils.ConnectionUtils$$EnhancerBySpringCGLIB$$df902d8d.getThreadLocalConnection(<generated>)
    at cn.itcast.utils.TransactionManager.release(TransactionManager.java:50)
    at cn.itcast.utils.TransactionManager.aroundTx(TransactionManager.java:69)
    at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
    at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
    at cn.itcast.utils.ConnectionUtils$$EnhancerBySpringCGLIB$$df902d8d.getThreadLocalConnection(<generated>)
    at cn.itcast.utils.TransactionManager.begin(TransactionManager.java:21)
    at cn.itcast.utils.TransactionManager.aroundTx(TransactionManager.java:61)
    at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
  
 

在调用String.startsWith函数时出现堆栈溢出,很可能是这个string有问题,具体看代码吧

栈溢出异常啊,原因有很多,需要具体分析

@Service
public class AccountServiceImpl implements AccountService {
    @Autowired
    private AccountDao accountDao;
    @Override
    public void transfer(String outName, String inName, Double money) {
        try {
            accountDao.outMoney(outName,money);
            //int a =1/0;
            accountDao.inMoney(inName,money);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public List findAll() {
        return accountDao.findAll();
    }
}
@Repository
public class AccountDaoImpl implements AccountDao {
    @Autowired
    private QueryRunner queryRunner;
    @Autowired
    private ConnectionUtils connectionUtils;
    @Override
    public void outMoney(String outName, Double money) {
        String sql = "update account set money = money-? where name = ?";
        try {
            queryRunner.update(connectionUtils.getThreadLocalConnection(),sql,money,outName);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void inMoney(String inName, Double money) {
        String sql = "update account set money = money+? where name = ?";
        try {
            queryRunner.update(connectionUtils.getThreadLocalConnection(),sql,money,inName);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public List findAll() {
        String sql = "select * from account";
        try {
            return queryRunner.query(sql,new BeanListHandler<>(AccountDao.class));
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}
@Component
public class ConnectionUtils {

    @Autowired
    private DataSource dataSource;

    private static  final ThreadLocal<Connection> TL = new ThreadLocal<Connection>();

    //    从TL中获取链接
    public Connection getThreadLocalConnection(){
        Connection connection = TL.get(); //从threadLocal中获取练级
        if(connection==null){            //如果没有 需要重新向TL中存放一个
//            从DataSource中获取后放到TL
            try {
                connection = dataSource.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            TL.set(connection);
        }
        return connection;
    }

    //    把练级从TL从移除,如果不移除 TL中中的内容会越来越多 以至于会造成堆内存溢出
    public void removeConnectionFromThreadLocal(){
        TL.remove();
    }
}
@Component //交给IOC
public class TransactionManager {

    @Autowired
    private ConnectionUtils connectionUtils;

    //1、开启事务
    public void begin(){
        try {
//            Connection connection = connectionUtils.getThreadLocalConnection(); //从TL 中获取一个连接
//            connection.setAutoCommit(false);  //把事务改成手动提交
            connectionUtils.getThreadLocalConnection().setAutoCommit(false);
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    //     2、提交事务
    public void commit(){
        try {
            connectionUtils.getThreadLocalConnection().commit();
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    //     3、事务回滚
    public void rollback(){
        try {
            connectionUtils.getThreadLocalConnection().rollback();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    //4、事务资源释放
    public void release(){
        try {
            Connection connection = connectionUtils.getThreadLocalConnection();
            connection.setAutoCommit(true);                 //改回成自动提交
            connection.close();                               //关闭connection
            connectionUtils.removeConnectionFromThreadLocal(); //从TL中移除connection
        }catch (Exception e){
            e.printStackTrace();
        }

    }
    public void aroundTx(ProceedingJoinPoint pjp){
        try {
            begin();
            pjp.proceed();
            commit();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            System.out.println("...");
            rollback();
        } finally {
            release();
        }
    }


}
applicationContext.xml配置:
<context:component-scan base-package="cn.itcast"/>
<!--    加载项目以及jar中的配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--    druid的数据源交给了ioc-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${jdbc.driver}" />
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}"/>
</bean>

<!--    queryRunner交给了ioc-->
<bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
    <constructor-arg name="ds" ref="dataSource"/>
</bean>
<aop:config>
    <aop:aspect ref="transactionManager">
        <aop:around method="aroundTx" pointcut="execution(* cn.itcast..*.*(..))"/>
    </aop:aspect>
</aop:config>

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632