New posts for Spring and Hibernate

This commit is contained in:
2026-11-06 01:05:27 +05:30
parent 51913ad9d4
commit dc13293046
136 changed files with 5268 additions and 0 deletions
+96
View File
@@ -0,0 +1,96 @@
#!/usr/bin/env bash
# Facts that come from the shipped jars and their sources rather than from running the scenarios:
# 15 SpringApplication.run / callRunners / EventPublishingRunListener, read from the 4.1.2 sources jar,
# and the same method in Boot 3.0.13 and 3.1.12 for contrast
# 16 the same method read out of the compiled 4.1.2 class with javap (what it really calls)
# 17 DefaultLifecycleProcessor: when start() and stop() are called
set -euo pipefail
cd "$(dirname "$0")/.."
mkdir -p output target/facts
BOOT=4.1.2
SPRING=7.0.10
M2=~/.m2/repository
fetch() { # url, destination: Maven Central rate-limits shared addresses, so retry politely
for i in 1 2 3 4 5 6; do
code=$(curl -s -o "$2" -w '%{http_code}' "$1" || true)
[ "$code" = 200 ] && return 0
sleep $((i * 10))
done
echo "could not fetch $1 (last status $code)" >&2; return 1
}
src() { # groupPath artifact version
local f="target/facts/$2-$3-sources.jar"
[ -s "$f" ] || fetch "https://repo1.maven.org/maven2/$1/$2/$3/$2-$3-sources.jar" "$f"
echo "$f"
}
method() { # sources-jar file-in-jar start-regex -> prints from the first match to the first line that is a single tab + }
unzip -p "$1" "$2" | sed -n "/$3/,/^ }/p"
}
BOOT_SRC=$(src org/springframework/boot spring-boot $BOOT)
OLD0=$(src org/springframework/boot spring-boot 3.0.13)
OLD1=$(src org/springframework/boot spring-boot 3.1.12)
FW_SRC=$(src org/springframework spring-context $SPRING)
APP=org/springframework/boot/SpringApplication.java
{
echo "# Spring Boot $BOOT sources: the order SpringApplication.run() calls things in, and callRunners"
echo
echo "--- SpringApplication.run(): from refresh to ready (lines containing the calls) ---"
unzip -p "$BOOT_SRC" $APP | sed -n '/public ConfigurableApplicationContext run(String... args)/,/^ }/p' \
| grep -n -E 'refreshContext|afterRefresh|listeners\.(started|ready)|callRunners|handleRunFailure' | sed 's/^\([0-9]*\):\s*/\1: /'
echo
echo "--- SpringApplication.callRunners ---"
method "$BOOT_SRC" $APP 'private void callRunners'
echo
echo "--- SpringApplication.callRunner (what happens to a bean that is both kinds) ---"
method "$BOOT_SRC" $APP 'private void callRunner(Runner runner'
echo
echo "--- SpringApplication.callRunner(Class, Runner, ThrowingConsumer) (where 'Failed to execute' comes from) ---"
method "$BOOT_SRC" $APP 'private <R extends Runner> void callRunner'
echo
echo "--- EventPublishingRunListener.started / ready ---"
method "$BOOT_SRC" org/springframework/boot/context/event/EventPublishingRunListener.java 'public void started'
method "$BOOT_SRC" org/springframework/boot/context/event/EventPublishingRunListener.java 'public void ready'
echo
echo "--- the marker interface that both runners extend ---"
unzip -p "$BOOT_SRC" org/springframework/boot/Runner.java | grep -E '^(interface|public interface)'
unzip -p "$BOOT_SRC" org/springframework/boot/CommandLineRunner.java | grep -E '^public interface'
unzip -p "$BOOT_SRC" org/springframework/boot/ApplicationRunner.java | grep -E '^public interface'
echo
echo "--- the same method in Spring Boot 3.0.13 ---"
method "$OLD0" $APP 'private void callRunners'
echo
echo "--- the same method in Spring Boot 3.1.12 ---"
method "$OLD1" $APP 'private void callRunners'
} > output/15-callrunners-source.txt
JAR=$(find "$M2/org/springframework/boot/spring-boot/$BOOT" -name "spring-boot-$BOOT.jar" | head -1)
{
echo "# javap -p -c on spring-boot-$BOOT.jar: the compiled SpringApplication.callRunners"
echo
echo "--- javap -p org.springframework.boot.Runner / CommandLineRunner / ApplicationRunner ---"
javap -p -cp "$JAR" org.springframework.boot.Runner org.springframework.boot.CommandLineRunner org.springframework.boot.ApplicationRunner
echo
echo "--- invoke* instructions inside callRunners ---"
javap -p -c -cp "$JAR" org.springframework.boot.SpringApplication \
| sed -n '/private void callRunners(/,/^$/p' | grep -E 'invoke|new ' | sed 's/^ *[0-9]*: //'
} > output/16-javap-callrunners.txt
CTX=$(find "$M2/org/springframework/spring-context/$SPRING" -name "spring-context-$SPRING.jar" | head -1)
LP=org/springframework/context/support/DefaultLifecycleProcessor.java
{
echo "# spring-context $SPRING sources: DefaultLifecycleProcessor, the object that starts and stops SmartLifecycle beans"
echo
echo "--- doStart: start() is called only when isRunning() is false ---"
method "$FW_SRC" $LP 'private void doStart(Map'
echo
echo "--- doStop: stop() is called only when isRunning() is true ---"
method "$FW_SRC" $LP 'private void doStop(Map'
echo
echo "--- isAutoStartupCandidate / toBeStarted: what isAutoStartup() decides ---"
method "$FW_SRC" $LP 'private boolean isAutoStartupCandidate'
method "$FW_SRC" $LP 'private boolean toBeStarted'
} > output/17-lifecycleprocessor-source.txt
ls -1 output | tail -3