嵌套 class:`OuterClass.this.someAttribute`?
Nested class: `OuterClass.this.someAttribute`?
你好,我正在阅读 myBatis 的源代码,我的问题是我不理解行 SqlSessionManager.this.localSqlSession.get()
。 SqlSessionManager.this
是什么意思?
我的尝试:如果我没记错的话当创建一个嵌套的class时说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);
}
}
}
}
}
SqlSessionManager.this
指的是外部 class,如果你只是使用 this
,它会指代没有 localSqlSession
的 SqlSessionInterceptor
。
如果您只使用 localSqlSession
,它将引用直接外部 class。如果在 SqlSessionManager
和 SqlSessionInterceptor
之间有另一个 outerClass,那么它将引用那个 class 而不是 SqlSessionManager
。添加 SqlSessionManager.this
明确声明使用 SqlSessionManager
中的那个
参见: ,
编辑:
参考https://github.com/mybatis/mybatis-3/blob/master/src/main/java/org/apache/ibatis/session/SqlSessionManager.java#L347,似乎这样做只是为了便于阅读。
你好,我正在阅读 myBatis 的源代码,我的问题是我不理解行 SqlSessionManager.this.localSqlSession.get()
。 SqlSessionManager.this
是什么意思?
我的尝试:如果我没记错的话当创建一个嵌套的class时说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);
}
}
}
}
}
SqlSessionManager.this
指的是外部 class,如果你只是使用 this
,它会指代没有 localSqlSession
的 SqlSessionInterceptor
。
如果您只使用 localSqlSession
,它将引用直接外部 class。如果在 SqlSessionManager
和 SqlSessionInterceptor
之间有另一个 outerClass,那么它将引用那个 class 而不是 SqlSessionManager
。添加 SqlSessionManager.this
明确声明使用 SqlSessionManager
参见: ,
编辑:
参考https://github.com/mybatis/mybatis-3/blob/master/src/main/java/org/apache/ibatis/session/SqlSessionManager.java#L347,似乎这样做只是为了便于阅读。