#!/usr/bin/env bash # Disassembles the two methods that decide whether a beforeInvocation=true eviction is deferred. set -euo pipefail cd "$(dirname "$0")/.." M2="${HOME}/.m2/repository/org/springframework" V=$(mvn -B -q help:evaluate -Dexpression=spring-framework.version -DforceStdout 2>/dev/null | tail -1) CTX="${M2}/spring-context/${V}/spring-context-${V}.jar" CS="${M2}/spring-context-support/${V}/spring-context-support-${V}.jar" { echo "# Why beforeInvocation=true is not deferred by TransactionAwareCacheManagerProxy" echo echo "\$ javap -c -p org.springframework.cache.interceptor.AbstractCacheInvoker # spring-context-${V}.jar" javap -c -p -cp "$CTX" org.springframework.cache.interceptor.AbstractCacheInvoker \ | grep -v '^Picked up' | awk '/protected void doEvict/,/^$/' | head -14 echo echo "\$ javap -c -p org.springframework.cache.transaction.TransactionAwareCacheDecorator # spring-context-support-${V}.jar" javap -c -p -cp "$CS" org.springframework.cache.transaction.TransactionAwareCacheDecorator \ | grep -v '^Picked up' | awk '/public void evict\(java.lang.Object\)/,/^$/' | head -14 javap -c -p -cp "$CS" org.springframework.cache.transaction.TransactionAwareCacheDecorator \ | grep -v '^Picked up' | awk '/public boolean evictIfPresent/,/^$/' | head -8 echo echo "doEvict(cache, key, true) -> Cache.evictIfPresent -> straight to the target cache" echo "doEvict(cache, key, false) -> Cache.evict -> registerSynchronization, runs after commit" echo echo "spring-framework#23192 reported beforeInvocation=true being swallowed by the" echo "transaction-aware decorator. On ${V} it is not: the immediate path uses a method" echo "the decorator does not intercept. Note also that the decorator ships in" echo "spring-context-support, not spring-context." } > docs/output/22-decorator-bytecode.txt echo "wrote docs/output/22-decorator-bytecode.txt"