java嵌套类:`OuterClass。这什么属性`?
嗨,我正在阅读myBatis的源代码,我的问题是我不理解SqlSessionManager.this.localSqlSession.get()
这行代码。什么是SqlSessionManager.this
的意思
我的尝试是:如果我在创建嵌套类时没有记错,比如A.B nestedObjectB = new A.B();
,它实际上为它创建了一个对象A.B
和一个匿名对象A
。所以我猜SqlSessionManager.this
类似于这里的对象A
(在SqlSessionManager.java
private class SqlSessionInterceptor implements InvocationHandler {
public SqlSessionInterceptor() {
// Prevent Synthetic Access
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
final SqlSession sqlSession = SqlSessionManager.this.localSqlSession.get(); // *
if (sqlSession != null) {
try {
return method.invoke(sqlSession, args);
} catch (Throwable t) {
throw ExceptionUtil.unwrapThrowable(t);
}
} else {
try (SqlSession autoSqlSession = openSession()) {
try {
final Object result = method.invoke(autoSqlSession, args);
autoSqlSession.commit();
return result;
} catch (Throwable t) {
autoSqlSession.rollback();
throw ExceptionUtil.unwrapThrowable(t);
}
}
}
}
}
# 1 楼答案
SqlSessionManager.this
指的是外部类,如果您只使用了this
,它将指的是没有localSqlSession
的SqlSessionInterceptor
如果只使用
localSqlSession
,它将引用直接外部类。如果在SqlSessionManager
和SqlSessionInterceptor
之间有另一个外部类,那么它将引用该类而不是SqlSessionManager
。添加SqlSessionManager.this
显式声明使用SqlSessionManager
见:https://stackoverflow.com/a/1816462/,https://stackoverflow.com/a/5530293
编辑:
关于https://github.com/mybatis/mybatis-3/blob/master/src/main/java/org/apache/ibatis/session/SqlSessionManager.java#L347,这样做似乎只是为了可读性