File: changelog.txt

package info (click to toggle)
libspring-2.5-java 2.5.6.SEC02-2%2Bsqueeze1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 32,312 kB
  • ctags: 42,774
  • sloc: java: 250,303; xml: 15,812; jsp: 2,413; sql: 1,113; makefile: 55; ruby: 33; sh: 15
file content (3803 lines) | stat: -rw-r--r-- 309,170 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
SPRING FRAMEWORK CHANGELOG
==========================
http://www.springframework.org


Changes in version 2.5.6.SEC02 (2010-06-16)
-------------------------------------

Package org.springframework.beans
* changed CachedIntrospectionResults to ignore Class.getClassLoader() method


Changes in version 2.5.6.SEC01 (2009-04-22)
-------------------------------------

Package org.springframework.aop
* changed serialization behavior of AbstractRegexpMethodPointcut and JdkRegexpMethodPointcut to avoid recompilation

Package org.springframework.core
* fixed issue with GenericTypeResolver where garbage collection was prevented under certain circumstances


Changes in version 2.5.6 (2008-10-31)
-------------------------------------

General
* removed outdated EAR support from sample applications
* upgraded to AspectJ 1.6.2 (retaining compatibility with AspectJ 1.5.x and 1.6.x)
* upgraded to EHCache 1.5.0 (retaining compatibility with EHCache 1.2 and higher)
* upgraded to TestNG 5.8 (retaining compatibility with TestNG 5.5 and higher)
* upgraded to OpenJPA 1.1.0 (retaining compatibility with OpenJPA 1.0.x as well as 1.2.0)
* upgraded to EclipseLink 1.0.1 (EclipseLinkJpaVendorAdapter requires EclipseLink 1.0.0+ now)

Package org.springframework.aop
* AbstractAutoProxyCreator (as used by "aop:config") correctly ignores null bean instances
* "aop:aspect" doesn't insist on aspect bean reference to be specified when just containing declare-parents elements
* "bean" pointcut matches exposed FactoryBean products only; "&..." syntax supported for matching FactoryBean itself

Package org.springframework.beans
* BeanUtils skips conventional editor check for array classes (in order to not break AspectJ weaving)
* BeanWrapper's introspection resolves bridge methods to find setter method for getter method with covariant return type
* TypeMismatchException message differentiates between editor with inappropriate value returned versus no editor at all
* containing bean definition is exposed to ParserContext for BeanDefinitionDecorators as well
* BeanDefinition objects are considered equal even if their originating resource objects are different
* AbstractFactoryBean's early singleton proxy handles equals, hashCode and toString calls locally (avoiding eager init)
* PropertyPathFactoryBean logs a warning if the target bean is still in creation at the time of obtaining the property
* exposed public "copyRegisteredEditorsTo" method on ConfigurableBeanFactory interface
* fixed corner case in AbstractBeanDefinition where a ClassCastException could arise in "getBeanClass(Name)"
* DefaultSingletonBeanRegistry eagerly cleans up cached dependency information when destroying a bean
* AbstractBeanFactory rejects getBean request with arguments in case of a pre-existing singleton of same name as well
* AbstractAutowireCapableBeanFactory preserves possible matches hint in property exception
* SmartInstantiationAwareBeanPostProcessor's "determineCandidateConstructors" is only invoked for non-null bean Class
* ServiceLocatorFactoryBean handles equals and hashCode based on proxy object identity
* factored out "createBeanDefinition" template method in BeanDefinitionParserDelegate
* turned visibility of BeanDefinitionParserDelegate's "checkNameUniqueness" method to protected
* XML list/set/map elements (in both the beans and the util namespace) support nested description element

Package org.springframework.cache
* EhCacheFactoryBean obtains decorated Ehcache instead of raw Cache, honoring pre-configured cache decorators
* removed useless "diskStorePath" property from EhCacheFactoryBean (ignored by all current EHCache versions anyway)

Package org.springframework.context
* DefaultMessageSourceResolvable and FieldError implement "equals" and "hashCode" such that all fields are respected
* ClassPathBeanDefinitionScanner performs trace/debug logging during class resource introspection
* ClassPathBeanDefinitionScanner ignores same class found multiple times in the classpath (i.e. equal bean definition)
* component-scan preserves original source of scanned bean definitions, for silently ignoring already scanned classes
* annotation-config registers PersistenceAnnotationBeanPostProcessor independent from client bundle's class loader
* added CUSTOM value to FilterType enumeration

Package org.springframework.core
* ClassPathResource uses cleaned path for relative resources as well
* PathMatchingResourcePatternResolver considers URL protocol "vfszip" as jar file (to search JBoss-managed jars)
* GenericCollectionTypeResolver correctly resolves collection element type even when target bean is a collection itself

Package org.springframework.ejb
* SpringBeanAutowiringInterceptor calls "InvocationContext.proceed()" in order to invoke subsequent interceptors as well

Package org.springframework.instrument
* ShadowingClassLoader excludes "net.sf.cglib." package from shadowing by default

Package org.springframework.jdbc
* provided Jdbc4SqlXmlHandler as default implementation of the SqlXmlHandler interface
* added SqlValue class to "jdbc.support" package, with SqlXmlValue derived from SqlValue instead of SqlTypeValue
* SQLErrorCodesFactory always loads its "sql-error-codes.xml" files from Spring's class loader (-> static singleton)
* added "transientDataAccessResourceCodes" category to "sql-error-codes.xml", with default codes for DB2 and Sybase
* SQLErrorCodeSQLExceptionTranslator applies default SQLExceptionSubclassTranslator after error code translation only
* SQLErrorCodeSQLExceptionTranslator is able to work without fallback SQLState translation as well
* SQLExceptionSubclassTranslator translates SQLFeatureNotSupportedException to InvalidDataAccessApiUsageException
* SQLStateSQLExceptionTranslator returns TransientDataAccessResourceException for well-known vendor-specific SQL states
* factored out AbstractFallbackSQLExceptionTranslator base class for consistent "fallbackTranslator" capabilities
* CallableStatementCreatorFactory strictly honors "SqlParameter.isInputValueProvided" (allowing for statement caching)
* JdbcTemplate passes full Calendar argument to JDBC driver even in case of no SQL type specified
* JdbcTemplate does not call the costly "Statement.getWarnings()" unless ignoreWarnings=false or debug logging is on
* added "checkFullyPopulated" setting to BeanPropertyRowMapper, for validating that all bean properties have been mapped

Package org.springframework.jms
* JmsException message and logged JMSException message explicitly includes linked exception now if not already contained
* SingleConnectionFactory only calls "Connection.stop()" on reset when the shared Connection has actually been started
* SingleConnectionFactory explicitly creates Queue/TopicConnection when first call is createQueue/TopicConnection method
* CachingConnectionFactory explicitly creates Queue/TopicSession when first call is createQueue/TopicConnection method
* CachingConnectionFactory's JMS Session proxies implement SessionProxy interface, allowing for access to target Session
* CachingConnectionFactory rolls back cached transacted JMS Sessions on logical close if no commit/rollback was issued
* CachingConnectionFactory explicitly closes cached JMS Sessions on Connection close
* CachingConnectionFactory's cached producers pass on "disableMessageID" and "disableMessageTimestamp" properties
* CachingConnectionFactory also caches MessageConsumers (controlled through "cacheConsumers" property)
* AbstractJmsListeningContainer eagerly clears shared JMS Connection after releasing, avoiding repeated close exceptions
* revised DefaultMessageListenerContainer to correctly work with non-JMS transaction manager and CACHE_CONNECTION level
* DefaultMessageListenerContainer supports a stop notification callback for unlimited maxMessagesPerTask as well now
* introduced SubscriptionNameProvider interface for message listener objects suggesting default subscription names
* "jms:listener-container" uses actual message listener object's class name as default subscription name

Package org.springframework.jmx
* fixed NotificationListenerHolder to correctly handle multiple specified object names
* added "allowEagerInit" property to MBeanExporter, for autodetecting lazy-init beans and FactoryBean-produced objects
* added "environment" property to MBeanClientInterceptor and NotificationListenerRegistar, allowing for JMX env entries
* added "refreshOnConnectFailure" property to MBeanClientInterceptor, allowing for reconnect in case of I/O failure

Package org.springframework.mail
* ConfigurableMimeFileTypeMap explicitly closes the InputStream that it uses for "mime.types" resource reading

Package org.springframework.mock
* SimpleNamingContextBuilder supports "deactivate()"+"activate()", with the standard JNDI provider exposed inbetween

Package org.springframework.orm
* HibernateTemplate detects Spring-managed transactional Session even with SessionFactory proxy and allowCreate=false
* HibernateTemplate's "loadAll" operation selects distinct root entities (avoiding duplicate entries in result list)
* HibernateTemplate translates Hibernate's DataException into a Spring DataIntegrityViolationException (for consistency)
* fixed HibernateTransactionManager's "earlyFlushBeforeCommit" feature to apply to the outermost transaction only
* added "packagesToScan" property to Hibernate AnnotationSessionFactoryBean, for autodetection of @Entity classes
* HibernateJpaDialect checks "EntityManager.getDelegate()" as well to find Hibernate Session (for Seam compatibility)
* added "persistenceXmlLocation" property to DefaultPersistenceUnitManager, as alternative to "persistenceXmlLocations"
* @PersistenceContext of type TRANSACTION allows returned Query objects to be parameterized and executed as well
* @PersistenceContext for default EntityManagerFactory lookup works even in an @Configurable Hibernate entity

Package org.springframework.remoting
* added "interceptors" property to RemoteExporter, allowing for registering custom AOP interceptors before the endpoint
* RmiClientInterceptor always logs connect failure at warn level, even when debug logging (incl. stacktrace) is active
* JndiRmiClientInterceptor skips narrowing for RmiInvocationHandler stubs (fixing a regression in 2.5.4)
* Hessian/Burlap service exporters explicitly close input and output streams now (not relying on servlet container)
* Simple/CommonsHttpInvokerRequestExecutor set the current locale according to LocaleContextHolder as HTTP lang header
* JaxWsPortProxyFactoryBean exposes the JAX-WS BindingProvider interface in the Spring-generated proxy as well

Package org.springframework.scheduling
* SchedulerFactoryBean populates scheduler context first before satisfying SchedulerContextAware on a given JobFactory
* SchedulerFactoryBean uses bean name as default scheduler name (when "schedulerName" property not explicitly specified)
* SchedulerFactoryBean does not accept a pre-registered Scheduler instance in the Quartz SchedulerRepository anymore
* SchedulerFactoryBean does not expose the Spring-created/managed Scheduler to the Quartz SchedulerRepository anymore
* added "exposeSchedulerInRepository" flag to SchedulerFactoryBean, for explicit exposure to the SchedulerRepository
* introduced SchedulerAccessorBean for registering jobs/triggers/listeners on an existing Quartz Scheduler instance
* ScheduledExecutorFactoryBean uses Runnable decorator for logging exceptions that lead to termination of execution

Package org.springframework.test
* SpringJUnit4ClassRunner skips execution of test classes with non-matching @IfProfileValue annotation completely

Package org.springframework.transaction
* AbstractPlatformTransactionManager resumes after any kind of inner begin failure (not just after TransactionException)
* TransactionSynchronizationManager interaction gets logged at trace level only (minimizing debug log per transaction)
* JotmFactoryBean sets "defaultTimeout" value as actual JOTM default (even if no transaction timeout specified at all)

Package org.springframework.util
* fixed "StringUtils.delete" to prevent an eternal loop in case of the pattern being empty
* "StringUtils.cleanPath" preserves leading slash if given in original path
* "FileSystemUtils.copyRecursively" ignores 'special' files (i.e. neither a regular file nor a directory)

Package org.springframework.web
* HttpRequestHandlerServlet propagates HTTP request locale into Spring's LocaleContextHolder
* revised "WebUtils.extractFilenameFromUrlPath" to search actual URI part only even when given a URL with query string
* Log4jNestedDiagnosticContextFilter/Interceptor explicitly remove the NDC stack if depth=0 after the "NDC.pop()" call
* fixed FacesWebRequest's "getParameterValues" implementation to use "ExternalContext.getRequestParameterValuesMap"
* PortletContextResource cleans given path (analogous to ServletContextResource)
* Servlet/PortletContextResource accept path with leading "/../" part as well (as accepted by most servlet containers)
* DispatcherServlet removes error-view-driven servlet request attributes after rendering (for Tomcat compatibility)
* exposed "getParamName()" method on LocaleChangeInterceptor and ThemeChangeInterceptor
* added "cacheSecondsForSessionAttributeHandlers" property to Servlet/Portlet AnnotationMethodHandlerAdapter
* AnnotationMethodHandlerAdapter exposes special ModelMap that removes BindingResult if target attribute gets replaced
* Servlet AnnotationMethodHandlerAdapter always takes first exact @RequestMapping path match as best path match
* @MVC handler methods, model attribute methods and init binder methods allow for overriding a generic superclass method
* @ModelAttribute annotated handler method arguments can resolve to a null value as well (when contained in the model)
* standard method argument subtypes (such as a Principal subclass) fail with a descriptive exception if incompatible
* Portlet AbstractCommandController falls back to lazy command creation if session timed out after action phase
* ByteArray/StringMultipartFileEditor do not log warning but rather include root cause in IllegalArgumentException
* InternalResourceView's "preventDispatchLoop" checks against the same request's URI only (for Portlet compatibility)
* made RedirectView's "renderMergedOutputModel" implementation non-final
* VelocityConfigurer exposes ServletContext as VelocityEngine attribute (analogous to the standard VelocityViewServlet)
* revised XsltView to specify full resource URI as StreamSource system id, for properly resolving relative paths
* officially deprecated AbstractXsltView in favor of XsltView and its more flexible "locateSource" mechanism
* revised error logging during XSLT processing to properly log compilation errors before an eventual fatal exception
* moved internal TransformerUtils helper class to generic "org.springframework.util.xml" package


Changes in version 2.5.5 (2008-06-23)
-------------------------------------

General
* fixed SCM URL in Maven POMs
* "-with-dependencies" distribution includes "jarcontent" folder now (needed for building from the source)
* upgraded to Quartz 1.6.1 (includes a fix for the Spring trigger persistence problem that was introduced in 1.6.0)
* upgraded to Hibernate 3.3.0 (while retaining compatibility with Hibernate 3.1/3.2)
* upgraded to iBATIS SQL Maps 2.3.2 (while retaining compatibility with iBATIS 2.3.0)

Package org.springframework.aop
* added "proxyClassLoader" property to ProxyFactoryBean, AbstractSingletonProxyFactoryBean and AbstractAutoProxyCreator
* CustomizableTraceInterceptor hides proxy class names even in log replacement strings (if hideProxyClassNames=true)
* CustomizableTraceInterceptor properly escapes all "\" and "$" symbols in replacement values

Package org.springframework.beans
* revised GenericTypeAwarePropertyDescriptor for compatibility with IBM's JDK 1.6 (avoiding NPE)
* TypeMismatchException shows type description for mismatching JDK proxy values (listing their implemented interfaces)
* CustomNumberEditor explicitly removes all inline whitespace from input Strings (for compatibility with French locales)
* added "getDescription()" method to BeanDefinition interface (exposing the value of the XML bean description element)
* AbstractFactoryBean uses bean ClassLoader for the generation of early singleton proxies
* PropertyPlaceholderConfigurer correctly manages resolution of set entries and map keys with modified hash code
* fixed DefaultSingletonBeanRegistry's singleton exposure to remove singleton factory after creation of singleton object
* DefaultSingletonBeanRegistry only exposes related causes on outermost creation exception (avoiding excessive logging)
* DefaultSingletonBeanRegistry only registers same related cause (i.e. same message, same chained cause) once
* DefaultListableBeanFactory only registers causes during constructor resolution when resolution eventually fails
* DefaultListableBeanFactory checks primary attribute in bean definitions of parent factory as well
* fixed DefaultListableBeanFactory to use a post-processing lock (for proper synchronization of annotation scanning)
* dependency check "simple" accepts Number, Date, URI, URL and Locale as well (consistent with simple MVC value types)
* UnsatisfiedDependencyException preserves full nested exception stacktrace in case of a BeansException
* added overloaded BeanComponentDefinition constructor with aliases argument
* GenericBeanFactoryAccessor's "getBeansWithAnnotation" performs deep search (including interfaces and target class)
* added "findAnnotationOnBean" method to GenericBeanFactoryAccessor, performing a deep search on a specific bean
* BeanConfigurerSupport (@Configurable processing) includes type of bean in warn log when called in unconfigured state
* restored BeanConfigurerSupport's silent skipping in case of no BeanFactory configured yet

Package org.springframework.context
* factored out MessageSourceSupport base class from AbstractMessageSource, providing common MessageFormat handling
* DelegatingMessageSource resolves message arguments in default messages even if there is no parent MessageSource
* MessageSourceResourceBundle exposes Spring-specified locale through overridden "ResourceBundle.getLocale()" method
* revised CommonAnnotationBeanPostProcessor's "getResource" method to allow for proper overriding in subclasses
* ClassPathBeanDefinitionScanner always accepts explicit bean definition of same name as override for scanned bean
* added type="custom" expression="<classname>" option to component-scan's "include-filter"/"exclude-filter"
* component-scan's "include-filter"/"exclude-filter" entries are validated individually (for Spring IDE)

Package org.springframework.core
* added assertions to GenericTypeResolver (avoiding NPEs)
* factored out generic ConfigurableObjectInputStream class from CodebaseAwareObjectInputStream in RMI support
* re-enabled PathMatchingResourcePatternResolver's JarURLConnection handling (accidentally disabled in 2.5.4)

Package org.springframework.ejb
* "jee:local/remote-slsb" accepts plain object returned from EJBHome create method (for JBoss 4.2 EJB3 compatibility)
* added "exposeAccessContext" flag to AbstractSlsbInvokerInterceptor, for WebLogic resource factories with authorization
* added "expose-access-context" flag to "jee:local-slsb", "jee:remote-slsb" and "jee:jndi-lookup"

Package org.springframework.jdbc
* added SimpleDriverDataSource alternative to DriverManagerDataSource, avoiding class loading and synchronization issues
* BeanPropertySqlParameterSource uses specific integer/decimal SQL types by default now (e.g. TINYINT, BIGINT, DOUBLE)
* introduced SqlXmlHandler abstraction (for the XML support in the Advanced Pack for Oracle Database)
* added further SQL error code mapping for MS SQL Server

Package org.springframework.jms
* SingleConnectionFactory and TransactionAwareConnectionFactoryProxy use JMS API ClassLoader for proxy generation
* JmsTemplate properly allows for overriding "getDefaultDestination()" and "getDefaultDestinationName()"
* AbstractJmsListeningContainer sets Connection to null on shutdown, allowing for smooth reinitialization
* DefaultMessageListenerContainer performs lazy setup in case of any connection exception (also JNDI lookup failure)
* DefaultMessageListenerContainer is able to recover all cases where the provider is not available on startup
* fixed DefaultMessageListenerContainer to avoid race condition when stopping through lock on unified monitor
* added "container-class" attribute to "jms:listener-container" element, for specifying a custom implementation class
* MessageListenerAdapter and JmsInvokerServiceExporter use message id as correlation id if no request correlation id set

Package org.springframework.jmx
* MBeanExporter performs default MBeanServer lookup even when registering notification listeners only

Package org.springframework.jndi
* added "exposeAccessContext" flag to JndiObjectFactoryBean, for WebLogic resource factories with authorization

Package org.springframework.mail
* removed overlapping "application/x-pointplus" MIME type for "css" extension from MimeMessageHelper's default mappings

Package org.springframework.orm
* improved HibernateTransactionManager's InvalidIsolationLevelException exception message (-> SpringTransactionFactory)
* added "hibernateManagedSession" flag to HibernateTransactionManager, for working with a custom CurrentSessionContext
* documented use of Hibernate StatelessSession with Spring's DataSourceTransactionManager/HibernateTransactionManager
* added support for Derby and H2 through Hibernate/OpenJpa/TopLink/EclipseLinkJpaVendorAdapter's "database" property
* Hibernate/TopLink/JDO/JPA proxy classes are generated in the ORM provider's ClassLoader (for full visibility in OSGi)
* Spring-enriched JPA proxies are created in the application's ClassLoader (making any vendor interfaces work in OSGi)
* fixed AbstractEntityManagerFactoryBean's EMF proxy to handle equals/hashCode locally (for correct equals behavior)
* iBATIS SqlMapClientFactoryBean supports multiple sql-map-config files and also patterns ("configLocations" property)
* iBATIS SqlMapClientFactoryBean supports Spring resource/pattern lookup of sql-map files ("mappingLocations" property)

Package org.springframework.remoting
* RemoteAccessException explicitly declares serialVersionUID (for serialization compatibility on WebLogic)
* (Simple)HttpInvokerServiceExporter uses the ClassLoader of the containing BeanFactory for deserialization
* fixed JaxWsClientInterceptor to throw a RemoteConnectFailureException (if applicable) instead of returning it
* added support for "username"/"password"/"maintainSession"/"useSoapAction"/etc properties to JaxWsClientInterceptor
* added SimpleHttpServerJaxWsServiceExporter, allowing for exposure through a fully configurable Sun JDK 1.6 HttpServer
* added "filters" and "authenticator" property to SimpleHttpServerFactoryBean for Sun's JDK 1.6 HttpServer
* revised HessianExporter's "debug" feature to work on Hessian 3.0.20+ as well (with input debugging only)

Package org.springframework.scheduling
* SchedulerFactoryBean's "jobSchedulingDataLocation" feature is compatible with Quartz 1.6.1 now (requiring 1.6.1+)

Package org.springframework.scripting
* ScriptFactoryPostProcessor ignores any "predictBeanType" failure (in particular reference to currently created bean)
* GroovyScriptFactory also converts CompilationFailedException to ScriptCompilationException during type determination

Package org.springframework.test
* added "prepareApplicationContext(GenericApplicationContext)" template method to AbstractSingleSpringContextTests
* added "prepareContext(GenericApplicationContext)" template method to AbstractGenericContextLoader
* removed unnecessary "throws Exception" declarations from ReflectionTestUtils
* added "getField" and "invokeGetterMethod" methods to ReflectionTestUtils

Package org.springframework.transaction
* transactional resource synchronization works even for operations triggered during commit (e.g. by JPA PostUpdate)
* strengthened warning regarding @Transactional use on interfaces versus classes
* "tx:annotation-driven" registers revised TransactionAttributeSourceAdvisor, initializing TransactionInterceptor lazily

Package org.springframework.util
* publicly exposed "isVisible" method on ClassUtils
* added "getField" and simple "findField" method to ReflectionUtils
* NumberUtils avoids overflow when converting from BigDecimal to BigInteger
* NumberUtils automatically supports JDK 1.5+ localized BigDecimal parsing
* added various overloaded methods with a CharSequence argument (as alternative to a String argument) to StringUtils
* removed Commons Log usage from SystemPropertyUtils, ClassUtils, FileCopyUtils (avoiding early Log4J initialization)
* revised CachingMapDecorator to expose all state representations in a thread-safe manner, even for pure introspection
* revised CachingMapDecorator to use weak references for caching only (not losing a value from get)

Package org.springframework.validation
* fixed DefaultBindingErrorProcessor to register correct "missing field" errors within specified nested path

Package org.springframework.web
* revised RequestAttributes access from child threads in order to not touch the request object after request completion
* DispatcherServlet exposes the Servlet spec's error attributes to error views (for JSP error page compatibility)
* HandlerMethodInvoker does not eagerly copy entire model Map in order to avoid lazy initialization of attribute values
* Servlet AnnotationMethodHandlerAdapter throws ambiguity exception in case of equivalent mappings with same method name
* Portlet AbstractMapBasedHandlerMapping sorts predicates before checking them (according to their natural order)
* Portlet DefaultAnnotationHandlerMapping checks default mappings last, independent from order of controller definition
* RedirectView uses request's encoding (default ISO-8859-1) if no encoding scheme specified (previous default was UTF-8)
* RedirectView considers arrays and collections with eligible values, turning them into multi-value request parameters
* RedirectView accepts StringBuffers, StringBuilders, Numbers, Dates, URIs, URLs and Locales as eligible values as well
* factored out common temporary byte array handling from AbstractPdfView etc into AbstractView base class
* added AbstractPdfStamperView as alternative to AbstractPdfView, operating on an existing document with an AcroForm
* fixed AbstractJasperReportsView to fully isolate a model-specified JDBC DataSource (not setting it as view DataSource)
* AbstractJasperReportsView gives specified JDBC DataSource precedence over implicit report data value in model
* AbstractJasperReportsView proceeds without report data value in case of multiple collections or object arrays
* added "autocomplete" attribute to JSP FormTag (for a form-wide setting, as alternative to InputTag's "autocomplete")
* JSF DelegatingVariableResolver and SpringBeanFacesELResolver log resolution success at trace level only


Changes in version 2.5.4 (2008-04-28)
-------------------------------------

General
* upgraded to AspectJ 1.6 (while retaining compatibility with AspectJ 1.5.x)
* fixed spring-core.jar's manifest to contain correct OSGi Import-Package declaration
* removed superfluous DynamicImport-Package declarations from OSGi manifests
* all decorator proxies are using identity hash code of the proxy instead of the InvocationHandler hash code now

Package org.springframework.aop
* fixed various AspectJ expression evaluation bugs through upgrading aspectjweaver.jar to AspectJ 1.6

Package org.springframework.beans
* added CharsetEditor for JDK 1.4's "java.nio.charset.Charset" class to default property editors
* BeanWrapper explicitly finds default PropertyEditor according to "Editor" suffix convention
* deprecated BeanWrapper's fallback to the global JavaBeans PropertyEditorManager
* DirectFieldAccessor registers Spring's common default PropertyEditors (like BeanWrapperImpl does)
* fixed AbstractBeanDefinition to properly include qualifiers and primary flag in equals comparison
* AbstractAutowireCapableBeanFactory's handling of lazy-init singletons is thread-safe again
* AbstractAutowireCapableBeanFactory only invokes "predictBeanType" post-processor method for non-null bean Class

Package org.springframework.core
* introduced InfrastructureProxy interface for resource proxies to be implemented if supposed to be considered as equal
* DefaultResourceLoader's ClassPathContextResource also returns ClassPathContextResource from "createRelative"
* PathMatchingResourcePatternResolver resolves encoded jar URIs before creating JarFiles (for WebSphere compatibility)
* PathMatchingResourcePatternResolver catches NoClassDefFoundError when looking for presence of Equinox classes
* SimpleMetadataReaderFactory uses ResourceLoader's ClassLoader for loading annotation classes (for OSGi compatibility)

Package org.springframework.jdbc
* JdbcTemplate explicitly detects and skips null ResultSets returned from CallableStatement
* BeanPropertySqlParameterSource avoids default use of JDBC 3.0's Types.BOOLEAN (for compatibility with MySQL)

Package org.springframework.jms
* fixed CachedMessageProducer to initialize its deliveryMode, priority and timeToLive fields with the target's settings

Package org.springframework.orm
* fixed Hibernate 3.2 support to flush updates before queries even within purely Spring-managed JTA transactions
* Hibernate3 LocalSessionFactoryBean sets new SpringTransactionFactory as default in case of no JTA TransactionManager

Package org.springframework.remoting
* JndiRmiClientInterceptor/ProxyFactoryBean work for JNDI objects which do not implement the Remote interface as well

Package org.springframework.test
* "executeSqlScript" (as in SimpleJdbcTestUtils) allows for multi-line statements, each separated by a semicolon

Package org.springframework.transaction
* TransactionSynchronizationManager automatically unwraps InfrastructureProxy objects for raw key comparisons
* AbstractFallbackTransactionAttributeSource uses concurrent Map for attribute cache in order to avoid lock contention

Package org.springframework.validation
* AbstractPropertyBindingResult's "formatFieldValue" finds PropertyEditor according to "Editor" suffix convention too
* DefaultBindingErrorProcessor registers "missing field" errors within specified nested path (if any)

Package org.springframework.web
* added "findParameterValue" convenience method to WebUtils
* ContextLoader uses its own ClassLoader for loading the default strategy (XmlWebApplicationContext)
* added "contextAttribute" property (for WebApplicationContext retrieval) to DelegatingFilterProxy and FrameworkServlet
* RequestContext does not fail when WebApplicationContext's ServletContext is null (like in a plain Portlet environment)
* HandlerMethodInvoker does not copy whole model Set for session attribute exposure anymore (avoiding lazy value init)
* fixed JSP form tags to properly return SKIP_BODY instead of the non-defined EVAL_PAGE (for WebLogic compatibility)


Changes in version 2.5.3 (2008-04-06)
-------------------------------------

General
* replaced junit-4.4.jar in with-dependencies distribution with official JUnit 4.4 jar
* spring.jar does not include InstrumentationSavingAgent class anymore (for parent-last class loaders)
* spring-context.jar includes optional OSGi imports for "context:annotation-config"'s autodetection purposes
* Spring reference documentation covers JSF 1.2 and contains updated Struts 2.0 and Tapestry references
* Spring reference documentation covers annotation-based controllers in Portlet chapter

Package org.springframework.aop
* deprecated ProxyFactoryBean's support for a target as last element in "interceptorNames" in favor of "targetName"
* ProxyFactoryBean assumes a target bean if type cannot be determined for last element in "interceptorNames" list
* AbstractAutoProxyCreator predicts proxy class as bean type if known already (instead of predicting the target class)
* AbstractAutoProxyCreator exposes early singleton proxies (for resolving circular reference between proxied beans)
* "bean(...)" pointcut designator matches against bean name aliases as well, not just against the canonical bean name

Package org.springframework.beans
* CharacterEditor's "allowEmpty" only translates empty String to null, keeping a single space String as space character
* CustomNumberEditor treats number with leading zeros as decimal (removed unwanted octal support while preserving hex)
* GenericTypeAwarePropertyDescriptor respects "propertyEditorClass" specified on original PropertyDescriptor
* renamed ListableBeanFactory's "includePrototypes" flag to "includeNonSingletons" (affects javadoc only)
* added "getEarlyBeanReference" hook to SmartInstantiationAwareBeanPostProcessor interface
* AbstractBeanFactory does not log full exception stack trace (at debug level) on FactoryBean type check anymore
* AbstractAutowireCapableBeanFactory allows for resolving circular reference between beans wrapped by BeanPostProcessors
* DefaultListableBeanFactory passes full inherited AccessControlContext to the AccessController for bean creation
* DefaultListableBeanFactory does not eagerly initialize target beans when autowiring a PriorityOrdered post-processor
* PropertyPlaceholderConfigurer supports nested keys in placeholder keys as well (e.g. "${db.${environment}}")
* PropertyPlaceholderConfigurer works properly even in case of default-autowire="byType" with FactoryBeans involved
* fixed PropertyPlaceholderConfigurer's "nullValue" handling to avoid NPE for nested value
* added "ignoreUnresolvableEditors" property to CustomEditorConfigurer, allowing to ignore type/editor classes not found
* XmlBeanDefinitionReader's "getValidationModeForResource" method is protected now in order to allow for overriding
* AbstractSimpleBeanDefinitionParser properly ignores namespace declaration attributes ("xmlns"/"xmlns:")
* AutowiredAnnotationBeanPostProcessor processes @Autowired annotation on most specific method only (when overriding)
* AutowiredAnnotationBeanPostProcessor marks @Autowired bean properties as processed (for @Required to accept them)

Package org.springframework.context
* ReloadableResourceBundleMessageSource is able to detect updates for a properties file stored in a jar/zip as well
* AbstractApplicationContext's temporary ClassLoader explicitly excludes types to match (for OSGi LTW compatibility)
* restored support for null location array argument in ClassPathXmlApplicationContext (for Apache CXF compatibility)
* added "registration" attribute to mbean-export element, accepting "failOnExisting"/"ignoreExisting"/"replaceExisting"
* CommonAnnotationBeanPostProcessor processes @Resource annotation on most specific method only (when overriding)
* revised default annotation post-processor ordering to apply most specific processors first

Package org.springframework.core
* Conventions detects special generated subclasses (e.g. by OpenJPA) and derives the variable name from the superclass
* revised LocalVariableTableParameterNameDiscoverer to avoid potential NPE in case of no parameter names found on Java 5
* revised DefaultValueStyler (and deprecated ReflectiveVisitorHelper) for better performance and no class loader leaks
* StaticLabeledEnumResolver uses weak references to LabeledEnum class in order to avoid class loader leaks
* added "lastModified()" method to Resource interface, for abstract access to the last-modified timestamp
* ClassPathResource and UrlResource use the last-modified timestamp of the archive file for jar/zip contents
* PathMatchingResourcePatternResolver sets "useCaches=false" on any JarURLConnection that it opens for path matching
* PathMatchingResourcePatternResolver detects WebSphere 6.1 "bundleresource:" URLs and resolves them for path matching

Package org.springframework.ejb
* added "cacheSessionBean" flag to SimpleRemoteStatelessSessionProxyFactoryBean, for caching the session bean object
* added "cache-session-bean" attribute to "jee:remote-slsb" configuration element
* Spring 2.5 "jee:*" config elements use resource-ref="true" by default (non-resource-ref names will still work as well)

Package org.springframework.jdbc
* JndiDataSourceLookup uses "resourceRef"=true by default (being able to resolve J2EE "jdbc/myDb" ENC names by default)
* NativeJdbcExtractorAdapter only processes DatabaseMetaData Connection if non-null (for WebLogic cluster compatibility)
* fixed SQLException translation for IBM DB2 and MS SQL to operate on error codes first, just falling back to SQL state
* added MySQL NDB error codes and further DB2 error codes to default "sql-error-codes.xml" file
* factored out common AbstractColumnMaxValueIncrementer base class from Derby/Hsql/MySQLMaxValueIncrementer
* added DB2MainframeSequenceMaxValueIncrementer for DB2/390 and DB2/400 (differing from DB2 UDB for Unix and Windows)
* added "wrapAsLob" property to DefaultLobHandler, for passing Blob/Clob instances to the JDBC driver (for PostgreSQL)
* DefaultLobHandler's "streamAsLob" setting (requires JDBC 4.0) applies to byte array and String arguments as well
* JdbcTemplate creates LinkedHashMap (instead of plain HashMap) as default results Map returned from "call" operation
* JdbcDaoSupport does not override specified JdbcTemplate on subsequent "setDataSource" call for same DataSource
* NamedParameterJdbcTemplate ignores Postgres-style "::" casting operator (i.e. not treated as named parameter)
* SimpleJdbcInsert supports "autoGeneratedKey" simulation using "insert ... returning" for PostgreSQL 8.2 and later
* SimpleJdbcCall supports metadata lookup of procedure columns for PostgreSQL (requires JDBC driver 8.3 or later)

Package org.springframework.jms
* SingleConnectionFactory accepts "Connections.setClientID" calls with the same client ID as specified on the factory
* SingleConnectionFactory accepts further "Connection.setExceptionListener" calls in "reconnectOnException" mode
* introduced CachingConnectionFactory (as subclass of SingleConnectionFactory) for JMS 1.1 session and producer pooling
* SimpleMessageListenerContainer registers itself as ExceptionListener for automatic Connection recovery
* added "runningAllowed()" template method to DefaultMessageListenerContainer, allowing subclass to temporarily suspend
* DefaultMessageListenerContainer scales concurrent invokers eagerly in case of a sudden burst (revised idle handling)
* DefaultMessageListenerContainer uses a "maxMessagesPerTask" default of 10 when associated with a ScheduledTaskExecutor
* DefaultMessageListenerContainer propagates JMSExceptions thrown from a listener, potentially triggering recovery
* MessageListenerAdapter propagates JMSExceptions thrown from listener method as-is (no wrapping in runtime exception)
* MessageListenerAdapter invokes target (SessionAware)MessageListener immediately, not extracting the content upfront
* added "cache" attribute to "jms:listener-container" configuration element, for customizing the resource cache level

Package org.springframework.jmx
* MBeanExporter's autodetection does not cause CannotLoadBeanClassException for lazy-init beans (Spring 2.0 compatible)

Package org.springframework.jndi
* JndiLocatorSupport tries fallback lookup for originally specified JNDI name if resource-ref adapted name wasn't found
* JndiObjectFactoryBean exposes the bean ClassLoader as thread context ClassLoader (if necessary)

Package org.springframework.mock
* MockHttpServletResponse's "encodeURL" allows for central overriding in subclasses (affecting "encodeRedirectURL" too)
* SimpleNamingContext's "createSubcontext" works correctly for given subcontext names without trailing slash as well

Package org.springframework.orm
* XxxDaoSupport does not override specified XxxTemplate on subsequent "setZzzFactory" call for same factory
* added "executeWithNewSession" and "executeWithNativeSession" methods to HibernateTemplate
* revised EntityManagerFactoryInfo handling to autodetect all EntityManager interfaces if no JpaVendorAdapter specified
* PersistenceAnnotationBeanPostProcessor processes annotations on most specific method only (when overriding)

Package org.springframework.remoting
* revised (Simple)Hessian/BurlapServiceExporter's handling of non-POST requests (avoiding unnecessary warnings)

Package org.springframework.scheduling
* added "waitForTasksToCompleteOnShutdown" property to ThreadPoolTaskExecutor
* changed ThreadPoolTaskExecutor's default behavior to shutdown immediately, not waiting for scheduled tasks
* ThreadPoolTaskExecutor extends CustomizableThreadFactory for common bean properties and uses itself as default factory
* ThreadPoolTaskExecutor uses its bean name as default thread name prefix (analogous to DefaultMessageListenerContainer)
* MethodInvokingRunnable logs target exception directly at error level (instead of InvocationTargetException wrapper)
* MethodInvokingJobDetailFactoryBean propagates invocation exceptions as non-JobExecutionExceptions (for error logging)
* DelegatingJob propagates exceptions as-is instead of wrapping them in JobExecutionExceptions (for error logging)

Package org.springframework.scripting
* ResourceScriptSource is able to detect updates for a script file stored in a jar/zip as well

Package org.springframework.test
* @IfProfileValue correctly checked against concrete test class, even in case of overridden test methods
* @IfProfileValue annotation without specified value checks against presence (non-null value) of the given profile key
* "executeSqlScript" (as in SimpleJdbcTestUtils) allows for multiple statements per line, separated by semicolons
* SpringJUnit4ClassRunner catches AssumptionViolatedException in @Before methods (analogous to standard JUnit 4.4)
* SpringJUnit4ClassRunner executes befores/afters in same thread for test method with JUnit timeout (-> transactions)
* TransactionalTestExecutionListener is able to manage concurrent transactions for different test methods (with timeout)
* TransactionalTestExecutionListener reobtains transaction manager for every transaction (picking up context changes)
* fixed Abstract(Transactional)JUnit(38/4)SpringContextTests classes to be actually marked as abstract

Package org.springframework.transaction
* JtaTransactionManager" checks JNDI location "java:appserver/TransactionManager" for GlassFish's primary TM handle

Package org.springframework.util
* "ClassUtils.resolveClassName" preserves the original root cause in the rethrown IllegalArgumentException
* NumberUtils treats number with leading zeros as decimal (removed unwanted octal support while preserving hex)
* MethodInvoker scans all declared methods (of any visibility), being able to invoke protected/private methods as well
* added "getChildElementsByTagNames" method with tag names Collection argument to DomUtils

Package org.springframework.validation
* factored out AbstractErrors base class from AbstractBindingResult, providing common access to evaluated errors
* added "getRawFieldValue" and "findEditor" methods to BindingResult interface (for a completely decoupled BindStatus)
* fixed AbstractPropertyBindingResult's "getFieldType" to correctly apply nested path to field name
* added convenience constructors to ObjectError and FieldError

Package org.springframework.web
* ContextLoader accepts system property placeholders in "contextConfigLocation" value (again)
* OncePerRequestFilter cleans up its marker attribute at the end of each outer request (for Portlet compatibility)
* RequestContextFilter supports "threadContextInheritable" init-param (analogous to DispatcherServlet)
* HttpRequestHandlerServlet translates HttpRequestMethodNotSupportedException into HTTP status code 405
* DispatcherServlet translates HttpRequestMethodNotSupportedException into HTTP status code 405 by default
* introduced WEB_APPLICATION_CONTEXT_ATTRIBUTE in RequestContext, for overriding the DispatcherServlet context
* ControllerClassNameHandlerMapping detects @Controller beans by default as well
* ControllerClassNameHandlerMapping registers plain path for multi-action controllers too ("/welcome/*" + "/welcome")
* added ControllerBeanNameHandlerMapping, deriving URL paths from bean names for well-known controller types
* AnnotationMethodHandlerAdapter's @RequestMapping matching is deterministic independent from the declared methor order
* AnnotationMethodHandlerAdapter accepts @RequestParam annotations for @InitBinder methods as well
* AnnotationMethodHandlerAdapter always exposes BindingResult objects for model attributes which are binding candidates
* AnnotationMethodHandlerAdapter throws clear IllegalStateException in case of invalid BindingResult argument
* Portlet AnnotationMethodHandlerAdapter supports Servlet ModelAndView and View objects as handler method return values
* default attribute names for annotated handler method return values are consistently derived from the declared type
* added "exposedContextBeanNames" property to InternalResourceView(Resolver), for exposing specific Spring beans only
* InternalResourceView does not enforce ApplicationContext to be set anymore (allowing for "getServletContext" checking)
* JstlView, Tiles(Jstl)View and AbstractJasperReportsView expose current RequestContext's MessageSource for localization
* JSP form tags do not autogenerate id in case of empty id specified (empty id signals no id to be rendered)
* JSP OptionTag and OptionsTag support "id" attribute now, analogous to RadioButton(s)Tag and Checkbox(es)Tag
* added standard HTML "target" attribute to JSP FormTag, for submitting to another window/frame
* fixed JSP LabelTag to render valid default "for" attribute for collection/map paths as well
* fixed AbstractJasperReportsView to build exception messages for the specific sub-report location


Changes in version 2.5.2 (2008-02-29)
-------------------------------------

General
* various reference documentation revisions (e.g. updated transaction management chapter)
* removed outdated showcases sample applications from Spring distribution
* spring-context.jar does not include InstrumentationSavingAgent class anymore (for parent-last class loaders)

Package org.springframework.aop
* AbstractRegexpMethodPointcut matches against target class as well, not just against method's declaring class
* ProxyFactoryBean and AbstractAutoProxyCreator check autodetected proxy interfaces for visibility in the ClassLoader
* Cglib2AopProxy properly detects overridden "finalize()" methods, never dispatching them to the interceptor chain
* CustomizableTraceInterceptor properly escapes method names and exception messages for regex parsing (wrt "$" signs)
* marked AbstractRefreshableTargetSource's status accessors as synchronized
* AbstractBeanFactoryBasedTargetSourceCreator applies containing BeanFactory's configuration to internal BeanFactory
* AbstractBeanFactoryBasedTargetSourceCreator creates an independent internal BeanFactory per target bean
* deprecated ClassLoaderAnalyzerInterceptor and associated ClassLoaderUtils class
* reintroduced AopNamespaceUtils.registerAutoProxyCreatorIfNecessary(ParserContext,Object) for Spring 2.0 compatibility

Package org.springframework.beans
* introduced PropertyAccessorFactory facade for obtaining BeanWrapper and direct field accessor instances
* deprecated BeanWrapper's "setWrappedInstance" method in favor of recreating a BeanWrapper per target instance
* BeanWrapperImpl trims an enum candidate value before matching it against the available enum values
* BeanWrapperImpl resolves the target type for a generically typed bean property, performing appropriate type conversion
* StringArrayPropertyEditor (for comma-delimited splitting of array elements) registered for short[], int[], long[] too
* CustomDateEditor and CustomNumberEditor preserve original ParseException as root cause of IllegalArgumentException
* MethodInvokingFactoryBean falls back to interpreting specified arguments as single method argument of array type
* deprecated RefreshablePagedListHolder class and associated PagedListSourceProvider interface
* added "getOriginatingBeanDefinition()" method to BeanDefinition interface, exposing the decorated definition (if any)
* PropertyOverrideConfigurer is able to properly override target bean definitions behind a scoped proxy decorator
* added "nullValue" property to PropertyPlaceholderConfigurer, allowing for resolving specific Strings into a null value
* CustomEditorConfigurer and CustomScopeConfigurer accept editor/scope values as class names as well
* factored out AliasRegistry/SimpleAliasRegistry from BeanDefinitionRegistry/AbstractBeanFactory
* introduced SimpleBeanDefinitionRegistry implementation for bean definition reader testing
* "registerAlias" allows for overriding as long as bean definition overriding is allowed
* added convenient "autowireBean(Object existingBean)" method to AutowireCapableBeanFactory
* AbstractAutowireCapableBeanFactory removes singleton if created for type check in case of circular reference issues
* AbstractAutowireCapableBeanFactory applies specified TypeConverter to bean references as well (not just to literals)
* AbstractAutowireCapableBeanFactory resolves the target type for a generically typed dependency (method parameter)
* AbstractAutowireCapableBeanFactory's "applyBeanPropertyValues" fully initializes the BeanWrapper used for binding
* AbstractAutowireCapableBeanFactory's "applyBeanPropertyValues" and "configureBean" use a cached merged bean definition
* fixed AbstractAutowireCapableBeanFactory's "configureBean" (@Configurable) to avoid bean name creation for inner beans
* fixed AbstractAutowireCapableBeanFactory to skip invocation of InstantiationAwareBeanPostProcessors for null bean
* fixed AbstractAutowireCapableBeanFactory to always resolve the bean class before a FactoryBean type check
* added "freezeConfiguration()" method to Configurable/DefaultListableBeanFactory, allowing for eager metadata caching
* revised bean destruction logging to log at WARN level with exception toString only (full exception at DEBUG level)
* AutowiredAnnotationBeanPostProcessor resolves the target type for a generically typed dependency (method parameter)
* fixed AutowiredAnnotationBeanPostProcessor to correctly cache a collection with a single autowired bean as element
* fixed AutowiredAnnotationBeanPostProcessor to not cache special dependencies such as request and session references
* deprecated AbstractBeanDefinition's Spring 1.2 style "setSingleton" method in favor of Spring 2.0's "setScope"
* deprecated BeanDefinitionBuilder's "addConstructorArg" in favor of the consistently named "addConstructorArgValue"
* deprecated various rarely used BeanDefinitionBuilder methods in favor of settings on the raw BeanDefinition object
* added overloaded "genericBeanDefinition(beanClass)" method and "setParentName" method to BeanDefinitionBuilder
* added support for "(scope)" key to PropertiesBeanDefinitionReader: e.g. "myBean.(scope)=prototype"
* refactored AbstractBeanConfigurerAspect into Abstract(InterfaceDriven)DependencyInjectionAspect
* nested XML decoration elements (e.g. "aop:scoped-proxy") are explicitly rejected if no corresponding handler present
* InitDestroy/Autowired/Common/PersistenceAnnotationBeanPostProcessor perform appropriate debug logging
* factored out generic SpringBeanELResolver and SimpleSpringBeanELResolver from "web.jsf.SpringBeanFacesELResolver"

Package org.springframework.context
* added "getId()" method to ApplicationContext interface, with corresponding "setId" in AbstractApplicationContext class
* moved CONFIG_LOCATION_DELIMITERS constant from ConfigurableWebApplicationContext to ConfigurableApplicationContext
* fixed AbstractApplicationContext to correctly ignore FactoryBean results that implement the Lifecycle interface
* AbstractApplicationContext processes Lifecycle callbacks in the order of bean creation by default
* AbstractApplicationContext explicitly freezes its bean factory configuration at the end of the "refresh()" phase
* exposed "allowBeanDefinitionOverriding"/"allowCircularReferences" properties in AbstractRefreshableApplicationContext
* factored out AbstractRefreshableConfigApplicationContext base class for common handling of specified config locations
* ClassPathXmlApplicationContext and FileSystemXmlApplicationContext allow for bean-style configuration
* StaticApplicationContext builds GenericBeanDefinitions by default (instead of RootBeanDefinitions)
* added "initApplicationContext(ApplicationContext)" template method to ApplicationObjectSupport
* ClassPathBeanDefinitionScanner detects scoped-proxy bean definitions as compatible (in case of duplicate scanning)
* refactored ClassPathBeanDefinitionScanner into various template methods (for easier overriding)
* refactored ComponentScanBeanDefinitionParser into various template methods (for easier overriding)
* ComponentScanBeanDefinitionParser includes annotation config processors in nested composite component
* "context:component-scan" resolves "${...}" placeholders in package paths against system properties
* "context:component-scan" explictly ignores directories that accidentally match a specified custom resource pattern
* fixed "context:load-time-weaver" to not break post-processor detection in case of Spring jars deployed as shared libs
* added "context:property-override" configuration element, as a sibling to "context:property-placeholder"

Package org.springframework.core
* introduced Named(Inheritable)ThreadLocal, used throughout the framework for self-descriptive thread-bound context 
* added "getParameterName()" method to MethodParameter, activated through a ParameterNameDiscoverer
* factored out GenericTypeResolver from BridgeMethodResolver and GenericCollectionTypeResolver
* factored out DecoratingClassLoader base class from OverridingClassLoader and ShadowingClassLoader
* added "isReadable()" method to Resource interface, giving a readability hint upfront (supported by FileSystemResource)
* fixed ClassMetadataReadingVisitor (as used by "context:component-scan") to correctly ignore *usage* of inner classes

Package org.springframework.dao
* PersistenceExceptionTranslationPostProcessor extends ProxyConfig and applies its settings to newly created proxies

Package org.springframework.ejb
* Local/SimpleRemoteSlsbInvokerInterceptor use EJB(Local)Home for EJB 2.x detection, for WebSphere compatibility
* SimpleRemoteSlsbInvokerInterceptor properly detects CORBA connect failures on the IBM JVM (for WebSphere EJB access)

Package org.springframework.instrument
* added public "isInstrumentationAvailable()" method to InstrumentationLoadTimeWeaver, avoiding direct access to agent
* fixed ShadowingClassLoader to not attempt defining a package in case of a class in the default package

Package org.springframework.jca
* ResourceAdapterApplicationContext registers BootstrapContext as resolvable dependency type (for @Autowired)
* ResourceAdapterApplicationContext registers WorkManager as lazily resolvable dependency type (for @Autowired)
* added "workManagerName" property to WorkManagerTaskExecutor, for J2EE env lookups in JNDI (e.g. a Geronimo gbean-ref)
* introduced JBossWorkManagerTaskExecutor as adapter for the JBoss JCA WorkManager (analogous to CommonJ)
* introduced GlassFishWorkManagerTaskExecutor as adapter for the GlassFish JCA WorkManager (analogous to CommonJ)

Package org.springframework.jdbc
* DriverManagerDataSource's "driverClassName" throws IllegalStateException instead of CannotGetJdbcConnectionException
* added "defaultTransactionIsolationName" property to LazyConnectionDataSourceProxy
* SQLStateSQLExceptionTranslator translates "01*" data truncation codes into DataIntegrityViolationException
* SQLStateSQLExceptionTranslator translates "61*" deadlock codes into ConcurrencyFailureException
* SQLErrorCodesSQLExceptionTranslator falls back to SQL state translation for IBM DB2 and MS SQL by default
* added further default "sql-error-codes.xml" mappings for MS SQL, MySQL, PostgreSQL and Oracle
* DatabaseStartupValidator lets startup continue instead of 'busy' waiting in case of thread interruption
* JdbcTemplate falls back to type VARCHAR for a null value in case of an unknown SQL type specified against IBM DB2
* JdbcTemplate uses "PreparedStatement.setString" in case of LONGVARCHAR and CLOB (if given a String value)
* fixed CallMetaDataContext to skip SqlParameter objects without name (avoiding NPE)
* merged AbstractBeanPropertyRowMapper into concrete BeanPropertyRowMapper class
* removed BeanPropertyRowMapper's "newInstance" method to avoid confusion with ParameterizedBeanPropertyRowMapper
* revised BeanPropertyRowMapper to use JavaBean property introspection instead of expecting field/setter name matches
* factored out "initBeanWrapper"/"getColumnValue" template methods in BeanPropertyRowMapper, allowing for customization
* BeanPropertyRowMapper shares ResultSet value access logic with SingleColumnRowMapper
* BeanPropertyRowMapper and SingleColumnRowMapper perform Oracle-specific "getObject" checks for unknown specified types
* added ParameterizedSingleColumnRowMapper with a convenient "newInstance" method to specify the required type only once
* BeanPropertySqlParameterSource derives a default SQL type from the corresponding property type (for typed null values)

Package org.springframework.jms
* improved SimpleMessageConverter's exception message for an unsupported message payload
* DefaultMessageListenerContainer logs listener setup failures at INFO instead of ERROR level
* DefaultMessageListenerContainer allows for specifying a callback on "stop", for a notification after actual stopping
* DefaultMessageListenerContainer lets shutdown continue instead of 'busy' waiting in case of thread interruption
* fixed DefaultMessageListenerContainer to correctly process "sessionTransacted=true" in case of locally exposed Session
* SimpleMessageListenerContainer exposes listener Session as thread-bound resource for JmsTemplate calls (like DMLC)
* deprecated ServerSessionMessageListenerContainer in favor of DefaultMessageListenerContainer/JmsMessageEndpointManager
* DefaultJmsActivationSpecFactory is compatible with WebSphere MQ 6.0.2.1 as well now

Package org.springframework.jmx
* factored out "doUnregister(objectName)" and "onRegister(objectName,mbean)" methods in MBeanRegistrationSupport
* MBeanExporter actually sets "exposeManagedResourceClassLoader" to "true" by default (matching the 2.5 javadoc now)
* MBeanExporter explicitly removes all of its registered NotificationListeners from the target MBeanServer on shutdown
* introduced NotificationListenerRegistrar for registering a listener with any MBean on any MBeanServer(Connection)

Package org.springframework.mail
* added "text/csv" to ConfigurableMimeFileTypeMap's and thus MimeMessageHelper's default MIME mappings

Package org.springframework.mock
* added "getServletContext()" method to MockHttpServletRequest (not available in the HttpServletRequest interface)

Package org.springframework.orm
* introduced "postProcessMappings" template method in Hibernate LocalSessionFactoryBean
* fixed Hibernate AnnotationSessionFactoryBean to allow for mixed mapping sources (despite 2.5.1's "buildMappings" call)
* HibernateTemplate exposes the "org.hibernate.event.EventSource" and "org.hibernate.classic.Session" interfaces as well
* introduced "EntityManagerFactoryUtils.closeEntityManager" method that protects against exceptions thrown from close
* Hibernate/Jpa/JdoTransactionManager explicitly rollback an active transaction before closing when begin failed
* fixed TopLinkTransactionManager to correctly expose the underlying JDBC Connection in read-write transaction scenarios
* JDO/JPA factories check autodetected proxy interfaces for visibility in the ClassLoader (for WebSphere compatibility)
* added "entityManagerFactoryInterface" property to AbstractEntityManagerFactoryBean, as alternative to autodetection
* added "getEntityManagerFactoryInterface()" to JpaVendorAdapter (for WebSphere compatibility of OpenJpaVendorAdapter)
* added "getPersistenceProviderRootPackage()" to JpaVendorAdapter, for excluding provider classes from class overriding
* introduced EclipseLinkJpaVendorAdapter and EclipseLinkJpaDialect, supporting EclipseLink 1.0 M4 or higher

Package org.springframework.remoting
* factored out RemotingSupport base class from RemoteAccessor and RemoteExporter
* (Jndi)RmiClientInterceptor properly detects CORBA connect failures on the IBM JVM
* HessianClientInterceptor and BurlapClientInterceptor expose the bean ClassLoader as thread context CL (if necessary)
* added overloaded "executeRequest" method with original MethodInvocation argument to HttpInvokerClientInterceptor
* added "hostname" bean property to SimpleHttpServerFactoryBean, for a specific network address to bind to

Package org.springframework.scripting
* introduced "ScriptFactory.requiresScriptedObjectRefresh(ScriptSource)" for object refresh even after a type check call
* GroovyScriptFactory and JRubyScriptFactory refresh scripted object instances even after an intermediate type check
* introduced "ScriptSource.suggestedClassName()" for dynamic Groovy scripts that do not define a class themselves
* GroovyScriptFactory uses resource filename (for files) or bean name (for inline scripts) as suggested class name
* added "depends-on" attribute to "lang:bsh/groovy/jruby" configuration element

Package org.springframework.test
* TestContextManager ignores default TestExecutionListeners that cannot be instantiated (e.g. due to spring-tx missing)
* AbstractJUnit38SpringContextTests runs "afterTestMethod" callbacks even when "beforeTestMethod" or "setUp" failed
* AbstractTestNGSpringContextTests executes Spring default callbacks in any case (marked with "alwaysRun = true")
* added configurable "sqlScriptEncoding" property to AbstractTransactionalXxxSpringContextTests (for reading scripts)

Package org.springframework.util
* revised ConcurrencyThrottleSupport's interruption handling to throw an IllegalStateException instead of 'busy' waiting
* deprecated ResponseTimeMonitor and PerformanceMonitorListener classes in favor of custom classes for specific needs

Package org.springframework.validation
* DataBinder's "initDirectFieldAccess()" sets the "extractOldValueForEditor" flag by default, analogous to bean access

Package org.springframework.web
* ServletRequestAttributes keeps hold onto the original session if a "request.getSession" call suddenly returns null
* added "setConfigLocation" method to ConfigurableWeb/PortletApplicationContext, accepting an init-param style value
* added "initServletContext(ServletContext)" template method to WebApplicationObjectSupport
* optimized ServletContextResource's and PortletContextResource's "exists()" check to avoid unnecessary stream opening
* Commons(Portlet)MultipartResolver catches and logs any exception thrown from file item cleanup (not propagating it)
* introduced NativeWebRequest and MultipartRequest interfaces for even finer-grained generic request access options
* introduced FacesRequestAttributes adapter, with attributes access falling back to current JSF FacesContext by default
* added "dispatchOptionsRequest/TraceRequest" properties to FrameworkServlet, for dispatching all HTTP request methods
* deprecated PathMap attribute and CommonsPathMapHandlerMapping class in favor annotation-based request mapping
* deprecated ThrowawayController and ThrowawayControllerHandlerAdapter in favor annotation-based controllers
* @RequestMapping's "method" attribute supported at type level as well, expressing restriction for entire handler
* @RequestMapping's "params" attribute supported at type level for Servlets, expressing precondition for entire handler
* @RequestMapping's "params" attribute supported at type level for Portlets, mapping mode+params onto specific handler
* @RequestMapping annotation supports "!myParam" expressions for non-presence of a specific parameter as well
* introduced WebArgumentResolver interface and "customArgumentResolver(s)" property on AnnotationMethodHandlerAdapter
* factored out common HandlerMethodResolver/Invoker classes from Servlet/Portlet AnnotationMethodHandlerAdapter
* AnnotationMethodHandlerAdapter does not restrict supported HTTP methods by default (allowing for PUT, DELETE as well)
* AnnotationMethodHandlerAdapter narrows through method name resolution even for a set of equal non-empty mappings
* AnnotationMethodHandlerAdapter resolves the target type for a generically typed @RequestParam/@ModelAttribute argument
* AnnotationMethodHandlerAdapter properly allows for resolving a Principal argument to null (in case of none defined)
* AnnotationMethodHandlerAdapter resolves InputStream/OutputStream and Reader/Writer subclasses as well
* added "synchronizeOnSession" property to AnnotationMethodHandlerAdapter, analogous to AbstractController
* fixed AnnotationMethodHandlerAdapter to avoid NPE in case of plain model attribute returned from handler method
* Servlet AnnotationMethodHandlerAdapter sends HTTP 404 instead of throwing IllegalState if no handler method found
* Portlet AnnotationMethodHandlerAdapter throws UnavailableException instead of IllegalState if no handler method found
* added "prepareResponse"/"generatesDownloadContent" methods to AbstractView, for HTTPS cache header workaround for IE
* AbstractPdfView and Abstract(J)ExcelView participate in AbstractView's HTTPS cache header workaround for IE
* AbstractJasperReportsView does not perform a hard response reset, in favor of AbstractView's HTTPS cache workaround
* AbstractTemplateView catches "HttpServletResponse.getContentType()" exceptions (for JBoss Portal compatibility)
* InternalResourceView only exposes forward attributes when running on Servlet <2.5 (for GlassFish compatibility)
* InternalResourceView detects circular dispatching to the same view even in case of pattern matches for same handler
* InternalResourceView prevents dispatch to same handler path only if the "preventDispatchLoop" flag is set to "true"
* InternalResourceViewResolver sets "preventDispatchLoop" to "true" for conventional name-based View instances only
* JstlView exposes a JSTL-aware MessageSource even for a custom MessageSource passed in through the constructor
* re-added AbstractDataBoundFormElementTag's COMMAND_NAME_VARIABLE_NAME in deprecated form (Spring 2.0.x compatibility)
* made FormTag's MODEL_ATTRIBUTE_VARIABLE_NAME public (as replacement of COMMAND_NAME_VARIABLE_NAME)
* JSP Checkbox(es)Tag and RadioButton(s)Tag render label as HTML label element after input element (for HTML compliance)
* JSP CheckboxesTag and RadioButtonsTag compare raw item / raw Map key for selection check as well
* JSP SelectTag and OptionsTag compare raw Map key for selection check as well


Changes in version 2.5.1 (2008-01-09)
-------------------------------------

General
* refined PDF formatting settings for the reference documentation
* added coverage of JAX-WS support to the reference documentation
* added section on J2EE RAR deployment to the reference documentation
* moved "org.springframework.web.bind/multipart" packages from spring-web.jar to spring-webmvc.jar
* updated AspectJ jar in "-with-dependencies" distribution to AspectJ 1.5.4
* updated Groovy jar in "-with-dependencies" distribution to Groovy 1.5.1
* updated Hessian jar in "-with-dependencies" distribution to Hessian 3.1.3
* updated iText jar in "-with-dependencies" distribution to iText 2.0.7
* updated POI jar in "-with-dependencies" distribution to POI 3.0.1

Package org.springframework.aop
* ProxyFactory caches CGLIB proxies only when underlying (Smart)ClassLoader does not indicate a reloadable Class
* added "logTargetClassInvocation" property to AbstractMonitoringInterceptor, for logging the target invocation trace

Package org.springframework.beans
* ConfigurablePropertyAccessor extends the TypeConverter interface (moved up from BeanWrapper interface)
* BeanWrapper supports well-known collection implementation types for generic element conversion again (like Spring 2.0)
* TypeConverterDelegate protects its text conversion step against PropertyEditors which don't support "setValue" calls
* factored out FactoryBeanRegistrySupport base class from AbstractBeanFactory and AbstractAutowireCapableBeanFactory
* optimized AbstractBeanFactory's access to cached FactoryBean-exposed objects, avoiding unnecessary locks
* ConstructorResolver prefers concrete class matches over interface matches at the same level when checking arguments
* revised accidental public exposure of "isPrimary" method in ConfigurableListableBeanFactory/DefaultListableBeanFactory
* moved "resolveDependency" implementation from AbstractAutowireCapableBeanFactory down to DefaultListableBeanFactory
* revised DefaultListableBeanFactory's "resolveDependency" exceptions with respect to clarity and context inclusion
* DefaultListableBeanFactory does not eagerly initialize FactoryBeans for type checks even with factory-bean reference
* DefaultListableBeanFactory throws descriptive exception in case of factory-bean circular reference
* DefaultListableBeanFactory supports ObjectFactory indirection for resolvable dependencies
* DefaultListableBeanFactory always resolves bean class before checking a bean definition as autowire candidate
* AbstractBeanDefinition stores and exposes the originating Resource (rather than just the resource description)
* XmlBeanDefinitionReader detects recursive loading of the same resource (e.g. through import cycles)
* DefaultBeanDefinitionDocumentReader sends ImportDefinition events containing the actually resolved Resource objects
* DefaultDocumentLoader includes the JAXP IllegalArgumentException in the rethrown ParserConfigurationException
* ClassPathBeanDefinitionScanner marks default init/destroy methods as not enforced (accepting beans without those)
* SingletonBeanFactoryLocator falls back to a single bean of type BeanFactory (if any) when given a null locator key
* SingletonBeanFactoryLocator removes bean factory group definition if its initialization fails
* factored out protected "getTargetBean" method in ObjectFactoryCreatingFactoryBean (for easier overriding)
* revised BeanConfigurerSupport to allow for usage as a delegate as well, not just as a base class
* revised BeanConfigurerSupport to re-initialize its default BeanWiringInfoResolver for each context refresh
* fixed AutowiredAnnotationBeanPostProcessor to properly cache dependencies that do not correspond to a registered bean
* annotation processors detect already managed methods/fields, avoiding double invocation in case of multiple processors
* explicit annotation processors override implicit default processors (as built by annotation-config / component-scan)

Package org.springframework.cache
* added "cacheManagerName" property to EhCacheManagerFactoryBean

Package org.springframework.context
* fixed AbstractApplicationContext to only send ContextStoppedEvent in case of "stop()" (i.e. not for "close()")
* fixed AbstractApplicationContext to always detect LoadTimeWeaverAwareProcessor in the local ClassLoader (for OSGi)
* ClassPath/FileSystemXmlApplicationContext perform early check for null elements in config location array
* added "addMessages(Map, Locale)" method to StaticMessageSource, for bulk adding messages
* ContextTypeMatchClassLoader does not generally exclude classes in the "org.springframework" package anymore
* DefaultContextLoadTimeWeaver only chooses GlassFishLoadTimeWeaver when running in the EAR ClassLoader
* DefaultContextLoadTimeWeaver removes all registered transformers from the VM Instrumentation object (if applicable)
* CommonAnnotationBeanPostProcessor properly ignores @Resource-annotated JAX-WS WebServiceContext references
* AnnotationBeanNameGenerator (used by "context:component-scan") detects default name values in custom annotation types
* ClassPathScanningCandidateComponentProvider ("context:component-scan") ignores non-static inner and local classes
* "context:property-placeholder" configuration element does not require a "location" attribute (for system properties)

Package org.springframework.core
* introduced SmartClassLoader marker interface, declaring a "boolean isClassReloadable(Class clazz)" operation
* OverridingClassLoader excludes the "oracle." package by default as well (e.g. for TopLink's custom annotations)
* MethodParameter uses reflection to obtain parameter annotations (for compatibility with the IBM 1.4.2 VM's debug mode)
* LocalVariableTableParameterNameDiscoverer caches parameter names per method and obtained ASM ClassReaders per class
* added "getEnclosingClassName()", "hasEnclosingClass()" and "isIndependent()" methods to ClassMetadata interface

Package org.springframework.ejb
* "jee:local-slsb" and "jee:remote-slsb" work for EJB3 Session Beans as well (as alternative to "jee:jndi-lookup")
* introduced EJB3-compliant SpringBeanAutowiringInterceptor for processing Spring's @Autowired in EJB3 SBs/MDBs

Package org.springframework.instrument
* InstrumentationLoadTimeWeaver allows for operating on a pre-defined ClassLoader and for removing transformers again
* TomcatInstrumentableClassLoader always passes local ClassLoader into ClassFileTransformers (makes AspectJ LTW work)
* ShadowingClassLoader excludes the "com.ibm." package by default as well (for IBM JDK classes, DB2 JDBC driver, etc)

Package org.springframework.jdbc
* fixed JdbcUtils to not access the DatabaseMetaData implementation class for "extractDatabaseMetaData" calls
* TransactionAwareDataSourceProxy obtains target Connections lazily when the first call comes in on the Connection proxy
* added "reobtainTransactionalConnections" flag to TransactionAwareDataSourceProxy (for Connection handles on JBoss)
* WebSphereDataSourceAdapter, JBossNativeJdbcExtractor and CommonsDbcpNativeJdbcExtractor propagate SQLExceptions as-is

Package org.springframework.jms
* JmsUtils protects against misbehaving JMS providers (such as ActiveMQ) when closing an interrupted MessageConsumer
* JmsTemplate's standard "execute(ProducerCallback)" pre-initializes producer with default destination (if available)
* added overloaded execute methods with Destination/destination name and ProducerCallback to JmsOperations/JmsTemplate
* added various "browse"/"browseSelected" methods JmsOperations/JmsTemplate, for browsing a queue with a BrowserCallback
* DelegatingConnectionFactory adapts specific create(Queue/Topic)Connection calls to a generic JMS 1.1 ConnectionFactory
* JmsInvokerClientInterceptor accepts any JMS 1.1 ConnectionFactory, not insisting on a QueueConnectionFactory anymore
* MethodListenerAdapter uses type difference weight algorithm to choose between ambiguous listener methods
* DefaultMessageListenerContainer catches TaskRejectedException and pauses affected tasks for subsequent resuming
* DefaultMessageListenerContainer exposes listener Session as thread-bound resource for JmsTemplate calls
* ServerSessionMessageListenerContainer always establishes a shared Connection (even if autoStart="false")
* CommonsPoolServerSessionFactory removes specific ServerSessionPool on close (for proper reuse on stop and restart)
* "jms:listener-container" tag supports a concurrency range (e.g. "3-5"), for specifying a minimum number of consumers

Package org.springframework.jmx
* added "getServer()" method to MBeanRegistrationSupport (MBeanExporter), exposing the underlying JMX MBeanServer

Package org.springframework.jndi
* JndiTemplate prepares a specific Hashtable for the InitialContext, exposing default environment properties as well

Package org.springframework.mail
* fixed potential NPE in MailSendException

Package org.springframework.mock
* MockRequestDispatcher stores forwarded/included URL in MockHttpServletResponse even in case of wrapped response

Package org.springframework.orm
* LocalSessionFactoryBean uses LocalJtaDataSourceConnectionProvider (supporting aggressive release) in case of JTA TM
* LocalSessionFactoryBean supports Connection release mode "after_statement" without "useTransactionAwareDataSource" too
* LocalSessionFactoryBean eagerly compiles registered mappings, for availability in the post-processing phase
* added "cacheProvider" property to LocalSessionFactoryBean, allowing for a Spring-managed CacheProvider instance
* added overloaded "delete" methods with "entityName" argument to HibernateOperations and HibernateTemplate
* added "earlyFlushBeforeCommit" flag to HibernateTransactionManager, allowing to enforce a flush before synchronization
* fixed Jpa/JdoTransactionManager to correctly nest a REQUIRES_NEW transaction within a SUPPORTS scope with early access
* JPA PersistenceUnitReader supports location patterns for the "jar-file" attribute in "persistence.xml" files
* PersistenceAnnotationBeanPostProcessor accepts vendor-specific EntityManager interfaces for @PersistenceContext again

Package org.springframework.remoting
* HessianClientInterceptor/ProxyFactoryBean supports "debug", "chunkedPost", "readTimeout" and "hessian2" properties
* HessianServiceExporter supports "debug" property analogous to Hessian 3.1.3's HessianServlet
* HessianServiceExporter and BurlapServiceExporter expose the bean ClassLoader as thread context CL (if necessary)
* factored out stream-based HessianExporter and BurlapExporter classes
* factored out abstract RemoteInvocationSerializingExporter base class from HttpInvokerServiceExporter
* introduced SimpleHttpInvokerServiceExporter and SimpleHessian/BurlapServiceExporter as HttpHandlers for Sun JRE 1.6
* introduced SimpleHttpServerFactoryBean for Spring-style set-up of a Sun JRE 1.6 HttpServer

Package org.springframework.samples
* PetClinic's JPA version showcases AspectJ load-time weaving, including @Transactional handling in AspectJ mode
* PetClinic's JPA EntityManagerClinic uses explicit flushing and id assigning to make sure that the id is available

Package org.springframework.scheduling
* ThreadPoolTaskExecutor supports Java 6's "allowCoreThreadTimeOut" feature (for both native and backport-concurrent)

Package org.springframework.scripting
* fixed ScriptFactoryPostProcessor to avoid NPE in case of script that produces null value and no interfaces specified
* StaticScriptSource exposes "StaticScript" as toString result, in order for Groovy to derive a valid class name from it
* GroovyScriptFactory caches a temporarily created result object from "getScriptedObjectType" until "getScriptedObject"
* GroovyScriptFactory exposes "getGroovyClassLoader()" method and lazily initializes the GroovyClassLoader
* "lang:groovy/jruby/bsh" does not insist on an id for a scripted bean anymore (i.e. allows for anonymous scripts)

Package org.springframework.test
* fixed AbstractContextLoader to detect and accept "classpath*:" URLs as well
* AbstractTestNGSpringContextTests does not define a "SpringTestContext" group anymore (for ease of using custom groups)

Package org.springframework.transaction
* added "validateExistingTransaction" property to AbstractPlatformTransactionManager, for isolation level checks
* added "prepareForCommit" template method to AbstractPlatformTransactionManager, called before commit synchronization
* JtaTransactionManager consistently throws TransactionSystemException in case of unexpected internal transaction state
* JtaTransactionManager detects JBoss 4.2 transaction rollbacks caused by a timeout, throwing a meaningful exception
* fixed WebSphereUowTransactionManager to correctly detect an existing global transaction (ignoring local tx contexts)

Package org.springframework.ui
* fixed ModelMap's "mergeAttributes" to correctly copy new attributes into the model
* added "containsAttribute" method to ModelMap, as a more specific alternative to a general "containsKey" call
* introduced Java-5-specific Model interface (for use with MVC handler methods) and corresponding ExtendedModelMap impl

Package org.springframework.util
* AutoPopulatingList is serializable now
* MethodInvoker (and subclasses) use type difference weight algorithm to choose between multiple matching methods
* FreeMarker "formSingleSelect" macro also accepts options from a sequence (list) as both labels and values

Package org.springframework.validation
* clarified that BindingResult's "getPropertyEditorRegistry()" method may return null to indicate no support for editors
* DataBinder implements the TypeConverter interface, delegating to the underlying PropertyAccessor

Package org.springframework.web
* ContextLoader(Listener/Servlet) explicitly removes the context attribute from the ServletContext (for WLS hot deploy)
* introduced static "getCurrentWebApplicationContext()" accessor on ContextLoader, for context lookup by thread
* introduced SpringBeanAutowiringSupport class for self-autowiring classes within a web app (e.g. JAX-WS endpoints)
* WebApplicationContext impls register request/session/ServletContext as resolvable dependencies (e.g. for @Autowired)
* PortletApplicationContext impls register request/session/PortletContext as resolvable dependencies (for @Autowired)
* CommonsMultipartResolver uses FileUpload 1.2's "isMultipartContent" variant when available (for stricter checks)
* added "useCacheControlNoStore" property to WebContentGenerator, allowing to suppress the "no-store" header value
* SimpleUrlHandlerMapping explicitly trims specified handler bean names (in order to ignore unintended whitespace)
* UrlPathHelper detects a context path of "/" (as exposed by Jetty for includes) and processes it as root context ("")
* improved NoSuchRequestHandlingMethodException's error message to include request URL and query string explicitly
* DispatcherServlet consistently logs correct request URI for include requests (even in debug log messages)
* MultiActionController properly supports String return types for handler methods (for consistency with @RequestMapping)
* MultiActionController detects and rejects invalid last-modified method return types
* WebRequest interface (as supported for @RequestMapping) supports "checkNotModified" method for last-modified handling
* @RequestMapping paths are considered a match even without suffix (e.g. "/users" matches a request for "/users.do")
* @InitBinder methods apply to @RequestParam parameters as well, with the @InitBinder value matched against param names
* @ModelAttribute's default attribute names are consistently derived from the *declared* parameter/return type
* AnnotationMethodHandlerAdapter properly handles overridden handler methods with overridden @RequestMapping annotation
* AnnotationMethodHandlerAdapter maps relative paths specified at method level analogous to default method name mappings
* AnnotationMethodHandlerAdapter throws an exception if it cannot find a clear best path match for a specific request
* AnnotationMethodHandlerAdapter throws descriptive exception in case of optional parameter being declared as primitive
* AnnotationMethodHandlerAdapter automatically resolves arguments of type Principal as the request's user principal
* AnnotationMethodHandlerAdapter propagates checked exceptions as-is for handler/attribute/init-binder methods
* AnnotationMethodHandlerAdapter applies @InitBinder methods for view preparation as well (like WebBindingInitializers)
* AnnotationMethodHandlerAdapter applies binder initialization for 'end' views (with processing being complete) as well
* factored out "createBinder" template method within AnnotationMethodHandlerAdapter, called for each binding attempt
* Servlet AnnotationMethodHandlerAdapter supports View return value for handler methods (as alternative to view name)
* fixed Portlet AnnotationMethodHandlerAdapter to explicitly check for Action/Render*Response* (to work on Liferay)
* InternalResourceView prevents dispatching to same path as handler (e.g. with default view name and default resolver)
* JstlView detects session-scoped JSTL LocalizationContext/Locale attributes and merges them with its own context
* JstlView and (JspAware)RequestContext consistently use JSTL Config class for scoped attribute access
* reworked Spring's Tiles2 support such that it can operate against the Tiles2 (2.0.5+) JDK 1.4 version as well
* Tiles2 TilesView explicitly checks whether the Tiles container has been initialized (throwing a descriptive exception)
* Tiles2 TilesView exposes Servlet 2.4 forward request attributes (for non-2.4-compliant web containers like OC4J)
* fixed JSP BindTag to correctly detect and ignore a repeated nested path for the global errors case
* JSP CheckboxTag/CheckboxesTag and RadioButtonTag/RadioButtonsTag use registered property editor for value rendering


Changes in version 2.5 final (2007-11-19)
-----------------------------------------

General
* updated javadoc and reference documentation
* revised PetPortal sample application into a full-fledged Java 5 showcase (annotation-based configuration etc)

Package org.springframework.aop
* fixed garbage collection problem with CGLIB proxies, using a strong reference map for the fixed interceptors

Package org.springframework.context
* "context:load-time-weaver" autodetects the GlassFish ClassLoader even within a GlassFish web app now
* "context:load-time-weaver" correctly detects the use of the Spring VM agent on WebLogic 9

Package org.springframework.core
* URL-to-File conversion for ClassPathResource/UrlResource performs URI-based decoding rather than using URLDecoder
* optimized UrlResource's handling of URI access and File access if constructed with a URI directly
* fixed AbstractLabeledEnum to correctly determine the default enum type for a top-level enum class (again)

Package org.springframework.jdbc
* added "registerDatabase" method to SQLErrorCodesFactory, for eager association of database names with DataSources

Package org.springframework.jms
* DefaultMessageListenerContainer avoids deadlock between Connection and Session through the use of a shared monitor

Package org.springframework.jndi
* fixed "jee:jndi-lookup" tag to correctly handle "default-value" and "default-ref" attributes

Package org.springframework.orm
* Hibernate SpringSessionSynchronization explicitly disconnects on suspend/completion (to make "on_close" work on JBoss)

Package org.springframework.scheduling
* fixed CommonJ TimerManagerFactoryBean to not require the "scheduledTimerListeners" property

Package org.springframework.test
* TestContextManager logs TestExecutionListener exceptions at error/warn level instead of info/debug

Package org.springframework.transaction
* JtaTransactionManager swallows IllegalStateException when synchronizing with existing transaction (for JBoss 4.2)

Package org.springframework.web
* CommonsMultipartResolver detects multiple files for the same field name and throws a corresponding exception
* RequestToViewNameTranslator kicks in before the "HandlerInterceptor.postHandle" phase
* RequestToViewNameTranslator's "getViewName" is allowed to return null if no default found
* fixed AnnotationMethodHandlerAdapter to expose the implicit model even when using request-to-view-name translation
* fixed AnnotationMethodHandlerAdapter to correctly match parameters even in case of request method specified as well
* DispatcherPortlet/AnnotationMethodHandlerAdapter swallows IllegalStateException when setting implicit render parameter
* Portlet AnnotationMethodHandlerAdapter preserves implicit model from action phase to render phase
* Portlet AnnotationMethodHandlerAdapter applies cache settings (prevents caching when session attributes are involved)
* Portlet AnnotationMethodHandlerAdapter allows default @RequestMapping annotations for action as well as render methods
* Portlet AnnotationMethodHandlerAdapter resolves PortletPreferences, PortletMode, WindowState, PortalContext arguments
* factored out AbstractWizardFormController's "getTargetPage" logic into WebUtils/PortletUtils, for reuse in custom code
* InternalResourceView explicitly sets content type on response in include case (for correct charset handling on Tomcat)
* exposed applicable standard HTML attributes on JSP "form:option" and "form:options" tags
* JSP form tags always autogenerate valid HTML ids (not including "[" or "]" characters from array element properties)


Changes in version 2.5 RC2 (2007-11-12)
---------------------------------------

General
* introduced complete rewrite of the Spring MVC step-by-step guide for version 2.5

Package org.springframework.aop
* fixed garbage collection problem with CGLIB proxies, now holding onto the Advised configuration independent of factory

Package org.springframework.beans
* DefaultListableBeanFactory now supports autowiring of FactoryBean instances 'by type'
* revised DefaultListableBeanFactory's exception handling for clearer wrapping of nested exceptions
* DefaultListableBeanFactory performs bean creation within a PrivilegedAction (for SecurityManager compatibility)
* optimized DefaultListableBeanFactory's invocation of setter methods for re-created bean instances
* optimized DefaultListableBeanFactory's invocation of post-processor methods
* changed XmlReaderContext's "getReader()" to expose the XmlBeanDefinitionReader again (for backwards compatibility)
* AutowiredAnnotationBeanPostProcessor caches determined candidate constructors per bean class
* RequiredAnnotationBeanPostProcessor caches validated bean names, skipping re-validation for the same bean
* added bean type argument to MergedBeanDefinitionPostProcessor (for InitDestroyAnnotationBeanPostProcessor)

Package org.springframework.context
* "context:mbean-export" autodetects WebLogic and WebSphere, performing an appropriate MBeanServer lookup
* "context:mbean-export" falls back to a simple MBeanExporter on JDK 1.4, detecting standard MBeans
* introduced "context:mbean-server" configuration element, for setting up a standalone MBeanServer reference
* "context:load-time-weaver" automatically activates "spring-configured" if AspectJ weaving is enabled
* "context:load-time-weaver"'s temporary ClassLoader for type matching uses a fully isolated loader for each match

Package org.springframework.dao
* PersistenceExceptionTranslationAdvisor detects @Repository on interfaces as well

Package org.springframework.jca
* added missing "refresh()" call to SpringContextResourceAdapter's ApplicationContext

Package org.springframework.jdbc
* TransactionAwareDataSourceProxy exposes a special "toString()" result for its Connection proxies
* fixed SingleColumnRowMapper to use passed-in required type in the default "convertValueToRequiredType" implementation
* SimpleJdbcCallOperations and SimpleJdbcInsertOperations return the interface type (not the impl) for method chaining

Package org.springframework.jndi
* "jee:jndi-lookup" supports "default-value" and "default-ref" attributes, translated to a default object

Package org.springframework.mail
* MailSendExceptions keeps failed messages in a LinkedHashMap, allowing for access in the order of sending
* added "getMessageExceptions()" accessor to MailSendException, with "getFailedMessages()" being transient now

Package org.springframework.orm
* fixed Jpa/JdoTransactionManager to correctly suspend and resume even for dialects without JDBC Connection retrieval
* SqlMapClientTemplate explicitly checks for TransactionAwareDataSourceProxy, avoiding double synchronization

Package org.springframework.remoting
* RmiClientInterceptor and AbstractSlsbInvokerInterceptor do not consider MarshalException as connect failure anymore

Package org.springframework.stereotype
* @Component, @Repository, etc are not marked as inherited anymore (i.e. inheritance checks to be performed explicitly)

Package org.springframework.test
* AbstractGenericContextLoader provides an opportunity for subclasses to customize the context before calling refresh
* revised TestExecutionListener method signatures to declare Exception instead of Throwable

Package org.springframework.transaction
* "tx:jta-transaction-manager" autodetects Oracle OC4J as well, in addition to WebLogic and WebSphere

Package org.springframework.web
* ContextLoader provides an opportunity for subclasses to customize the context before calling refresh
* made AbstractController's handleRequest entry point method non-final (allowing for overriding and CGLIB proxying)
* AbstractUrlHandlerMapping always takes the first matching path (in case of multiple path patterns of equal length)
* AnnotationMethodHandlerAdapter for Servlet MVC exposes UrlPathHelper and PathMatcher configuration properties
* AnnotationMethodHandlerAdapter for Servlet MVC supports MethodNameResolver for resolving default handler methods
* AnnotationMethodHandlerAdapter for Servlet MVC supports path patterns for @RequestMapping at the method level as well
* AnnotationMethodHandlerAdapter for Servlet MVC always prevents HTTP caching in case of @SessionAttributes specified
* reworked @RequestMapping's "type" attribute into "method", accepting strongly typed @RequestMethod enum values
* revised AnnotationMethodHandlerAdapter's resolution of multiple matching handler methods to take params into account
* @RequestParam's "value" attribute is not required anymore, defaulting to the method parameter name (if available)
* added "types" attribute to @SessionAttributes, allowing to enumerate model attributes types instead of names
* AbstractJasperReportsSingleFormatView converts exporter parameter values in the model (if appropriate)
* InternalResourceView lets explicit model attributes override Spring beans in case of "exposeContextBeansAsAttributes"
* JstlView does not set "exposeContextBeansAsAttributes" flag to "true" by default (analogous to InternalResourceView)
* JSF 1.1 DelegatingVariableResolver checks original VariableResolver first again (for strict backwards compatibility)
* introduced JSF 1.1 SpringBeanVariableResolver, letting Spring bean definitions override other attributes of same name
* renamed JSF 1.2 DelegatingFacesELResolver to SpringBeanFacesELResolver, indicating its concrete lookup strategy
* fixed Tiles 1.x TilesConfigurer to explicitly set the factory name to empty String by default


Changes in version 2.5 RC1 (2007-10-22)
---------------------------------------

General
* introduced spring-framework-with-docs.zip distribution; reduced spring-framework.zip to the minimal binaries
* spring.jar does not include Servlet Web MVC support anymore; add spring-webmvc.jar separately
* spring.jar and spring-core.jar include repackaged version of ASM 2.2.3 (avoiding side effects with other ASM versions)
* spring-orm.jar contains the web ORM support (again), in order to avoid split packages across bundles
* spring-web.jar includes the entire Hessian, Burlap, HTTP invoker, JAX-RPC and JAX-WS support (avoiding split packages)
* removed outdated Countries sample application
* revised PetClinic sample application into a full-fledged Java 5 showcase (annotation-based configuration etc)
* revised default handling in BeanDefinitionParsers for XML config namespaces to work without XSD validation as well
* updated Spring's JDO support to require JDO 2.0 or higher, with early support for JDO 2.1 features

Package org.springframework.aop
* revised AdvisedSupport to avoid lock contention for method cache lookups (using a concurrent map with special keys)
* fixed AspectJ pointcut handling to strictly match generic return types according to Java language rules
* AspectJ pointcut matching only registers LocalVariableTableParameterNameDiscoverer if ASM is present on the classpath
* removed unused pointcut type attribute from "spring-aop-2.5.xsd"

Package org.springframework.beans
* BeanWrapperImpl obtains old value with converted key in case of a Map with non-String keys
* TypeMismatchException and MethodInvocationException are serializable even in case of non-serializable property values
* URIEditor only tries to resolve "classpath:" locations if explicitly constructed with a ClassLoader
* URIEditor converts spaces in location values into "%20" quotes (as required by the URI format)
* exposed "autowireCandidate" property in BeanDefinition interface (avoiding casts to AbstractBeanDefinition)
* deprecated ConfigurableBeanFactory's "registerCustomEditor" in favor of "addPropertyEditorRegistrar"
* AbstractBeanFactory ignores PropertyEditorRegistrars which tried to obtain a currently created bean
* revised AbstractBeanFactory to detect FactoryBeans which are in turn created through factory methods
* DefaultListableBeanFactory freshly resolves autowired arguments even for cached constructors (re-resolving prototypes)
* DefaultListableBeanFactory removes a singleton bean instance if a new bean definition gets registered
* DefaultListableBeanFactory fully destroys singleton bean instance when the corresponding bean definition gets replaced
* DefaultListableBeanFactory resets the caches for all derived beans as well if a bean definition gets replaced
* fixed CglibSubclassingInstantiationStrategy to avoid CGLIB class leak for inner prototypes with MethodReplacer usage
* XmlBeanDefinitionReader initializes default EntityResolver lazily, avoiding classpath scan in case of custom resolver
* DefaultNamespaceHandlerResolver exposes public DEFAULT_HANDLER_MAPPINGS_LOCATION constant
* DefaultNamespaceHandlerResolver loads NamespaceHandler mappings and classes lazily (only when namespace actually used)
* fixed BeanDefinitionParserDelegate to correctly parse property sub-elements even with custom name for beans namespace
* BeanDefinitionParserDelegate stores definition source for metadata attributes and qualifier attributes
* qualifier attributes consist of "key" and "value" in spring-beans-2.5.xsd (formerly "name" and "value")
* AbstractBeanDefinition's qualifier handling provides a unified "addQualifier(AutowireCandidateQualifier)" method
* AbstractSingleBeanDefinitionParser applies full scope to inner beans, making them eligible for destruction callbacks
* added "getParentName" template method to AbstractSingleBeanDefinitionParser, allowing for child bean definitions
* @Autowired qualifier annotations may be defined with target 'type' as well, marking the target bean class
* Autowired/Common/PersistenceAnnotationBeanPostProcessor implement PriorityOrdered and expose an "order" bean property
* "depends-on" kicks in before the affected bean is entering its creation phase; can be used to resolve circular refs
* added "registers-scope" annotation to spring-tool.xsd, allowing a tool to determine valid scope names

Package org.springframework.context
* AbstractApplicationContext calls "cancelRefresh" method in case of refresh failure now, resetting the 'active' flag
* AbstractRefreshableApplicationContext calls the full "destroyBeans()" method when refreshing the bean factory
* ClassPathXmlApplicationContext and FileSystemXmlApplicationContext trim passed-in config location Strings
* added "concurrentUpdates" flag to AbstractApplicationEventMulticaster, enabling copy-on-write for the listener set
* AnnotationConfigUtils checks for EntityManagerFactory class instead of PersistenceContext (for Tomcat 6 compatibility)
* moved CommonAnnotationBeanPostProcessor class from package "beans.factory.annotation" to "context.annotation"
* CommonAnnotationBeanPostProcessor supports @Resource's "mappedName" attribute as (potentially global) JNDI location
* added "alwaysUseJndiLookup" flag to CommonAnnotationBeanPostProcessor, enforcing Java EE 5 JNDI lookups
* CommonAnnotationBeanPostProcessor detects and processes the JAX-WS @WebServiceRef annotation as well
* CommonAnnotationBeanPostProcessor detects and processes the EJB 3 @EJB reference annotation (if present) as well
* @PostConstruct/@PreDestroy methods are only called once even if they are specified as standard init/destroy methods
* added "context:mbean-export" configuration element to "spring-context-2.5" schema, for annotation-driven JMX export

Package org.springframework.core
* NestedRuntimeException/NestedCheckedException's "contains" checks the nested causes of any kind of wrapped exception
* added "ConcurrentMap createConcurrentMap" method to CollectionFactory, exposing a common ConcurrentMap interface
* deprecated CollectionFactory's "createLinkedSet/LinkedMap/IdentityMapIfPossible" (for usage on JDK 1.4 or higher)
* AttributeAccessorSupport uses a LinkedHashMap, keeping the attributes in the order of registration
* "Conventions.getVariableName" follows JavaBeans property naming rules in case of multiple upper case letters
* added "getURI()" method to Resource interface
* added constructor with URI argument to UrlResource class
* FileSystemResource's "getURL()" builds URLs that can be converted to an URI
* introduced ContextResource interface with "getPathWithinContext()" method (exposed for context-relative lookups)
* reworked "core.asm.ClassReaderFactory" into "core.classreading.MetadataReaderFactory" (with internal ASM usage only)
* AspectJTypeFilter uses a given ClassLoader instead of the default ClassLoader

Package org.springframework.ejb
* spring-jee.xsd explicitly declares defaults for its boolean flags

Package org.springframework.instrument
* added WebLogicLoadTimeWeaver for BEA WebLogic version 10 or higher

Package org.springframework.jdbc
* SimpleJdbcTemplate's varargs handling always considers a single array argument as collection of arguments

Package org.springframework.jms
* JmsTemplate only starts lazily created transactional Connections if actually necessary (-> "startConnection" flag)
* JmsTransactionManager does not start transactional Connections until a transactional Session actually requires it
* added DestinationResolver support to StandardJmsActivationSpecFactory, for Destination objects on JCA ActivationSpecs
* DefaultJmsActivationSpecFactory autodetects WebSphere's JMS ResourceAdapter and extended ActivationSpec properties
* "spring-jms.xsd" supports "destination-resolver" attribute for "jca-listener-container" element as well
* JmsNamespaceHandler registers class names only, allowing tools to run without the JMS API on the classpath

Package org.springframework.jmx
* MBeanExporter applies NotificationPublisherAware callbacks to objects registered via "registerManagedResource" as well
* MBeanExporter's "exposeManagedResourceClassLoader" defaults to "true" now, for interaction with third-party MBeans
* MBeanExporter uses AUTODETECT_ALL as default if no beans have been specified explicitly
* MBeanExporter supports dynamic AOP proxies with the target class being a standard MBean/MXBean
* introduced AnnotationMBeanExporter with conveniently pre-configured AnnotationJmxAttributeSource
* ManagedResource annotation allows for specifying the "objectName" as annotation value as well
* MetadataNamingStrategy falls back to bean key (bean name) if no "objectName" specified in source-level metadata
* fixed IdentityNamingStrategy to obtain the package name through class name inspection rather than "Class.getPackage()"
* MBeanClientInterceptor automatically converts MXBean CompositeData/TabularData structures according to Java 5/6 rules
* MBeanClientInterceptor uses the standard JDK MBeanServerInvocationHandler if possible (for full MXBean support)
* MBeanClientInterceptor propagates exceptions thrown by the target MBean directly (i.e. not wrapped in a JmxException)

Package org.springframework.mail
* added "getJavaMailProperties()" method to JavaMailSenderImpl, allowing for convenient configuration of specific keys

Package org.springframework.mock
* MockServletContext supports "getContext" (allowing to register contexts through the new "registerContext" method)
* MockServletContext supports "getMimeType" if the Java Activation Framework is present on the classpath
* added convenience constructors to MockPortletConfig, MockActionRequest and MockRenderRequest

Package org.springframework.orm
* LocalSessionFactoryBean always uses the bean ClassLoader for "mappingResources" as well as for SessionFactory building
* HibernateInterceptor can be interleaved with JTA transactions and non-transactional access even with async tx timeouts
* removed custom detach/attach/newNamedQuery hooks from JdoDialect, expecting providers to follow the final JDO 2.0 API
* deprecated JdoTemplate's "attachCopy" methods in favor of revised "makePersistent" with a JDO2-style return value
* LocalPersistenceManagerFactoryBean passes the application ClassLoader into "JDOHelper.getPersistenceManagerFactory"
* added "persistenceManagerFactoryName" property to LocalPersistenceManagerFactoryBean, supporting JDO 2.1 PMF lookup
* added "jdoPropertyMap" property to LocalPersistenceManagerFactoryBean, allowing for non-String JDO property values
* JdoTransactionManager and JpaTransactionManager support REQUIRES_NEW transactions in afterCompletion callbacks
* JPA support exposes the application ClassLoader as PersistenceUnitInfo ClassLoader even without a LoadTimeWeaver
* JPA support uses InstrumentationLoadTimeWeaver as default weaver if InstrumentationSavingAgent is active
* revised CommonsLoggingSessionLog to work with TopLink 11 as well (remaining compatible with TopLink 10.1.3)

Package org.springframework.remoting
* fixed Hessian/BurlapClientInterceptor's "convertHessian/BurlapAccessException" method to return the exception properly
* JndiRmiClientInterceptor's "prepare()" doesn't declare NamingException anymore (just RemoteLookupFailureException)
* JaxRpcPortClientInterceptor's "prepare()" doesn't declare ServiceException anymore (just RemoteLookupFailureException)
* JaxRpcPortClientInterceptor extracts the original exception as far as provided by JAX-RPC in case of a SOAP fault
* introduced JAX-WS 2.0/2.1 support in package "org.springframework.remoting.jaxws"
* introduced RemoteInvocationFailureException, thrown by RMI/HTTP/JMS invoker proxies in case of server-side failure
* introduced SoapFaultException, thrown by JAX-RPC/JAX-WS proxies in case of a SOAP fault being reported

Package org.springframework.stereotype
* added @Service and @Controller stereotypes to the existing Component and Repository annotations

Package org.springframework.test
* introduced TestNG support based on the new test context framework

Package org.springframework.transaction
* TransactionSystemException preserves the original application exception, if any, in case of commit/rollback failure
* revised AbstractFallbackTransactionAttributeSource's template methods for specific attribute/annotation retrieval
* AnnotationTransactionAttributeSource supports a customizable TransactionAnnotationParser strategy
* AnnotationTransactionAttributeSource supports EJB3's TransactionAttribute annotation (if present) as well
* TransactionAspectSupport ignores transaction attributes when not configured with a transaction manager
* added "tx:jta-transaction-manager" configuration element to "spring-tx-2.5" schema

Package org.springframework.ui
* "ModelMap.addObject(Object)" follows JavaBeans property naming rules in case of multiple upper case letters

Package org.springframework.util
* "ClassUtils.getShortNameAsProperty" strips the outer class name in case of an inner class

Package org.springframework.web
* added "resolveLazily" flag to Commons(Portlet)MultipartResolver, allowing to switch to lazy multipart resolution
* reworked MultipartException into a RuntimeException (it may be thrown from file/parameter access methods as well now)
* changed UrlPathHelper's and AbstractUrlHandlerMapping's/AbstractUrlMethodNameResolver's "urlDecode" default to "true"
* added "getAttributeNames" method to RequestAttributes interface
* introduced WebBindingInitializer interface, supported by BaseCommandController and MultiActionController
* introduced annotation-based controller approach using @Controller, @RequestMapping, @RequestParam and @ModelAttribute
* introduced annotation-based command/form controller facilities using @InitBinder, @FormAttributes and FormStatus
* introduced DefaultAnnotationHandlerMapping and AnnotationMethodHandlerAdapter for Servlet MVC and Portlet MVC
* added "caseSensitive", "pathPrefix" and "basePackage" properties to ControllerClassNameHandlerMapping
* added "getActualValue()" method to BindStatus, exposing the raw property value for comparison purposes
* added "exposeModelAttributes" property to RedirectView, allowing to suppress model exposure completely
* added "exposeContextBeansAsAttributes" property to InternalResourceView and InternalResourceViewResolver
* JstlView sets "exposeContextBeansAsAttributes" to "true" by default, allowing JSTL expressions to access Spring beans
* factored out a "loadReport()" method in AbstractJasperReportsView (called by "initApplicationContext()")
* revised AbstractJasperReportsView to allow for obtaining a report dynamically (through overriding "getReport()")
* TagWriter in JSP AbstractFormTag reobtains the Writer from the PageContext all the time (for FreeMarker compatibility)
* introduced "modelAttribute" property for JSP FormTag, superseding the "commandName" property for general purposes
* JSP SelectTag, OptionTag and OptionsTag properly detect a selected value even for Maps with converted keys
* JSP CheckboxTag caches converted candidate value when comparing it with collection elements
* introduced JSP CheckboxesTag (form:checkboxes) and RadioButtonsTag (form:radiobuttons)
* JSF 1.1 DelegatingVariableResolver checks Spring bean match first (analogous to JSF 1.2 DelegatingFacesELResolver)


Changes in version 2.1 M4 (2007-09-09)
--------------------------------------

General
* updated build to use JUnit 4.4 for the tiger test suite while sticking with JUnit 3.8 for the main test suite
* moved GlassFish and OC4J instrumentation support from spring-context-support.jar to spring-context.jar
* renamed spring-mock.jar to spring-test.jar, reflecting the focus on the test context framework
* factored out Struts 1.x support (including Tiles 1.x support) into spring-webmvc-struts.jar
* Spring-style pattern matching ("*xxx", "xxx*", "*xxx*") supports multi-part patterns as well now ("xxx*yyy")

Package org.springframework.aop
* ProxyFactoryBean and AbstractSingletonProxyFactoryBean are serializable if their target and interceptors are
* made parts of ReflectiveMethodInvocation and other internal impl classes public again (for framework integration)
* "AopNamespaceUtils.registerAutoProxyCreatorIfNecessary" registers a plain InfrastructureAdvisorAutoProxyCreator now
* "target()" pointcut handles types implemented in superclasses correctly
* "aop:scoped-proxy" applies a specified "autowire-candidate" flag to the proxy

Package org.springframework.beans
* TypeConverterDelegate protects its value conversion step against PropertyEditors which don't support "setValue" calls
* TypeConverterDelegate falls back to "toString()" conversion for a primitive value type if the required type is String
* changed visibility of PropertyEditorRegistrySupport's "getDefaultEditor(requiredType)" method to public
* PropertyEditorRegistrySupport's "copyCustomEditorsTo" copies all editors if 'nestedProperty' argument is null
* exposed "String[] getDependentBeans(beanName)" method on ConfigurableBeanFactory interface
* introduced "String[] getDependenciesForBean(beanName)" method on ConfigurableBeanFactory interface
* DefaultSingletonBeanRegistry uses a concurrent Map for managing dependent beans, avoiding unnecessary synchronization
* removed superseded ResourceFactoryBean (String-to-Resource conversion has been implicitly available for years)
* added overloaded "createBean(beanClass)" method to AutowireCapableBeanFactory interface
* introduced "registerResolvableDependency" method on ConfigurableListableBeanFactory interface
* introduced qualifier support, allowing to use custom parameter annotations for identifying specific target beans
* introduced AutowireCandidateResolver mechanism and QualifierAnnotationAutowireCandidateResolver implementation
* reworked Annotated/ScannedRootBeanDefinition into Annotated/ScannedGenericBeanDefinition
* fixed AbstractBeanFactory's type check to ignore a null value (as potentially exposed by a FactoryBean)
* fixed AbstractBeanFactory to never cache FactoryBean-exposed objects for inner beans (avoiding name conflicts)
* optimized DefaultListableBeanFactory's shortcut access to cached merged bean definitions
* optimized DefaultListableBeanFactory's resolution of bean references during prototype creation
* DefaultListableBeanFactory performs SmartFactoryBean eager-init check even if the FactoryBean singleton already exists
* CommonAnnotationBeanPostProcessor falls back to default type match if no bean found for @Resource field/property name
* Common/Autowired/PersistenceAnnotationBeanPostProcessor reject injection annotations on static fields/methods
* factored out "isCandidateComponent(beanDefinition)" template method in ClassPathScanningCandidateComponentProvider
* ClassPathBeanDefinitionScanner does not apply scoped-proxy setting to prototypes (only to extended scopes)
* scoped inner beans are now eligible for scoped destruction callbacks, despite not living as scoped attributes
* "spring-beans-2.1.xsd" supports "default-autowire-candidates" attribute, accepting Spring-style bean name patterns

Package org.springframework.context
* AbstractApplicationContext registers BeanFactory, ApplicationContext etc as resolvable dependency types for @Autowired
* fixed AbstractApplicationContext's temporary ClassLoader to work for by-type autowiring in ApplicationListeners etc
* AbstractApplicationContext propagates "start()"/"stop()" call to LifecycleBeans according to inter-bean dependencies
* AbstractApplicationContext sends ContextStartedEvent/ContextStoppedEvent when propagating "start()"/"stop()" call

Package org.springframework.core
* factored out protected "openStreamForClass" template method in OverridingClassLoader
* PathMatchingResourcePatternResolver's static "logger" variable is private now
* PathMatchingResourcePatternResolver detects Oracle OC4J's "code-source" URLs as jar files now

Package org.springframework.jdbc
* strengthened SQLExceptionTranslator's contract to define root cause handling for returned DataAccessExceptions
* added batch update support to SimpleJdbcTemplate
* added new SimpleJdbcInsert and SimpleJdbcCall classes to provide ease-of-use for inserts and stored procedure calls

Package org.springframework.jms
* MessageListenerAdapter logs at warn level if a listener method returned a result but no response message can be sent
* added BeanFactoryDestinationResolver, for use with "jms:listener-container"'s "destination-resolver" attribute
* added "message-converter" attribute to "jms:listener-container/jca-listener-container" XML configuration element
* added "response-destination" attribute to "jms:listener" element, defining a default in case of no JMSReplyTo header

Package org.springframework.orm
* HibernateJdbcException extracts the SQL statement and explicitly builds it into the exception message
* introduced EntityManagerProxy interface, allowing access to underlying EntityManager for shared/extended EM proxies
* container-managed extended EntityManager gets explicitly closed on destruction of the containing bean
* PersistenceUnitReader checks for well-known explicit schema resource locations instead of searching the classpath
* revised JpaTransactionManager to convert JPA RollbackExceptions into Spring TransactionSystemExceptions
* JpaTransactionManager provides fine-grained commit exceptions through translating JPA RollbackException root causes
* HibernateJpaDialect translates native HibernateExceptions (introspecting them as root causes of PersistenceExceptions)
* added savepoint support to JpaDialect, implemented by OpenJpaDialect, supported by JpaTransactionManager
* OpenJpaDialect exposes a special JDBC ConnectionHandle that immediately returns the Connection to the EntityManager
* OpenJpaVendorAdapter supports OpenJPA 1.0.0 (exposing the full OpenJPAEntityManagerSPI interface)

Package org.springframework.remoting
* LocalJaxRpcServiceFactory trims whitespace from "namespaceUri" values

Package org.springframework.scripting
* ScriptCompilationException carries the ScriptSource of the offending script
* GroovyScriptFactory passes script source description to GroovyClassLoader.parseClass (for descriptive error messages)
* added "autowire" and "dependency-check" attributes to "lang:bsh/jruby/groovy" XML configuration elements

Package org.springframework.test
* fixed AbstractSpringContextTests's "hasCachedContext" implementation to use the context key String translation
* reduced AbstractTransactionalSpringContextTests's log level for transaction management from INFO to DEBUG
* introduced annotation-oriented test context framework based on test execution listeners
* introduced JUnit4 support (SpringJUnit4ClassRunner) based on the new test context framework

Package org.springframework.transaction
* fixed "tx:annotation-driven" to not activate "aop:config"-style autodetection of application-defined Advisor beans

Package org.springframework.ui
* ModelMap extends LinkedHashMap, exposing model elements in registration order

Package org.springframework.util
* "ClassUtils.forName" supports the JDK's internal names for primitive array classes as well (for JMX compatibility)
* ReflectionUtils provides a "findMethod" variant without parameter types argument

Package org.springframework.web
* RequestContext uses a full ResourceBundleThemeSource as default again (for backwards compatibility)
* RequestContext lazily obtains the Theme instance (for more efficiency when theme support is not used)
* AbstractView does not log static attributes anymore, in order to allow for scoped proxies to be used as attributes
* factored out protected "isEligibleProperty(key, value)" template method in RedirectView
* RedirectView only exposes Strings, primitives and primitive wrappers as query properties by default
* JstlView properly allows for programmatic usage (added overloaded constructors; exposing a MessageSource is optional)
* InternalResourceViewResolver uses JstlView as default (instead of InternalResourceView) if the JSTL API is present
* JSP MessageTag resolves arguments in default text even if no message code was specified
* JSP tags in the form tag library default to htmlEscape=true in case of no defaultHtmlEscape setting given
* added support for Tiles2 in the "org.springframework.web.servlet.view.tiles2" package (requiring Tiles 2.0.4+)
* JasperReports View classes support JasperReports 2.0 while remaining compatible with JasperReports 1.3


Changes in version 2.1 M3 (2007-07-31)
--------------------------------------

General
* fixed and updated reference documentation on JMS listener container configuration and transaction participation

Package org.springframework.aop
* Cglib2AopProxy uses weak references for advised object, interceptors and validated classes (avoiding a memory leak)
* ProxyFactoryBean avoids NPE in case of target class being null (due to misconfiguration)
* fixed AspectJ pointcut handling to resolve bridge methods before matching
* fixed AspectJ pointcut handling to correctly match generic return types
* added support for "bean(name)" element in AspectJ pointcut expressions
* ReflectiveMethodInvocation, BeanFactoryAdvisorRetrieval and other internal impl classes are just package-visible now
* the pointcut element's "id" attribute is required as of the 2.1 version of the AOP namespace (spring-aop-2.1.xsd)
* aop:aspectj-autoproxy's "proxy-target-class" attribute properly escalates class proxying (not overriding the setting)
* ConfigBeanDefinitionParser turns "pointcut" attribute into inner bean definition (instead of ref to an anonymous bean)
* fixed ConfigBeanDefinitionParser to properly handle empty pointcut/advice bean names in a tooling environment
* added "getAspectClassLoader()" method to AspectInstanceFactory interface
* revised reflective class loading to use the correct ClassLoader according to the OSGi bundle structure (if any)
* declare-parents allows specifying "delegate-ref" to delegate introductions to a bean as alternative to "default-impl"

Package org.springframework.beans
* added "charsToDelete" and "emptyArrayAsNull" options to StringArrayPropertyEditor
* URIEditor trims whitespace before parsing the URI (allowing for XML formatting with whitespace)
* BeanWrapperImpl lazily performs JavaBeans introspection (avoiding introspection failure for non-visible target class)
* TypeConverterDelegate protects its collection conversion process against misbehaving Collections with a null Iterator
* TypeConverterDelegate only attempts to convert well-known collection types (skips custom types in the first place)
* PropertyBatchUpdateException synchronizes on PrintStream/PrintWriter (like the JDK 1.6 Throwable class does)
* BeanFactoryUtils uses linked HashMaps for "beansOfTypeIncludingAncestors", preserving "getBeansOfType" order
* added "isEagerInit()" method to SmartFactoryBean interface, making post-processors apply to an exposed object eagerly
* exposed "getBean(name, args)" method on BeanFactory interface
* exposed "BeanDefinition getMergedBeanDefinition(beanName)" method on ConfigurableBeanFactory interface
* exposed "isFactoryBean" and "registerDependentBean" methods on ConfigurableBeanFactory interface
* introduced "isAutowireCandidate" method on ConfigurableListableBeanFactory interface
* passing in explicit arguments for bean creation is supported for constructors as well (not just for factory methods)
* passing in different combinations of explicit arguments is supported for overloaded factory methods and constructors
* PropertyPathFactoryBean supports a null property value (removed historic restriction there)
* exposed "parentName", "factoryBeanName" and "factoryMethodName" properties in BeanDefinition interface
* added "visitParentName", "visitFactoryBeanName" and "visitFactoryMethodName" callbacks to BeanDefinitionVisitor
* PropertyPlaceholderConfigurer resolves placeholders in parent, factory-bean and factory-method values as well
* fixed AbstractBeanFactory to correctly handle factory-bean references in case of a temporary ClassLoader being used
* DefaultListableBeanFactory ignores invalid parent bean names when matching beans by type with allowEagerInit=false
* DefaultListableBeanFactory only ignores invalid bean class names when matching beans by type with allowEagerInit=false
* DefaultListableBeanFactory does not invoke custom init/destroy method twice if pointing to Initializing/DisposableBean
* DefaultListableBeanFactory allows for concurrent "registerBeanDefinition" calls after the configuration phase
* bean creation records suppressed exceptions, exposing them as related causes in a subsequent BeanCreationException
* added "setTypeConverter" method to ConfigurableBeanFactory, allowing to override the default PropertyEditor mechanism
* introduced "removeBeanDefinition" method in BeanDefinitionRegistry interface and DefaultListableBeanFactory class
* exposed "isBeanNameInUse" method on BeanDefinitionRegistry interface
* AbstractBeanFactory supports any BeanDefinition implementation (does not require AbstractBeanDefinition anymore)
* reworked AbstractBeanFactory's bean definition merging for less coupling to RootBeanDefinition as merge result
* introduced GenericBeanDefinition as one-stop shop for standard bean definition purposes (with configurable parent)
* DefaultBeanNameGenerator does not require an AbstractBeanDefinition implementation for bean name generation anymore
* DefaultBeanNameGenerator generates a "#0" suffix in the canonical name even for the first occurence of an unnamed bean
* added "resolveDependency" methods to AutowireCapableBeanFactory interface
* @Autowired annotation ignores target beans marked as autowire-candidate="false" (analogous to standard autowiring)
* added autowiring by type for arrays, collections, maps (available for @Autowired, 'constructor', 'byType' autowiring)
* Autowired/CommonAnnotationBeanPostProcessor registers autowired beans as dependent on their injected target bean
* AnnotationBeanConfigurerAspect proceeds without injection in case of a circular reference problem, logging a warning
* added "registerBeanComponent" convenience method to ParserContext
* changed visibility of BeanDefinitionParserDelegate's "buildTypedStringValue(ForMap)" methods to protected

Package org.springframework.context
* AspectJWeavingEnabler implements Ordered, exposing HIGHEST_PRECEDENCE (executing before other factory post-processors)
* moved AnnotationConfigUtils to "context.annotation" package (post-processor beans are a context-specific feature)
* "context:annotation-config" XML tag activates JPA's @PersistenceContext and @PersistenceUnit as well (if available)
* AnnotationConfig/ComponentScanBeanDefinitionParser sends component registration for each registered BeanPostProcessor
* AnnotationBeanNameGenerator does not silently adapt the default bean name in case of overlap anymore
* "context:spring-configured" registers its bean configurer aspect with a fixed internal bean name
* revised reflective class loading to use the correct ClassLoader according to the OSGi bundle structure (if any)

Package org.springframework.cache
* added "maxElementsOnDisk" bean property to EhCacheFactoryBean, supporting EHCache 1.2.4's extended Cache constructor

Package org.springframework.core
* added "isAtLeastJava16()" convenience method to JdkVersion class
* OverridingClassLoader (and hence SimpleThrowawayClassLoader) exclude classes from the "sun." package
* fixed PathMatchingResourcePatternResolver to build correct JarFile URLs on WebLogic and WebSphere
* PathMatchingResourcePatternResolver uses a static Log instance in order to avoid repeated synchronization overhead

Package org.springframework.ejb
* turned visibility of AbstractEnterpriseBean and AbstractSessionBean to public (showing up in the javadoc now)

Package org.springframework.instrument
* added "excludePackage" and "excludeClass" methods to ShadowingClassLoader, analogous to OverridingClassLoader

Package org.springframework.jdbc
* added exception translation based on SQLException subclasses introduced in Java 6
* added additional exceptions to divide hierarchy into Recoverable, Transient and NonTransient exceptions
* added support for arrays of values in parameter value lists: "select * from t where (a, b) in ((1,'x'), (3,'y'))"
* added DerbyMaxValueIncrementer to provide an alternative for autoGeneratedKeys used with IDENTITY columns
* added HsqlSequenceMaxValueIncrementer to support sequences now added to HSQL
* added H2SequenceMaxValueIncrementer to support sequences in H2 Database

Package org.springframework.jms
* SingleConnectionFactory sets client ID before ExceptionListener (for providers with strict Connection state handling)
* added "receiveTimeout" property to JmsInvokerClientInterceptor/ProxyFactoryBean (with reimplemented request execution)
* listener-container type "default102"/"simple102" leads to the implicit choice of MessageListenerAdapter102

Package org.springframework.jmx
* MBeanExporter unregisters its MBeans in case of any kind of registration failure
* MBeanExporter accepts bean name keys in NotificationListener mappings (in addition to ObjectName Strings)
* revised reflective class loading to use the correct ClassLoader according to the OSGi bundle structure (if any)

Package org.springframework.orm
* HibernateTemplate delegates to "SessionFactory.getCurrentSession()" when "allowCreate" has been set to "false"
* added overloaded "findByExample" methods with entityName argument to HibernateOperations/HibernateTemplate
* deprecated HibernateTemplate's "saveOrUpdateAll" method in favor of individual "saveOrUpdate"/"merge" usage
* fixed Hibernate/JpaTransactionManager to clean up properly in case of transaction begin failure on pre-bound resource
* added "prepareTransaction" method to JpaDialect interface, for preparing a JTA-joining EntityManager
* HibernateJpaDialect switches FlushMode to MANUAL in case of a read-only transaction even for JTA
* PersistenceAnnotationBeanPostProcessor registers autowired beans as dependent on their EntityManagerFactory
* ExtendedEntityManagerCreator's "joinTransaction()" checks whether there is an externally managed local transaction
* ExtendedEntityManagerCreator's EntityManager proxies are serializable now

Package org.springframework.mock
* MockHttpServletResponse automatically flushes the Writer in case of a "write(int)" call too

Package org.springframework.remoting
* RmiClientInterceptor and JaxRpcClientInterceptor propagate any kind of declared RemoteException as-is
* (Jndi)RmiClientInterceptor resets stub before a refresh attempt, avoiding race condition in case of registry restart
* JndiRmiClientInterceptor wraps CORBA SystemExceptions in RemoteExceptions (if declared)

Package org.springframework.scheduling
* added "waitForTasksToCompleteOnShutdown" property to ScheduledExecutorFactoryBean
* changed ScheduledExecutorFactoryBean's default behavior to shutdown immediately, not waiting for scheduled tasks

Package org.springframework.scripting
* updated JRuby support for JRuby 1.0 compatibility (still compatible with JRuby 0.9.8 / 0.9.9 as well)

Package org.springframework.test
* AbstractDependencyInjectionSpringContextTests allows for annotation-driven autowiring (even in case of AUTOWIRE_NO)

Package org.springframework.scheduling
* Quartz SchedulerFactoryBean does not set default AdaptableJobFactory in case of RemoteScheduler (not supported there)

Package org.springframework.scripting
* "lang:*" configuration elements create their implicit ScriptFactoryPostProcessor under a fully qualified bean name

Package org.springframework.transaction
* refined TransactionAspectSupport to allow for overriding the "getTransactionManager()" method in subclasses
* TransactionInterceptor only uses ThrowableHolderException if necessary and makes sure to expose the cause in any case
* "tx:annotation-driven" registers its transaction aspect with a fixed internal bean name

Package org.springframework.util
* fixed "StringUtils.parseLocaleString" to parse multiple variants correctly
* DefaultPropertiesPersister detects and uses JDK 1.6's "Properties.load/store" variants with Reader/Writer argument

Package org.springframework.validation
* added overloaded "rejectIfEmpty(OrWhitespace)" methods with args but without default message to ValidationUtils

Package org.springframework.web
* factored out "invokeDelegate" template method in DelegatingFilterProxy
* fixed Servlet/PortletContextResourcePatternResolver to correctly match bounded patterns
* fixed FrameworkServlet to always refresh its BeanNameUrlHandlerMapping with the correct context
* added "postProcessWeb/PortletApplicationContext" method to FrameworkServlet/Portlet
* DispatcherServlet/Portlet's "noHandlerFound" declares Exception instead of just IOException/PortletException
* added "addInterceptor" and "addInterceptors" methods to Servlet/Portlet HandlerExecutionChain
* AbstractUrlHandlerMapping exposes "path within mapping" attribute through an interceptor (for proper include cleanup)
* AbstractWizardFormController's "showForm" method is not final anymore (can be overridden e.g. for exception handling)
* added "transformerFactoryClass" property and "newTransformerFactory()" template method to (Abstract)XsltView
* added "accept-charset" support to JSP FormTag
* fixed JSP CheckboxTag to apply the custom PropertyEditor (if any) to rendered values


Changes in version 2.1 M2 (2007-05-31)
--------------------------------------

General
* removed support for Hibernate 2.1; Spring's Hibernate support generally requires Hibernate 3.1 or higher now
* spring-context.jar includes JMX support and core remoting support (no spring-jmx and spring-remoting jars anymore)
* spring-orm.jar combines all ORM support packages (replaces spring-jdo, spring-jpa, spring-hibernate etc jars)
* spring-web.jar contains web-related remoting and ORM classes (for proper use in J2EE EAR deployment structures)
* renamed spring-dao.jar to spring-tx.jar, also containing the JCA support now
* renamed spring-support.jar to spring-context-support.jar
* renamed spring-portlet.jar to spring-webmvc-portlet.jar
* module jar files contain module-specific "spring.handlers" and "spring.schemas" files now
* added missing websphere_uow_api.jar to -with-dependencies distribution

Package org.springframework.aop
* ReflectiveMethodInvocation always uses a shared user attribute Map in clones (for proper binding of multiple advices)
* fixed MethodInvocationProceedingJoinPoint to properly pass modified arguments (via proceed) to subsequent aspects
* fixed AbstractAspectJAdvisorFactory to ignore 'code-style' aspect classes that have been compiled by ajc
* "aop:aspectj-autoproxy" XML configuration tag detects all aspect beans in case of empty XML body content as well
* moved "aop:spring-configured" to context namespace ("context:spring-configured") in the 2.1 versions of the XSDs

Package org.springframework.beans
* CustomBooleanEditor trims text before comparing against true/false Strings
* added temporary ClassLoader support to ConfigurableBeanFactory / AbstractBeanFactory
* mirrored FactoryBean's "getObjectType()" as abstract method in AbstractFactoryBean again, for @Override compatibility
* reworked SmartInstantiationAwareBeanPostProcessor's "determineConstructor" hook into "determineCandidateConstructors"
* added "resolveAliases" method to ConfigurableBeanFactory, applying a given StringValueResolver
* PropertyPlaceholderConfigurer applies its placeholder parsing to alias target names and aliases as well
* PropertyResourceConfigurer (and in particular PropertyPlaceholderConfigurer) is marked as PriorityOrdered
* BeanWiringInfo and ClassName/AnnotationBeanWiringInfoResolver support the notion of a 'default' bean name
* @Configurable applies factory callbacks (BeanFactoryAware, InitializingBean etc) and post-processors as well
* @Configurable applies factory callbacks and post-processors if no bean definition found for default bean name
* DefaultListableBeanFactory clears a cached merged bean definition in case of re-registering a bean definition
* AbstractBeanDefinition declares a public "clone()" method as well as "AbstractBeanDefinition cloneBeanDefinition()"
* AbstractBeanDefinition excludes purely descriptive metadata from its equals check (for more lenient equality)
* fixed BeanDefinitionParserDelegate to avoid NPE in case of a custom namespace without a NamespaceHandler registered
* fixed BeanDefinitionParserDelegate to extract correct source element for "key-ref"/"value-ref" attributes
* added 'required' attribute to @Autowired annotation (configurable for a custom autowire annotation as well)
* avoid double invocation of @Autowired/@Resource setter method in case of explicitly specified property value
* InitDestroy/Common/AutowiredAnnotationBeanPostProcessor use ConcurrentHashMaps for minimal locking
* introduced AnnotatedBeanDefinition interface and AnnotatedRootBeanDefinition implementation class
* added support for the JDK 1.6 ServiceLoader facility (package "beans.factory.serviceloader")

Package org.springframework.cache
* EhCacheFactoryBean applies a specified CacheEntryFactory to an existing cache region as well

Package org.springframework.context
* AbstractApplicationContext instantiates and applies priority-ordered Bean(Factory)PostProcessors first
* AbstractApplicationContext creates all non-ordered BeanPostProcessors first before registering them with the factory
* AbstractApplicationContext sets a temporary ClassLoader for type matching if a bean named "loadTimeWeaver" is defined
* added LoadTimeWeaverFactoryBean, building a default LoadTimeWeaver (autodetecting the runtime environment)
* added LoadTimeWeaverAware interface, automatically supported if a default LoadTimeWeaver is available
* added AspectJWeavingEnabler, registering AspectJ's class transformer for standard AspectJ load-time weaving
* added "context:load-time-weaver" XML tag, building a default LoadTimeWeaver and enabling AspectJ load-time weaving
* introduced ScannedRootBeanDefinition class for autodetected components
* added @Scope annotation for autodetected components, indicating the target bean scope in the Spring context
* reworked ClassPathBeanDefinitionScanner into subclass of ClasspathScanningCandidateComponentProvider
* ClassPathBeanDefinitionScanner provides "addIncludeFilter" etc config methods instead of overloaded "scan" methods
* reworked ComponentBeanNameGenerator into AnnotationBeanNameGenerator, handling @Repository name values as well
* explicit bean names indicated by autodetected components are enforced, only to be overridden by explicit definitions

Package org.springframework.core
* updated NestedXxxException to build on JDK 1.4 exception chaining, adding extended messages and convenience accessors
* introduced PriorityOrdered marker interface, with order values automatically applied before any plain Ordered values
* fixed BridgeMethodResolver to properly detect a method that substitutes a type parameter with an array type
* fixed BridgeMethodResolver to detect type variables in interface hierarchies with different type variable names
* added "getClassLoader()" method to ClassPathResource, exposing the ClassLoader used for resource loading
* PathMatchingResourcePatternResolver avoids full subtree scan through skipping non-matching directory paths early
* PathMatchingResourcePatternResolver explicitly closes freshly created JarFile handles, to allow for hot redeployment
* introduced ClassMetadata/AnnotationMetadata abstraction in "core.type" package
* refactored "core.typefilter" package into "core.type.asm" and "core.type.filter"
* introduced ClassReaderFactory abstraction, with SimpleClassReaderFactory and CachingClassReaderFactory implementations
* introduced ClassReaderFactory as TypeFilter match argument, for resolving cached ClassReaders for the type hierarchy
* moved FilterType enum to "context.annotation" package, since it is closely related to component scanning
* introduced AnnotatedBeanDefinition interface and AnnotatedRootBeanDefinition implementation class
* introduced ScannedRootBeanDefinition class for autodetected components
* StringCodedLabeledEnum accepts empty codes (that purely consist of whitespace) as well

Package org.springframework.jdbc
* added named parameter support to SimpleJdbcTemplate
* added ParameterizedBeanPropertyRowMapper, providing automatic mapping between columns and bean properties
* added new SqlReturnUpdateCount parameter to provide name for update counts from stored procedures
* added stored procedure support for retrieving update counts and storing the retrieved int in the output map
* added automatic processing of stored proc returned resultsets (will create default one if declared parameter missing)
* added automatic processing of stored proc update counts (will create default one if declared parameter missing)

Package org.springframework.jmx
* MBeanExporter does not insist of a minimum of 1 bean exposed anymore, also accepting no beans to export in the context

Package org.springframework.mail
* JavaMailSenderImpl sets the original message id (if specified in the given MimeMessage) after "message.saveChanges()"

Package org.springframework.mock
* added MockJspWriter and MockBodyContent classes for testing content-emitting JSP tags
* MockPageContext supports the "getOut()" method, exposing a MockJspWriter

Package org.springframework.orm
* LocalContainerEntityManagerFactoryBean and DefaultPersistenceUnitManager autodetect a context's default LoadTimeWeaver
* avoid double invocation of @PersistenceContext/Unit setter method in case of explicitly specified property value

Package org.springframework.transaction
* marked DelegatingTransactionAttribute as Serializable
* added mode="proxy"/"aspectj" flag to "tx:annotation-driven" config tag, for choosing the AspectJ transaction aspect
* WebSphereUowTransactionManager does not enforce the presence of a JTA UserTransaction anymore
* WebSphereTransactionManagerFactoryBean uses the context class loader for compatibility with the WSAD 5.1 test server

Package org.springframework.util
* added "makeAccessible(Method)" and "makeAccessible(Constructor)" convenience methods to ReflectionUtils
* added "matchStart" method to PathMatcher interface and AntPathMatch implementation, for checking the start of a match

Package org.springframework.web
* added "getDescription" method to WebRequest interface
* ServletWebRequest and PortletWebRequest expose a descriptive "toString()" result (including URI, session id, user id)
* added "includeClientInfo" flag to AbstractRequestLoggingFilter, for including client address and session id in the log
* added Log4jNestedDiagnosticContextInterceptor for use with Servlet and Portlet MVC
* CookieLocaleResolver checks specified "defaultLocale" in case of a setLocale call with null argument
* RequestContext uses a shared default Theme instance as fallback, avoiding the recreating of empty Theme instances
* MultiActionController explicitly disallows direct invocation of exception handler methods (as handler methods)
* CancellableFormController suppresses validation for a cancel request
* AbstractView and AbstractTemplateView pass an explicit ServletContext reference to a created RequestContext instance
* changed AbstractTemplateView(Resolver)'s "exposeSpringMacroHelpers" default to "true"
* JSP FormTag exposes full nested path for compatibility with Spring's standard BindTag
* JSP TransformTag is able to work within JSP SelectTag etc as well, not just within BindTag


Changes in version 2.1 M1 (2007-05-13)
--------------------------------------

General
* Spring is built on JDK 1.6 now, with support for common Java 6 APIs / Java EE 5 APIs
* Spring requires JDK 1.4 or higher now, not supporting JDK 1.3 anymore (JDK 1.3 has reached its official end-of-life)
* Spring's Hibernate3 support generally requires Hibernate 3.1 or higher (note: there's separate Hibernate 2.1 support)
* fixed contents of spring-remoting.jar: does not include RemoteInvocationUtilsTests anymore

Package org.springframework.aop
* removed Perl5RegexpMethodPoint and RegexpMethodPointcutAdvisor's "perl5" flag (always using java.util.regex now)

Package org.springframework.beans
* introduced InitDestroyAnnotationBeanPostProcessor, processing configurable init and destroy annotations
* introduced CommonAnnotationBeanPostProcessor, processing JSR-250's @PostConstruct, @PreDestroy and @Resource
* introduced @Autowired annotation, indicating that a field, config method or constructor is supposed to be autowired
* introduced AutowiredAnnotationBeanPostProcessor, processing the new @Autowired annotation
* fixed AbstractAutowireCapableBeanFactory to allow for changing the InstantiantionStrategy (again)
* deprecated BeanDefinitionReader's "BeanDefinitionRegistry getBeanFactory()" method in favor of "getRegistry()"
* exposed "getBeanNameGenerator()" method in BeanDefinitionReader interface
* changed XmlReaderContext's "getReader()" method to expose the plain BeanDefinitionReader interface
* added "getResourceLoader()" convenience method to XmlReaderContext, exposing the context's ResourceLoader (if any)
* added "getBeanClassLoader()" convenience method to XmlReaderContext

Package org.springframework.context
* introduced CandidateComponentProvider mechnism, for finding annotated component classes through scanning the classpath
* introduced "context" XML schema namespace, providing a "property-placeholder" convenience tag
* introduced convenient tags for annotation-based configuration as part of the "context" namespace
* removed deprecated ConsoleListener class

Package org.springframework.core
* introduced the "core.typefilter" package, for ASM-based scanning of class files

Package org.springframework.jca
* introduced GenericMessageEndpointManager for JCA 1.5 message endpoint management, plus supporting infrastructure
* introduced SpringContextResourceAdapter, for deploying a Spring application context as JCA 1.5 RAR file
* added BootstrapContextAware interface, as a callback in a JCA 1.5 resource adapter environment

Package org.springframework.jdbc
* AbstractDataSource and DelegatingDataSource support the JDBC 4.0 Wrapper interface
* added Jdbc4NativeJdbcExtractor, delegating to JDBC 4.0's "unwrap" method (defined by java.sql.Wrapper)
* added "streamAsLob" flag to DefaultLobHandler, allowing for explicit usage of the JDBC 4.0 setBlob/setClob variants
* fixed SQLErrorCodeSQLExceptionTranslator to avoid potential NPE in debug log message
* added BeanPropertyRowMapper, providing automatic mapping between columns and bean properties
* moved "isInputValueProvided" method from SqlOutParameter up to the SqlParameter root class
* fixed RdbmsOperation's "validateParameters" to properly detect and count input-providing SqlOutParameters

Package org.springframework.jms
* added JmsMessageEndpointManager, extending GenericMessageEndpointManager with the JmsActivationSpecFactory mechanism
* added StandardJmsActivationSpecFactory, supporting all standard JMS propertied as defined by the JCA 1.5 specification
* added DefaultJmsActivationSpecFactory, autodetecting ActiveMQ and JORAM's ActivationSpecs and extended properties
* introduced "jms" XML schema namespace, providing convenient tags for listener container configuration

Package org.springframework.jmx
* default MBean checks in JmxUtils and MBeanExporter automatically detect a Java 6 MXBean as well

Package org.springframework.jndi
* added SimpleJndiBeanFactory to "jndi.support" package, providing a JNDI-based BeanFactory implementation

Package org.springframework.mail
* removed CosMailSenderImpl (as part of generally removing COS support from the Spring codebase)

Package org.springframework.mock
* added support for Servlet 2.5's "getContextPath()" method to MockServletContext

Package org.springframework.orm
* Hibernate LocalSessionFactoryBean prefers a Hibernate 3.1 CurrentSessionContext now, instead of a SessionFactory proxy
* Hibernate3 AbstractSessionFactoryBean's "exposeTransactionAwareSessionFactory" to refer to a SpringSessionContext now

Package org.springframework.transaction
* added TransactionFactory interface to "jta" subpackage, abstracting the creation of specific JTA Transaction objects
* JtaTransactionManager and WebLogic/OC4JJtaTransactionManager implement the TransactionFactory interface accordingly
* JtaTransactionManager autodetects and uses JTA 1.1's TransactionSynchronizationRegistry (e.g. on Java EE 5)
* added WebSphereUowTransactionManager, supporting full transaction management via IBM's UOWManager API on WAS 6.0/6.1
* removed WAS 4.0/5.0 support from WebSphereTransactionManagerFactoryBean, keeping it for WAS 5.1 support only
* removed outdated WebLogicServerTransactionManagerFactoryBean (for WebLogic 7.0)

Package org.springframework.web
* removed deprecated BindInitializer and BindUtils from the "bind" package
* removed deprecated "setFilterConfig" method from GenericFilterBean (no WebLogic 6.1 compatibility necessary anymore)
* removed CosMultipartResolver (as part of generally removing COS support from the Spring codebase)
* introduced explicit JSF 1.2 support (web.jsf.el): DelegatingFacesELResolver and WebApplicationContextFacesELResolver
* JSP InputTag, SelectTag etc support expressions as "disabled" and "readonly" attribute values


Changes in version 2.0.5 (2007-05-07)
-------------------------------------

Package org.springframework.aop
* DelegatingIntroductionInterceptor only replaces a return value with the proxy if the proxy is actually assignable
* JdkDynamic/Cglib2AopProxy only replaces return value with proxy if declaring class is not marked for raw target access
* AbstractRefreshableTargetSource's "getTargetClass()" method is properly synchronized
* ScopedObject's "getTargetObject()" method returns the actual target object now (instead of the proxy object)
* fixed "aop:scoped-proxy" tag to properly apply to defined alias names as well

Package org.springframework.beans
* BeanWrapper doesn't iterate over Collection/Map if no generic type declared and no property-specific editor registered
* BeanWrapper converts an empty String to null in case of a Java 5 enum as target type
* default editor settings get copied to nested beans even if no default editors have been used yet
* revised MethodInvokingFactoryBean's "getObjectType()" implementation to gracefully return null if not prepared already
* added "determineConstructor(beanClass, beanName)" method to SmartInstantiationAwareBeanPostProcessor
* AbstractBeanFactory's "containsBean"/"isSingleton"/"isTypeMatch"/etc behave correctly for "&" FactoryBean dereferences
* AbstractBeanFactory uses concurrent Maps for singletons, aliases and bean definitions (for better concurrency)
* DefaultListableBeanFactory finds initialized FactoryBeans / factory-bean references in case of allowEagerInit=false
* fixed ConstructorResolver to correctly convert prepared collection arguments to arrays if necessary (for prototypes)
* added overloaded "rootBeanDefinition" factory methods with bean class name (instead of Class) to BeanDefinitionBuilder
* an (undefined) null value returned from a NamespaceHandler's "decorate" method is treated as 'no decoration required'
* XmlBeanDefinitionReader caches the DefaultNamespaceHandlerResolver instance, sharing it across multiple files
* added "getBeanClassName" template method to AbstractSingleBeanDefinitionParser, as alternative to "getBeanClass"
* added "scope" attribute to "util:list", "util:set", "util:map" and "util:properties", allowing for scoped collections

Package org.springframework.context
* factored out fine-grained protected template methods from AbstractApplicationContext's "refresh()" implementation
* AbstractRefreshableApplicationContext actually calls the 2.0.3-introduced "customizeBeanFactory" template method

Package org.springframework.core
* BridgeMethodResolver is able to match open type variables in complex overloading scenarios as well
* BridgeMethodResolver caches based on TypeVariable references, handling overlapping type variable names appropriately
* added "createConcurrentMap" method to CollectionFactory, creating a JDK 1.5+ or backport-concurrent ConcurrentHashMap
* Constants class always uses upper-case transformation according to English notation
* added "toCodeForSuffix" operation to Constants class

Package org.springframework.instrument
* ShadowingClassLoader explicitly defines a package for all classes that it loads, for "Class.getPackage()" to work

Package org.springframework.jdbc
* fixed GeneratedKeyHolder to avoid NPE in exception message in case of a null key returned by the JDBC driver
* fixed JdbcTemplate's fallback support for batch updates to properly handle InterruptibleBatchPreparedStatementSetters
* added scale support to SqlParameter, for declaring numeric RdbmsOperation parameters with a specific scale
* added SqlParameterValue class, holding a value including SQL type and scale, accepted by JdbcTemplate argument arrays
* optimized SQL parsing in NamedParameterUtils, NamedParameterJdbcTemplate and SqlOperation through the use of caching
* added "execute" operation with PreparedStatementCallback argument to NamedParameterJdbcOperations/Template
* added overloaded "query" operations with ResultSetExtractor argument to NamedParameterJdbcOperations/Template
* SqlQuery and SqlUpdate accept named parameter declarations in arbitrary order (not requiring positional declaration)
* SqlQuery and SqlUpdate accept unparameter declarations for named parameter usage (assuming positional declaration)

Package org.springframework.jms
* JndiDestinationResolver prefers a concurrent Map for caching purposes (for better concurrency)
* changed visibility of various AbstractMessageListenerContainer property accessors from protected to public
* JmsInvokerClientInterceptor/ProxyFactoryBean and JmsInvokerServiceExporter support a configurable MessageConverter

Package org.springframework.jndi
* TypeMismatchNamingException carries required type and actual type as explicit attributes

Package org.springframework.orm
* ExtendedEntityManagerCreator efficiently detects JTA through PersistenceUnitInfo's "transactionType" (if possible)
* PersistenceAnnotationBeanPostProcessor is able to resolve a lazy EntityManagerFactory via its unit name as well
* factored out "findEntityManagerFactory(ListableBeanFactory, unitName)" method into EntityManagerFactoryUtils

Package org.springframework.remoting
* RemoteExporter shows "use reference, not value" error message in case of the specified service object being a String
* added "replaceExistingBinding" property to RmiServiceExporter, allowing to turn off the automatic replacement strategy
* JndiRmiClientInterceptor/ProxyFactoryBean detects CORBA SystemExceptions and converts them to RemoteAccessExceptions
* JndiRmiClientInterceptor/ProxyFactoryBean detects CORBA OBJECT_NOT_FOUND connect failures and recovers accordingly

Package org.springframework.scheduling
* MethodInvokingJobDetailFactoryBean avoids obtaining the target bean twice in case of "targetBeanName" specified
* revised MethodInvokingJobDetailFactoryBean's error message to include the target class instead of the target object
* DelegatingTimerTask catches any exception or error thrown from its delegate Runnable, to make the Timer proceed
* added "continueScheduledExecutionAfterException" flag to ScheduledExecutorFactoryBean, overriding the default behavior

Package org.springframework.scripting
* added "init-method" and "destroy-method" attributes on "lang:groovy/bsh/jruby", for init/destroy methods in scripts
* ScriptFactoryPostProcessor generates config interface methods for init/destroy methods as well, if demanded

Package org.springframework.test
* AbstractTransactionalSpringContextTests' "onSetUp()"/"onTearDown()" are non-final, allowing for flexible overriding

Package org.springframework.transaction
* AbstractPlatformTransactionManager properly resumes 'foreign' existing synchronization even in case of begin failure
* revised OC4JJtaTransactionManager to support the "oracle.j2ee.transaction" package on OC4J later than 10.1.3.2

Package org.springframework.ui
* ResourceBundleThemeSource will always return the same Theme instance for a given theme name

Package org.springframework.util
* PathMatcher's javadoc defines the semantics of the "extractPathWithinPattern" method in more detail
* AntPathMatcher's "extractPathWithinPattern" preserved a path's leading separator in case of a "*.html" pattern match

Package org.springframework.web
* ContextLoader loads parent context based on "parentContextKey" parameter, not requiring "locatorFactorySelector" param
* DispatcherServlet/Portlet only refresh their strategies if their own ApplicationContext refreshes
* made AbstractHandlerMapping's "setInterceptors" method non-final
* added "extendInterceptors" template method to AbstractHandlerMapping, for registering additional interceptors
* UrlFilenameViewController and InternalPathMethodNameResolver prefer a concurrent Map for caching purposes
* added "mappedHandlerClasses" property to Servlet/Portlet SimpleMappingExceptionResolver, for mapping specific types
* factored out protected "shouldApplyTo" and "doResolveException" template methods in SimpleMappingExceptionResolver
* added "localesToInitialize" property to ResourceBundleViewResolver, for initializing common locales eagerly
* XmlViewResolver (and similar strategies) work again in combination with the implicit default BeanNameUrlHandlerMapping
* JSP FormTag escapes the entire query string, including the parameter separators
* JSP SelectTag always renders a full closing tag (i.e. never renders a short-circuited opening tag with "/>" ending)
* JSP SelectTag accepts null values for its attributes (doesn't strictly enforce non-null values anymore)
* JSP OptionTag properly detects a Java 5 Enum as selected even in case of an overridden "toString()" implementation
* FreeMarkerView exposes a ServletConfig object to FreeMarker, for use with ServletConfig-accessing JSP tags
* fixed AbstractXsltView to correctly apply a specified custom "contentType", even in case of a stylesheet specified
* revised XsltView for Servlet 2.3 compatibility, avoiding the "HttpServletResponse.setCharacterEncoding" method
* revised XsltView to respect a specified "contentType" property, using it if no XSLT media type has been specified
* fixed XsltViewResolver to properly apply the "cacheTemplates" flag to created XsltView instances
* revised AbstractJasperReportsView to accept a model without explicit data source as well (for Hibernate/JPA queries)
* PortletUtils' "getParametersStartingWith" method checks for an empty value array (WebSphere Portal 6.0 peculiarity)


Changes in version 2.0.4 (2007-04-10)
-------------------------------------

Package org.springframework.aop
* AbstractAutoProxyCreator caches advice information per bean, for efficient prototype creation with auto-proxying
* fixed AspectJAfterReturningAdvice to avoid NPE within returning type check in case of the return value being null
* fixed AspectJAwareAdvisorAutoProxyCreator's "toString()" implementation to be compatible with JDK 1.3/1.4
* AnnotationAwareAspectJAutoProxyCreator caches Advisors for singleton @Aspect aspects, increasing performance
* introduced Simple(MetadataAware)AspectInstanceFactory, creating an independent aspect instance on every invocation
* revised AspectJProxyFactory to avoid "spring-beans" dependencies, using SimpleMetadataAwareAspectInstanceFactory now
* AbstractAspectJAdvice lazily calculates argument bindings, avoiding a "spring-beans" dependency (InitializingBean)
* "this" pointcut in AspectJ pointcut expressions is matched against the proxy object rather than the target object

Package org.springframework.beans
* PropertyEditorRegistrySupport/BeanWrapperImpl lazily registers default editors when needed (to avoid init overhead)
* PropertyEditorRegistrySupport supports registration of shared editors, to allow for specific synchronization
* BeanWrapperImpl mimimizes bean name parsing overhead and caches parsed property path tokens
* PatternEditor allows for customization through specifying "java.util.regex.Pattern" flags
* fixed PropertyPlaceholderConfigurer/BeanDefinitionVisitor to correctly handle TypedStringValue objects with null value
* AbstractFactoryBean offers a protected "getBeanFactory()" method for accessing its BeanFactory reference
* BeanReferenceFactoryBean returns null from "getObjectType()" if the BeanFactory has not been injected yet
* AbstractAutowireCapableBeanFactory uses "filteredPropertyDescriptorsCache" for the PropertyDescriptor array per class
* DefaultListableBeanFactory is able to invoke public init and destroy methods on package-protected classes
* DefaultListableBeanFactory caches pre-converted property values as far as possible
* DefaultListableBeanFactory allows placeholders in class names even for non-lazy-init beans
* ConstructorResolver caches the resolved constructor or factory method, for faster re-creation of prototype instances
* ConstructorResolver caches converted argument values, to avoid conversion overhead for re-created prototype instances
* DefaultNamespaceHandlerResolver logs linkage error at warn level, in case of a handler class found but not loadable

Package org.springframework.context
* added "addApplicationListener" method to ConfigurableApplicationContext interface, for statically registered listeners

Package org.springframework.core
* added "getNames", "getNamesForProperty", "getNamesForSuffix" and "getValuesForSuffix" methods to Constants
* fixed GenericCollectionTypeResolver to correctly navigate Map-List-List structures with a nesting level of 3 or more
* BridgeMethodResolver performs multi-step resolution of type variables, for complex multi-type inheritance scenarios

Package org.springframework.dao
* PersistenceExceptionTranslationInterceptor supports PersistenceExceptionTranslator autodetection in standalone mode

Package org.springframework.jca
* added "setConnectionSpec" method and corresponding constructor to CciTemplate, for specifying a spec at template level
* added "getDerivedTemplate(ConnectionSpec) method to CciTemplate, for obtaining a template with just different con spec
* added "getCciTemplate(ConnectionSpec) method to CciDaoSupport, for obtaining a template with just different con spec

Package org.springframework.jdbc
* SqlOperation and its subclasses do not pre-parse for named parameters anymore, accepting ":" in plain SQL strings

Package org.springframework.jms
* added "isSessionTransactional" method to ConnectionFactoryUtils
* introduced SessionProxy interface for target Session access, exposed by TransactionAwareConnectionFactoryProxy
* DefaultMessageListenerContainer switches "sessionTransacted" to "true" in case of a non-JTA ResourceTransactionManager
* DefaultMessageListenerContainer rolls back an external transaction in case of a message rejected while stopping
* DefaultMessageListenerContainer does not eagerly commit/rollback a in case of a synchronized transacted Session
* DefaultMessageListenerContainer obtains a shared Connection lazily in case of autoStartup="true"
* DefaultMessageListenerContainer recovers a shared Connection lazily if it is not currently running (has been stopped)
* DefaultMessageListenerContainer allows for specifying the listener object lazily, and for replacing it at runtime
* fixed JmsInvokerClientInterceptor/ProxyFactoryBean's "queue" property to declare type Queue now

Package org.springframework.jndi
* added "proxyInterfaces" property to JndiObjectFactoryBean, for specifying multiple interfaces
* JndiObjectFactoryBean autodetects proxy interfaces from a specified "expectedType", if necessary
* JndiObjectTargetSource returns the specified "expectedType" as target class if no JNDI object has been obtained yet

Package org.springframework.mail
* added "setPriority" method to MimeMessageHelper, for populating the "X-Priority" mail header

Package org.springframework.mock
* MockHttpServletResponse automatically marks the response as committed once the buffer size has been exceeded
* MockHttpServletResponse marks the response as committed in case of a "OutputStream.flush()" / "Writer.flush()" call

Package org.springframework.orm
* SharedEntityManagerCreator's proxies deliver a "toString()" result without touching a target EntityManager
* added protected "getPersistenceUnitInfo" method to DefaultPersistenceUnitManager, to allow for better subclassing
* DefaultPersistenceUnitManager clears the default PersistenceUnitInfo once it has been obtained
* added "defaultPersistenceUnitName" property to PersistenceAnnotationBeanPostProcessor
* PersistenceAnnotationBeanPostProcessor only sets fields/methods accessible when actually necessary

Package org.springframework.remoting
* RemoteInvocationUtils detects cycles in exception causes when updating the stack trace (avoiding an infinite loop)

Package org.springframework.samples
* added default Hibernate EntityManager and Apache OpenJPA configurations to PetClinic's WAR file and integration tests
* PetClinic's JPA variant explicitly specifies "META-INF/orm.xml" as mapping file (for Hibernate EntityManager 3.3.0)
* PetPortal's build script properly includes the Log4J jar in the WAR file

Package org.springframework.scheduling
* added "targetBeanName" property to MethodInvokingJobDetailFactoryBean for Quartz, allowing for non-singleton targets
* ThreadPoolTaskExecutor/ScheduledExecutorFactoryBean includes the corresponding bean name in startup/shutdown logging

Package org.springframework.scripting
* LangNamespaceHandler references ScriptFactory classes by name, to avoid NoClassDefFoundErrors in all scenarios
* added "scope" attribute to all script tags in the "lang" namespace, allowing for non-singleton script objects
* updated JRuby support for JRuby 0.9.8 (requiring this version now due to incompatible JRuby API changes)

Package org.springframework.test
* added "getActualException()" method to AssertThrows, for introspecting the actual exception instance after throwing

Package org.springframework.transaction
* factored out TransactionOperations interface from TransactionTemplate, defining the central "execute" operation
* introduced ResourceTransactionManager (i.e. non-JTA) interface, indicating the resource factory that it operates on
* "tx:advice" expects that the XML parser might not expose the defaults defined in "spring-tx-2.0.xsd" (e.g. on Resin)

Package org.springframework.util
* ObjectUtils's "nullSafeToString"/"getDisplayValue" returns an empty String if "Object.toString()" returned null
* ClassUtils's "classPackageAsResourcePath" parses the class name in order to detect the package name in all cases
* fixed CustomizableThreadCreator to properly apply its "daemon" flag (inherited by SimpleAsyncTaskExecutor)

Package org.springframework.web
* added "getContextPath", "getRemoteUser", "getUserPrincipal", "isUserInRole", "isSecure" to WebRequest abstraction
* changed visibility of "getRequest" accessor on ServletWebRequest and PortletWebRequest to public
* CharacterEncodingFilter sets the encoding as default response encoding on Servlet 2.4+ (if "forceEncoding"="true")
* Servlet/PortletContextAware and Servlet/PortletConfigAware are simply skipped if they cannot be satisfied
* added public "refresh()" operation with protected "onRefresh()" template method to DispatcherServlet/Portlet
* reworked DispatcherServlet/Portlet to automatically refresh internal state if its ApplicationContext refreshes
* DispatcherPortlet logs startup logging at debug level instead of info level, analogous to DispatcherServlet
* factored out protected "getHandlerExecutionChain" template method in Servlet/Portlet AbstractHandlerMapping
* added "getRootHandler()" method to AbstractUrlHandlerMapping, called on each access to the root handler
* added overloaded "suppressValidation(request, command, errors)" variant to BaseCommandController
* deprecated "suppressValidation(request)" in BaseCommandController, in favor of the "(request, command)" variant
* revised AbstractXsltView for transformer customization options ("buildTransformer" and "getTemplates" methods)
* added "getParameters(model, request") variant to AbstractXsltView, deprecating the old "getParameters()" variant
* "spring.tld" and "spring-form.tld" declare the Spring major version number (2.0) as taglib version number
* fixed JSP BindTag to correctly save and re-expose a page-scoped "status" attribute (not just a request-scoped one)
* JSP FormTag escapes the "action" attribute as well if HTML escaping has been requested
* JSP InputTag supports the common "autocomplete" HTML extension attribute (as supported by IE and Firefox)
* JSP InputTag and TextareaTag support the HTML "readonly" element correctly now, only rendering it if specified
* JSP CheckboxTag applies custom editors for the element type when comparing collection elements
* added missing "readonly" attribute to JSP TextareaTag
* checkbox and radiobutton macros in "spring.vm" for Velocity do not render an id anymore (because it isn't unique)
* checkbox macro in "spring.vm" for Velocity and "spring.ftl" for FreeMarker renders the default field marker
* added theme macros to "spring.vm" for Velocity and "spring.ftl" for FreeMarker, providing access to theme messages


Changes in version 2.0.3 (2007-03-09)
-------------------------------------

General
* basic scheduling support is included in "spring-context.jar", with only Quartz support added in "spring-support.jar"
* all checks for library presence are explicitly performed with Spring's own ClassLoader (not the application's)
* overall startup/shutdown logging at info level is less verbose (activate debug log level for more config details)
* included the "petportal" sample application in the "-with-dependencies" distribution

Package org.springframework.aop
* introduced AfterAdvice marker, as super-interface of AfterReturningAdvice and ThrowsAdvice, for reduced coupling
* exposed "invocableClone()" and "setUserAttribute"/"getUserAttribute" on ProxyMethodInvocation, for reduced coupling
* introduced TargetClassAware interface, extended by Advised, and framework-decoupled "AopUtils.getTargetClass" method
* fixed ClassFilters to provide JDK-1.3/1.4-compatible "hashCode()" implementations for unions and intersections
* MethodMatchers and Pointcuts support IntroductionAwareMethodMatcher for unions and intersections
* added pointcut union operation to ComposablePointcut, reused by the "Pointcuts.union" convenience operation
* RegexpMethodPointcutAdvisor references ORO classes indirectly, to avoid eager loading of ORO on Solaris JDK 1.6
* AnnotationMethodMatcher and AnnotationMatchingPointcut check for an annotation on the target method as well
* added "forClassAnnotation" and "forMethodAnnotation" factory methods to AnnotationMatchingPointcut
* redefined target-class proxying to create a JDK proxy in case of the target class being an interface
* CGLIB proxies handle "hashCode" calls according to their "equals" behavior, analogous to JDK dynamic proxies
* introduced stricter null checks for Advised/AdvisedSupport
* exposed "indexOf(Advice)" method on Advised interface
* revised ProxyConfig/AdvisedSupport's "toString()" output
* added "setTargetClass" method to AdvisedSupport, building an EmptyTargetSource for the specified class
* moved "aopProxyFactory" bean property and AdvisedSupportListener management down to new ProxyCreatorSupport base class
* AdvisorChainFactory is not forced to implement the AdvisedSupportListener interface anymore
* deprecated AdvisorChainFactoryUtils and HashMapCachingAdvisorChainFactory in favor of SimpleAdvisorChainFactory
* added overloaded ProxyFactory constructors for single-interceptor and TargetSource-only proxies
* ProxyFactoryBean exposes a composite interface as object type in case of multiple proxy interfaces specified
* AbstractSingletonProxyFactoryBean and AbstractAutoProxyCreator use the bean ClassLoader for generating proxies
* reworked AdvisorAdapter and AdvisorAdapterRegistry to expose a MethodInterceptor right away
* AspectJExpressionPointcut ignores target classes not accepted by PointcutExpression matching (such as arrays)
* AspectJExpressionPointcut falls back to the proxy method if the ShadowMatch failed for the target method
* revised AspectJPointcutAdvisor to never apply AspectJ advice methods to themselves (avoiding a stack overflow)
* AbstractAspectJAdvice calls "setAccessible" on an advice method right before invocation and only if actually necessary
* AspectJAdviceParameterNameDiscoverer properly considers reference pointcuts as potential source of parameter binding
* AbstractAspectJAdvisorFactory detects @AspectJ aspects through the presence of the @Aspect annotation
* MethodInvocationProceedingJoinPoint allows for multiple "proceed(arguments)" calls, cloning the underlying invocation
* PrototypeAspectInstanceFactory enforces that the target bean is a prototype; it does not accept scoped objects
* PrototypeTargetSource enforces that the target bean is a prototype; it does not accept scoped objects
* PrototypeTargetSource destroys bean instances on release (honors DisposableBean and/or destroy-method)
* ThreadLocalTargetSource destroys bean instances via ConfigurableBeanFactory's "destroyBean" (if possible)
* added "forClass" factory method to EmptyTargetSource, allowing to indicate a specific target class
* added "equals"/"hashCode" implementation to AbstractBeanFactoryBasedTargetSource
* HotSwappableTargetSource's "hashCode" implementation returns a constant value even if the target object changes
* added SimpleBeanTargetSource, performing a fresh getBean lookup on every request, for any kind of bean
* ScopedProxyFactoryBean uses the BeanFactory's bean ClassLoader for generating scoped proxies
* auto-proxying ignores objects exposed by ScopedProxyFactoryBeans; only their target beans are eligible
* fixed "scoped-proxy" bean definition decorator to properly parse an inner bean with scoped-proxy marker
* added "proxy-target-class" attribute to "scoped-proxy" XML tag, allowing to turn target class proxying off
* reworked "scoped-proxy" XML tag to enforce a target class proxy selectively, for its specific target bean
* "scoped-proxy" marks its targets as autowireCandidate=false, to make autowiring by type only hit the scoped proxy
* @Configurable works for deserialized objects as well

Package org.springframework.beans
* CachedIntrospectionResults's "acceptedClassLoaders" facility uses thread-safe iteration
* fixed BeanWrapperImpl's "toString()" output in case of no wrapped object set
* BeanWrapperImpl supports nested generic collections as map keys and as indexed map values
* added "getTypeConverter()" method to ConfigurableBeanFactory interface
* MethodInvokingFactoryBean obtains the TypeConverter from the BeanFactory that it runs in
* List/Set/MapFactoryBean convert elements to the generic type expressed in a superclass/interface of the target class
* added SmartInstantiationAwareBeanPostProcessor interface, supporting type prediction (for scripted object types)
* PropertyPlaceholderConfigurer detects and processes placeholders in scope names as well
* PropertyPlaceholderConfigurer does not log resolved (potentially decrypted) placeholder values at debug level anymore
* PreferencesPlaceholderConfigurer resolves paths in placeholders ("myPath/myPlaceholderKey") as preference nodes
* added "isPrototype(beanName)" method to BeanFactory interface, explicitly checking for an independent instance
* added extended SmartFactoryBean interface, including an "isPrototype()" method that checks for an independent instance
* AbstractBeanFactory throws BeanCreationException will full context info if "postProcessObjectFromFactoryBean" fails
* DisposableBeanAdapter (as passed into "Scope.registerDestructionCallback") is serializable, even for post-processors
* AbstractAutowireCapableBeanFactory does not trigger "toString()" call on argument for UnsatisfiedDependencyException
* turned visibility of AbstractAutowireCapableBeanFactory's "applyPropertyValues" method from private to protected
* DefaultListableBeanFactory's "getBeansOfType" only ignores currently-in-creation for beans which are still in creation
* added copy constructor to ChildBeanDefinition, for custom use in programmatic bean registration code
* TypedStringValue overrides "equals", "hashCode" and "toString"
* TypedStringValue implements the BeanMetadataElement interface and provides a "setSource" method
* introduced BeanNameGenerator strategy interface, to be configured on an AbstractBeanDefinitionReader
* added "generateBeanName/registerWithGeneratedName(BeanDefinition)" methods to XmlReaderContext
* BeanDefinitionParseDelegate always builds TypedStringValue for "value" and "null" XML elements, preserving the source
* BeanDefinitionParseDelegate builds TypedStringValue for "entry" and "prop" keys and values, preserving the source
* BeanDefinitionParseDelegate trims whitespace from "class" attributes in XML bean definitions
* collection merging accepts a null parent value as well, simply using the child collection as-is in this case
* indexed constructor arguments support collection merging (driven by merge="true", analogous to property values)
* BeanDefinitions returned by nested custom XML elements receive a generated id, to avoid FactoryBean cache conflicts
* added deprecated "findXxx" signatures back to NamespaceHandlerSupport, for full compatibility with Spring 2.0 final
* added protected "shouldGenerateIdAsFallback()" template method to AbstractBeanDefinitionParser
* AbstractSingleBeanDefinitionParser applies a document's default-lazy-init="true" to its generated bean definitions
* added "isEligibleAttribute" template method to AbstractSimpleBeanDefinitionParser, for excluding specific attributes
* "util:properties" tag supports nested "prop" elements for local entries, analogous to the standard "props" tag

Package org.springframework.context
* AbstractApplicationContext instantiates BeanPostProcessors which implemented Ordered before non-Ordered ones
* AbstractApplicationContext applies start/stop callbacks to existing Lifecycle instances only, particularly on shutdown
* AbstractApplicationContext correctly detects listener creation failure (in case of currently-in-creation exception)
* factored out protected "destroyBeans()" template method in AbstractApplicationContext, for custom bean destruction
* AbstractRefreshableApplicationContext allows BeanFactory access during the destruction phase of a "refresh()" call
* added "customizeBeanFactory(DefaultListableBeanFactory)" template method to AbstractRefreshableApplicationContext
* (Reloadable)ResourceBundleMessageSource trims whitespace from specified bundle basenames
* ResourceBundleMessageSource by default uses the bean ClassLoader for loading bundles

Package org.springframework.core
* added "getMostSpecificCause()" method to NestedRuntime/CheckedException, retrieving the root cause or this exception
* fixed BridgeMethodResolver's "populateTypeMapFromParameterizedType" to properly handle nested generics
* fixed BridgeMethodResolver to properly detect a generic interface even in a class hierarchy
* fixed BridgeMethodResolver to properly detect a generic array type as exposed by a vararg signature
* introduced AsyncTaskExecutor extension interface, defining an "execute" variant with start timeout
* refactored SimpleAsyncTaskExecutor to allow for reuse of the CustomizableThreadCreator class
* SimpleAsyncTaskExecutor executes tasks with timeout='immediate' directly, bypassing the concurrency throttle
* introduced TaskTimeoutException, thrown by an AsyncTaskExecutor in case of a task rejected because of a timeout

Package org.springframework.dao
* PersistenceExceptionTranslationPostProcessor uses the bean ClassLoader for generating translation proxies

Package org.springframework.ejb
* AbstractEnterpriseBean uses the EJB instance as WeakReferenceMonitor handle, instead of a BeanFactoryReference proxy
* all "jee:*" tags support an "environment-ref" attribute, pointing to a shared bean of type "java.util.Properties"
* OC4J's "com.evermind.server.rmi.RMIConnectionException" gets detected as Remote EJB (RMI) connect failure as well

Package org.springframework.instrument
* ShadowingClassLoader excludes "com.sun." package by default (for using Sun's Xerces version through JAXP)

Package org.springframework.jca
* TransactionAwareConnectionFactoryProxy throws JCA IllegalStateException in case of "getLocalTransaction()" access
* CciLocalTransactionManager unwraps given TransactionAwareConnectionFactoryProxy to obtain its target ConnectionFactory
* added ResourceAdapterFactoryBean to "jca.support" package, for bootstrapping a JCA 1.5 ResourceAdapter locally
* introduced "jca.work" package, containing a JCA 1.5 WorkManagerTaskExecutor and a SimpleTaskWorkManager implementation

Package org.springframework.jdbc
* added overloaded ConnectionHolder constructor with a given Connection plus "transactionActive" flag as arguments
* UserCredentialDataSourceAdapter delegates "getConnection(String, String)" to "doGetConnection", for unified handling
* introduced IsolationLevelDataSourceAdapter, preparing Connections with isolation level (transaction's or fixed)
* introduced WebSphereDataSourceAdapter, obtaining Connections through WebSphere's JDBCConnectionSpec facility
* re-added Spring 1.2's "JdbcUtils.isNumeric" convenience method, for use by applications (upgrading from Spring 1.2)
* revised JdbcTemplate's prepared statement logging

Package org.springframework.jms
* marked JmsDestinationAccessor as abstract
* moved protected "createConnection" and "createSession" methods from JmsTemplate up to JmsAccessor
* TransactionAwareConnectionFactoryProxy throws TransactionInProgressException in case of manual commit/rollback calls
* JmsTransactionManager unwraps given TransactionAwareConnectionFactoryProxy to obtain its target ConnectionFactory
* ConnectionFactoryUtils's JmsResourceHolder only stops Connections if a SmartConnectionFactory explicitly asks for it
* factored out AbstractJmsListeningContainer base class from AbstractMessageListenerContainer
* AbstractMessageListenerContainer's "refreshSharedConnection" properly resets shared Connection in refresh failure case
* AbstractMessageListenerContainer explicitly aborts messages which have been delivered after initiated shutdown
* added "acceptMessagesWhileStopping" flag to AbstractMessageListenerContainer, for processing all delivered messages
* factored out AbstractPollingMessageListenerContainer base class from DefaultMessageListenerContainer
* added dynamic scaling up/down to DefaultMessageListenerContainer, configured through "maxConcurrentConsumers" property
* DefaultMessageListenerContainer's Connection recovery loop catches any Exception thrown from "createConnection"
* MessageListenerAdapter can delegate to native target (SessionAware)MessageListener if no listener method specified

Package org.springframework.jmx
* MBeanExporter and MBeanServerConnectionFactoryBean use the bean ClassLoader for generating lazy-init proxies
* MBeanExporter supports lazy-init standard MBeans analogously to lazy-init Spring beans with ModelMBean wrapping
* factored out protected "isMBean(Class") method in MBeanExporter, to allow for extending the default MBean check
* MBeanServerFactoryBean only tries to obtain the JDK 1.5 platform MBeanServer in case of no agent id specified
* MBeanServerFactoryBean tries to create a new MBeanServer if not allowed to access the JDK 1.5 platform MBeanServer
* added WebSphereMBeanServerFactoryBean, using WebSphere's proprietary AdminServiceFactory API for MBeanServer access
* added "agentId" property to MBeanClientInterceptor/MBeanProxyFactoryBean, for locating a specific MBeanServer

Package org.springframework.jndi
* JndiObjectFactoryBean uses the bean ClassLoader for generating lazy-init proxies
* JndiObjectTargetSource (as used by JndiObjectFactoryBean's "proxyInterface" support) throws JndiLookupException

Package org.springframework.mock
* added "clearAttributes()" method to MockHttpServletRequest and MockHttpSession
* added "serializeState" and "deserializeState" methods to MockHttpSession, for testing attribute serialization
* introduced MockFilterChain (recording the call) and PassThroughFilterChain (passing the call on to a Filter/Servlet)

Package org.springframework.orm
* added "flushMode" init parameter to Hibernate3 OpenSessionInViewFilter (supporting "AUTO" etc as value)
* Hibernate3 SessionFactoryUtils translates SQLGrammar/DataException into InvalidDataAccessResourceUsageException
* Hibernate3 HibernateAccessor/TransactionManager translates GenericJDBCException using a default SQLExceptionTranslator
* TopLink LocalSessionFactory provides "loginProperties"/"loginPropertyMap" bean properties, for applying login settings
* TopLink LocalSessionFactoryBean uses the bean ClassLoader as TopLink Session ClassLoader

Package org.springframework.remoting
* all remoting ProxyFactoryBeans use the bean ClassLoader for generating service proxies
* RemoteExporter uses the bean ClassLoader for generating service proxies
* added public "getHost()" and "getPort()" accessors to RmiRegistryFactoryBean
* added "alwaysCreate" flag to RmiRegistryFactoryBean, for avoiding the overhead of locating an existing registry
* added "alwaysCreateRegistry" flag to RmiServiceExporter, for avoiding the overhead of locating an existing registry
* added "rebind()" method to JndiRmiServiceExporter, for recovering in case of the target registry having been restarted
* CodebaseAwareObjectInputStream uses "Class.forName", to be able to resolve array classes with any ClassLoader
* added "getTargetInterfaceName()" method to RmiInvocationHandler, for client-side introspection
* HttpInvokerClientInterceptor does not require an "afterPropertiesSet()" call for initializing the request executor
* added "serviceFactory" property to LocalJaxRpcServiceFactory, for passing in a pre-initialized ServiceFactory instance
* fixed JaxRpcPortClientInterceptor to properly recover in case of a failed lazy "prepare()" attempt
* JaxRpcPortClientInterceptor consistently throws RemoteLookupFailureException if a lazy "prepare()" attempt failed
* added "refreshServiceAfterConnectFailure" bean property to JaxRpcPortClientInterceptor, allowing for service recovery

Package org.springframework.scheduling
* added "workListener" bean property to the CommonJ WorkManagerTaskExecutor
* introduced the CustomizableThreadFactory class, implementing JDK 1.5's ThreadFactory SPI with bean-style configuration
* ThreadPoolTaskExecutor's "corePoolSize" and "maxPoolSize" properties allow for runtime changes (e.g. through JMX)
* added "getPoolSize()" and "getActiveCount()" methods to ThreadPoolTaskExecutor (intended for JMX exposure)
* added "getThreadPoolExecutor()" accessor to ThreadPoolTaskExecutor, for native access to the underlying executor
* added "exposeUnconfigurableExecutor" bean property to ScheduledExecutorFactoryBean
* added support for the JSR-166 (java.util.concurrent) backport project, in the "scheduling.backportconcurrent" package

Package org.springframework.scripting
* added "getScriptedObjectType" method to ScriptFactory interface
* Bsh/Groovy/JRubyScriptFactory uses the bean ClassLoader for generating script objects
* BshObjectInvocationHandler/JRubyObjectInvocationHandler implement "equals"/"hashCode/"toString" based on script object
* BshScriptUtils and BshScriptFactory support BeanShell scripts that declare an actual class or instance
* GroovyScriptFactory supports Groovy scripts that create an actual instance or explicitly return an object
* Bsh/GroovyScriptFactory caches the script class as far as possible, building prototypes from the same class
* JRubyScriptUtils passes the declared return type to JRuby, for proper conversion of number types
* JRubyScriptUtils converts Ruby arrays back to declared Java arrays
* ScriptFactoryPostProcessor uses the bean ClassLoader for generating refreshable script proxies
* ScriptFactoryPostProcessor applies a config interface to the scripted target object only, not to a refreshable proxy
* revised ScriptFactoryPostProcessor to support AOP auto-proxying for scripted objects
* revised ScriptFactoryPostProcessor to support type determination for scripted objects
* LangNamespaceHandler always registers all BeanDefinitionParsers, failing with NoClassDefFoundError for actual script

Package org.springframework.test
* AbstractSingleSpringContextTests uses GenericApplicationContext by default, created through "createApplicationContext"
* added "customizeBeanFactory(DefaultListableBeanFactory)" template method to AbstractSingleSpringContextTests
* AbstractSingleSpringContextTests supports "getConfigPaths()" method, specifying config files relative to test class
* AbstractSingleSpringContextTests supports "getConfigPath()" method, specifying a single file relative to test class
* changed the visibility of AbstractDependencyInjectionSpringContextTests's "injectDependencies" method to protected
* changed the visibility of AbstractTransactionalSpringContextTests's "transactionDefinition" field to protected
* AssertThrows preserves an unexpected exception as root cause in the "wrong exception thrown" AssertionFailedError

Package org.springframework.transaction
* AbstractPlatformTransactionManager exposes "actualTransactionActive" flag for a newly synchronized existing tx as well
* AbstractPlatformTransactionManager marks an existing transaction as rollback-only even in case of a commit exception
* turned various AbstractPlatformTransactionManager methods from private to protected, for reuse in specific subclasses
* JtaTransactionManager does not fail if default UserTransaction lookup fails: falls back on TransactionManager instead
* SpringJtaSynchronizationAdapter does not explicitly call "setRollbackOnly" on WebLogic, to preserve the root cause
* added OC4JJtaTransactionManager for Oracle OC4J 10.1.3(.2), with support for transaction names and isolation levels
* fixed AbstractFallbackTransactionAttributeSource to synchronize access to its attribute cache
* added "order" attribute to "tx:annotation-driven" tag, determining the order of the tx advisor in the advice chain

Package org.springframework.util
* ResourceUtils's "extractJarFileURL" only prepends a slash in front of a file path if it doesn't already have a slash
* added CustomizableThreadCreator class, serving as base class for ThreadFactory adapters

Package org.springframework.web
* CharacterEncodingFilter only applies its encoding if actually specified (non-null)
* ConfigurableWebApplicationContext and ConfigurablePortletApplicationContext expose config state through getters
* RequestContextListener works correctly even in case of the "requestDestroyed" callback coming from a different thread
* ServletRequestAttributes's DestructionCallbackBindingListener is serializable, surviving web app restarts
* added "warnLogCategory" property to SimpleMappingExceptionResolver, allowing to log the exception to warn level
* added protected "determineStatusCode" method to Servlet SimpleMappingExceptionResolver, for custom status codes
* added "rootHandler" bean property to AbstractUrlHandlerMapping, kicking in for the "/" path
* added "detectHandlersInAncestorContexts" to BeanNameUrlHandlerMapping, for detecting handler beans in the root context
* added "excludedPackages" and "excludedClasses" bean properties to ControllerClassNameHandlerMapping
* ControllerClassNameHandlerMapping excludes all classes in the "org.springframework.web.servlet.mvc" package by default
* revised FormTag to be more extensible (through less assertions and consistent use of protected template methods)
* OptionsTag accepts no or empty items specified, simply not rendering any option tags in such a case
* ErrorsTag properly supports HTML escaping (participates in default HTML escaping and respects the "htmlEscape" flag)
* ErrorsTag simply renders empty if neither a BindingResult nor a target object for its bind path is present
* revised VelocityToolboxView to support Velocity Tools 1.3's init methods (ViewTool callbacks are now deprecated)
* FreeMarker "formTextarea" macro does not re-escape its value (escaping is up to "htmlEscape"/"defaultHtmlEscape")
* added "messageArgs" and "messageArgsText" macros to the "spring.ftl" FreeMarker macro template library


Changes in version 2.0.2 (2007-01-08)
-------------------------------------

General
* fixed spring-beans.jar to not include "META-INF/aop.xml", "META-INF/spring.tld" and "META-INF/spring-form.tld" anymore
* leverage the "trace" log level in the Spring core, to make activating the "debug" log level more bearable

Package org.springframework.aop
* AbstractRegexpMethodPointcut trims whitespace from passed-in "patterns" and "excludedPatterns"
* fixed AbstractAutoProxyCreator to allow for proxying the same bean with multiple auto proxy creators (again)
* BeanNameAutoProxyCreator trims whitespace from passed-in "beanNames"
* ScopedProxyFactoryBean throws IllegalStateException if it couldn't determine the type of the target bean (avoid NPE)
* "scoped-proxy" tag works for non-singleton FactoryBeans as well, leveraging the BeanFactory's improved type check
* factored out BeanFactoryAdvisorRetrievalHelper from AbstractAdvisorAutoProxyCreator
* factored out BeanFactoryAspectJAdvisorsBuilder from AnnotationAwareAspectJAutoProxyCreator
* added AbstractBeanFactoryPointcutAdvisor and DefaultBeanFactoryPointcutAdvisor
* each "aop:advisor" entry lazily initializes its Advice bean, to let all target beans be exposed to all Advisors

Package org.springframework.beans
* CachedIntrospectionResults allows for caching for specific ClassLoaders even if their classes are not cache-safe
* BeanWrapper interface extends TypeConverter interface, instead of just BeanWrapperImpl implementing TypeConverter
* BeanWrapperImpl converts nested collection value (e.g. List within Map) to declared generic type, if applicable
* BeanWrapperImpl's TypeMismatchException mentions the specific element that failed in case of a (generic) collection
* BeanWrapperImpl assigns a given array directly if component type matches and no matching custom editors registered
* added default editor for JDK 1.4's "java.net.URI" class, supporting "classpath:" pseudo URLs as well as general URIs
* ResourceEditorRegistrar always registers ClassEditor for given ResourceLoader's ClassLoader
* added "originalBeanName(String)" method to BeanFactoryUtils, allowing to cut off a generated "#..." suffix
* FieldRetrievingFactoryBean and PropertyPathFactoryBean extract the original bean name for their beanName-based syntax
* added support for 'early access singletons' to AbstractFactoryBean, exposing a proxy in case of a circular reference
* ListFactoryBean, SetFactoryBean and MapFactoryBean support exposure of a proxy in case of a circular reference
* refined currently-in-creation check for lazy-init singletons, to avoid unintended BeanCurrentlyInCreationException
* DefaultSingletonBeanRegistry and subclasses use unified mutex for singleton access, to avoid potential for deadlocks
* AbstractBeanFactory caches merged bean definitions with bean definition identity as key (to avoid bean name conflicts)
* AbstractAutowireCapableBeanFactory caches "isExcludedFromDependencyCheck" results for affected PropertyDescriptors
* AbstractAutowireCapableBeanFactory provides two-step FactoryBean type check for non-singleton FactoryBeans as well
* fixed AbstractAutowireCapableBeanFactory to only apply injection-before-wrapping check for singletons
* DefaultListableBeanFactory avoids expensive dependency check preparations unless an actual dependency check is needed
* ResourceEntityResolver catches any kind of Exception in system root URL check (in particular AccessControlException)
* introduced XmlBeanDefinitionStoreException, with special support for SAXParseException and its location information
* XmlBeanDefinitionReader chooses XSD validation if XmlValidationModeDetector indicates AUTO (= no clear indication)
* XML bean "id" and "name" (aliases) are allowed to define the same name (for backwards compatibility with Spring 1.2.8)
* BeanDefinitionDecorators are applied to inner beans as well (in particular: "p:" namespace works for inner beans now)
* fixed AbstractBeanDefinitionParser and UtilNamespaceHandler to consistently use ProblemReporter instead of exceptions
* added "fatal" method to ProblemReporter, used by NamespaceHandlerSupport to report a missing parser or decorator
* added "defaultsRegistered" notification to ReaderEventListener, with DefaultsDefinition marker interface as argument
* reworked BeanDefinitionParserDelegate to build and hold a DocumentDefaultsDefinition instance, also firing an event
* BeanDefinitionParserDelegate/AbstractBeanDefinitionParser report bean name generation failure through ProblemReporter
* DefaultBeanDefinitioDocumentReader reports alias registration failure through ProblemReporter

Package org.springframework.context
* AbstractApplicationContext explicitly stops all Lifecycle Beans before destroying them one-by-one (to avoid delays)

Package org.springframework.core
* Conventions (as used by ModelMap) extracts inner class name for inner classes
* Conventions (as used by ModelMap) extracts primary interface name for JDK proxies
* reworked CollectionFactory's "createApproximateCollection/Map" to preserve original Comparator for TreeSet/TreeMap
* LocalVariableTableParameterNameDiscoverer uses current ClassLoader for ASM analysis (not the system ClassLoader)
* PathMatchingResourcePatternResolver properly handles jar file roots returned by the ClassLoader (e.g. on Resin)

Package org.springframework.dao
* added "singleResult" and "requiredSingleResult" methods to DataAccessUtils, distinct from "uniqueResult"'s contract

Package org.springframework.jdbc
* RowMapperResultSetExtractor always uses ArrayList, even in case of unknown number of rows expected
* JdbcTemplate by default uses "PreparedStatement.setString" for any CharSequence (including String and StringBuilder)
* JdbcTemplate logs SQLWarnings at debug instead of warn level, to avoid repeated warn logs for acceptable conditions
* JdbcTemplate's "queryForObject" uses "requiredSingleResult" to never accept more than 1 row in result (as per its c.)
* SqlQuery's "findObject" explicitly uses "singleResult" to never accept more than 1 row in result (as per its contract)

Package org.springframework.jms
* introduced SmartConnectionFactory interface and "ConnectionFactoryUtils.releaseConnection" method
* introduced DelegatingConnectionFactory, configuring whether a Connection should be stopped before closing it
* JmsTemplate/DefaultMessageListenerContainer do *not* explicitly stop their Connections by default anymore (see above)
* added "transactionName" property to DefaultMessageListenerContainer (in particular for WebLogic's tx monitoring)
* fixed JmsInvokerClientInterceptor to always explicitly start its Connection (not rely on pre-started Connections)

Package org.springframework.jmx
* reworked MBeanProxyFactoryBean's and ConnectorServerFactoryBean's "setObjectName" to also accept ObjectName reference

Package org.springframework.orm
* SqlMapClientFactoryBean uses SqlMapClientBuilder with InputStream if possible (on iBATIS 2.3, to avoid encoding issue)
* Hibernate3 LocalSessionFactoryBean automatically sets JTATransactionFactory if given a "jtaTransactionManager"
* Hibernate3 LocalSessionFactoryBean only sets connection release mode "on_close" if not given a "jtaTransactionManager"
* Hibernate3 LocalSessionFactoryBean exposes configured DataSource for schema update (required on Hibernate 3.2.1+)
* fixed Hibernate JTA transaction synchronization to properly mark a rollback on WebSphereExtendedJTATransactionLookup
* HibernateJpaDialect switches FlushMode to MANUAL in case of read-only, and enforces COMMIT or AUTO for read-write tx
* fixed "hashCode()" handling in extended JPA EntityManager proxy, avoiding an eternal recursion
* extended JPA EntityManagers that join a synchronized transaction propagate a commit exception to the (commit) caller
* PersistenceUnitReader determines URI-conforming persistence unit root (for Hibernate EntityManager's archive browsing)
* JpaTransactionManager and EntityManagerFactoryUtils's JTA synchronization clear a pre-bound EntityManager on rollback
* PersistenceAnnotationBeanPostProcessor allows for specifying JNDI names for persistence units and persistence contexts
* OpenXxxInViewFilters reobtain thread-bound holder for closing it, to allow for replacing the holder during a request

Package org.springframework.remoting
* RmiServiceExporter logs description of actual registry instead of port (to properly handle passed-in "registry")
* HttpInvokerClientInterceptor/ProxyFactoryBean uses the ClassLoader of the containing BeanFactory for deserialization

Package org.springframework.samples
* cleaned up platform/login configuration in PetClinic's TopLink variant

Package org.springframework.scheduling
* fixed MethodInvokingJobDetailFactoryBean to be compatible with Quartz 1.6 as well as Quartz 1.5.2 (again)
* reworked Quartz SpringBeanJobFactory's "ignoredUnknownProperties" into a String array of unknown properties to ignore
* CommonJ TimerManagerFactoryBean supports Lifecycle interface, suspending/resuming its TimerManager accordingly
* CommonJ TimerManagerFactoryBean explicitly stops its TimerManager on destroy, not relying on J2EE application shutdown
* added "shared" flag to CommonJ TimerManagerFactoryBean, to suppress suspend/resume/stop calls in case of a shared TM

Package org.springframework.scripting
* updated Groovy support to Groovy 1.0 final
* added optional GroovyObjectCustomizer constructor arg to GroovyScriptFactory, to allow for setting a custom MetaClass
* updated JRuby support to JRuby 0.9.2 (not compatible with previous JRuby versions anymore!)
* fixed JRubyScriptFactory to correctly wrap Java objects that get passed into a JRuby script proxy
* fixed JRubyScriptFactory's "findClassNode" to always cast the correct object

Package org.springframework.test
* added public "getApplicationContext()" method to AbstractSingleSpringContextTests
* added public "getJdbcTemplate()" method to AbstractTransactionalDataSourceSpringContextTests

Package org.springframework.transaction
* AbstractPlatformTransactionManager logs full transaction definition when creating a new transaction
* added "defaultTimeout" property to AbstractPlatformTransactionManager

Package org.springframework.ui
* VelocityEngineFactory/SpringResourceLoader supports Velocity-style comma-separated paths as "resourceLoaderPath" value

Package org.springframework.util
* added overloaded no-arg "start()" method to StopWatch
* added "hasConstructor" and "getConstructorIfAvailable" methods to ClassUtils
* ClassUtils's "getAllInterfaces"/"getAllInterfacesForClass" preserves interface definition order in the result array
* fixed AntPathMatcher's "extractPathWithinPattern" to correctly extract paths that have fewer parts than the pattern
* XmlValidationModeDetector returns VALIDATION_AUTO if it encounters a CharConversionException

Package org.springframework.validation
* added "prefix" property and "postProcessMessageCode" template method to DefaultMessageCodesResolver

Package org.springframework.web
* IntrospectorCleanupListener explicitly exposes the web app ClassLoader as cacheable for CachedIntrospectionResults
* introduced MissingServlet/PortletRequestParameterException subclasses of Servlet/PortletRequestBindingException
* reworked the 'default value for missing parameter' check in Servlet/PortletRequestUtils to be as efficient as possible
* AbstractUrlHandlerMapping exposes PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE for default handler as well
* extracted "getViewNameForUrlPath(String)" in UrlFilenameViewController, for full compatibility with Spring 1.2.8
* added "alwaysInclude" bean property to InternalResourceView, for enforcing the use of an include (never a forward)
* AbstractJasperReportsView automatically converts exporter parameter Strings that start with a digit into Integers
* added "getCompletePath()" method to AbstractDataBoundFormElementTag, esposing nested path concatenated with path
* fixed ErrorsTag to use complete path as id, including the nested path
* removed unnecessary setter assertions for optional properties in FormTag and InputTag


Changes in version 2.0.1 (23.11.2006)
-------------------------------------

General
* included classes in the "test.annotation" and "test.jpa" packages (tiger mock directory) in the Spring API javadoc

Package org.springframework.aop
* HashMapCachingAdvisorChainFactory uses synchronized access to its method cache Map
* AbstractAutoProxyCreator considers all Advices (not just MethodInterceptors) as infrastructure classes to ignore
* fixed AbstractAutoProxyCreator to only obtain beans for "interceptorNames" that have been fully initialized already
* reworked AbstractAdvisorAutoProxyCreator's "extendCandidateAdvisors" into "extendAdvisors", operating on sorted list
* renamed AspectJInvocationContextExposingAdvisorAutoProxyCreator to AspectJAwareAdvisorAutoProxyCreator
* removed unintended JDK 1.5 dependency in AspectJExpressionPointcut ("equals"/"hashCode" implementation)
* added "order" attribute to "aspect" tag in AOP schema, allowing to declaratively specify ordering for aspect instances
* reworked aspect ordering to allow aspect instances to depend on beans that in turn get advised by the same aspect
* added @Order annotation support for @AspectJ style aspects, as alternative to implementing the Ordered interface
* redesigned AspectJ support SPI: AspectInstanceFactory, AspectJPointcutAdvisor, AspectJAwareAdvisorAutoProxyCreator
* renamed DelegatePerTargetObjectDelegatingIntroductionInterceptor to DelegatePerTargetObjectIntroductionInterceptor

Package org.springframework.beans
* fixed BeanWrapperImpl to correctly determine generic type for each key in a chain (e.g. "myMap[myKey][myInnerKey]")
* introduced PatternEditor for "java.util.regex.Pattern", automatically registered when running on JDK 1.4 or higher
* Number objects (as property or argument values) are automatically coerced into the target Number type (if necessary)
* added CustomMapEditor for Map-to-Map conversion, with a default instance registered for SortedMap
* added "equals" and "hashCode" implementations to BeanDefinitionHolder
* PropertyValue's copy constructor copies source object as well
* ConstructorArgumentValues copies ValueHolder content when merging, and enforces uniqueness of merged ValueHolders
* reworked BeanComponentDefinition into subclass of BeanDefinitionHolder, exposing aliases on the bean definition
* re-added BeanReferenceFactoryBean, to allow for substituting the target bean name with a placeholder
* UnsatisfiedDependencyException message for multiple matches mentions the names of all matching beans
* improved "scope is not active" error message to explicitly hint at the singleton-refers-to-scoped-bean problem
* factory methods are allowed to return null, with the null value exposed as bean reference
* introduced "isTypeMatch" method on BeanFactory interface, allowing for type checks without actually loading the Class
* AbstractBeanFactory supports alias chaining, with an alias registered for a bean name that is itself an alias
* AbstractBeanFactory uses bean name as cache key for merged bean definitions, to avoid equality matching overhead
* AbstractBeanFactory detects circular references between non-singletons and throws a corresponding exception
* AbstractBeanFactory overrides an inner bean's singleton status from the merged outer bean (potentially a child def)
* removed default for "abstract"/"singleton" attributes in "spring-beans.dtd", for 2.0-style inheritance for inner beans
* added "findAutowireCandidates" template method to AbstractAutowireCapableBeanFactory, superseding "findMatchingBeans"
* DefaultListableBeanFactory excludes beans which are not autowire candidates even before it obtains the instances
* fixed PropertyPlaceholderConfigurer to throw a BeanDefinitionStoreException in case of any circular reference
* fixed PluggableSchemaResolver to accept a null ClassLoader argument (falling back to the default ClassLoader)
* introduced CompositeComponentDefinition for holding nested components (applied e.g. for "aop:config" element)
* introduced "registerComponent" method on ParserContext, for transparent registration of top-level or nested components
* reworked AbstractBeanDefinitionParser to only determine id and build holder for top-level bean definition
* "util:list/set/map" are now allowed as nested elements as well and do not require an id anymore

Package org.springframework.cache
* reworked EhCacheFactoryBean to be based on EHCache 1.2's Ehcache interface rather than the concrete Cache class
* added "blocking" flag to EhCacheFactoryBean, for decorating the cache with EHCache 1.2's BlockingCache
* added "cacheEntryFactory" flag to EhCacheFactoryBean, for decorating with EHCache 1.2's (Updating)SelfPopulatingCache

Package org.springframework.context
* added serialVersionUID to ApplicationEvent, for serialization compatibility with Spring 1.2
* LocaleContextHolder supports standard ThreadLocal as well as InheritableThreadLocal
* EventPublicationInterceptor caches the application event constructor

Package org.springframework.core
* GenericCollectionTypeResolver correctly detects an array type as element type of a generic collection type
* fixed BridgeMethodResolver to always identify an appropriate bridge method (avoid IllegalStateException)
* introduced TaskRejectedException, thrown from a TaskExecutor if it does not accept a given task

Package org.springframework.instrument
* added GlassFishLoadTimeWeaver for GlassFish / Sun Application Server
* refactored Java-5-only AbstractOverridingClassLoader into JDK-1.3-compatible OverridingClassLoader in "core" package

Package org.springframework.jdbc
* introduced AbstractRoutingDataSource and IsolationLevelDataSourceRouter
* JdbcTemplate logs all warnings in case of "ignoreWarnings"=true, not just the first warning in the chain
* added "setQueryTimeout" method to JdbcTemplate and RdbmsOperation, for specifying a timeout outside of a transaction
* removed bind parameter check from SqlOperation, not parsing the SQL anymore at all (relying on JDBC driver instead)

Package org.springframework.jms
* reimplemented JMSException translation to handle subclasses of standard JMSExceptions in a specific fashion as well
* refined AbstractMessageListenerContainer's autodetection of "pubSubDomain" flag to handle WebLogic Topic correctly
* DefaultMessageListenerContainer uses its bean name (if specified) as thread name prefix for its default TaskExecutor

Package org.springframework.jmx
* MBeanExporter uses ObjectName as exposed by returned ObjectInstance after registration (which differs on WebSphere)
* MethodExclusionMBeanInfoAssembler operates correctly in case of no "ignoredMethods" specified

Package org.springframework.mock
* added "isActive()" and "close()" methods to MockHttpServletRequest and MockPortletRequest
* MockHttpServletResponse handles HTTP header names as case-insensitive (analogous to MockHttpServletRequest)
* added "setOutputStreamAccessAllowed" and "setWriterAccessAllowed" methods to MockHttpServletResponse
* unified mock object constructors that take ServletContext/PortletContext/PortalContext arguments
* added all of MockPortletRequest's overloaded constructors to MockActionRequest and MockRenderRequest
* turned AbstractSingleSpringContextTests's "contextKey" and "loadContext" methods non-final again
* AbstractSingleSpringContextTests provides empty default implementation of "getConfigLocations" (not abstract anymore)

Package org.springframework.orm
* reworked Hibernate session synchronization to properly work with WebSphereExtendedJTATransactionLookup on WAS 6.0/6.1
* fixed Hibernate3 LocalSessionFactoryBean's "schemaUpdate" behavior to not run into an IllegalStateException
* LocalContainerEntityManagerFactoryBean detects jar file URL in WebLogic jar entry URLs correctly
* PersistenceAnnotationBeanPostProcessor always injects transactional EntityManager with extended interfaces (if any)
* included OpenJPA support classes (OpenJpaDialect, OpenJpaVendorAdapter), tested against OpenJPA 0.9.6

Package org.springframework.scheduling
* TimerFactoryBean uses its bean name as Timer thread name (on JDK 1.5, falling back to a default Timer on JDK 1.3/1.4)
* deprecated TimerFactoryBean's "createTimer(daemon)" method in favor of "createTimer(name, daemon)"
* ScheduledExecutorFactoryBean does not insist on statically specified ScheduledExecutorTasks anymore
* DelegatingWork/Job/TimerTask exposes the wrapped Runnable implementation through a "getDelegate()" method
* Concurrent/ThreadPoolTaskExecutor and WorkManagerTaskExecutor throw Spring's TaskRejectedException (when appropriate)
* CommonJ TimerManagerFactoryBean cancels all statically registered Timers on shutdown
* updated LocalTaskExecutorThreadPool to be compatible with Quartz 1.6

Package org.springframework.test
* AbstractTransactionalSpringContextTests invokes "onTearDownAfterTransaction" even for a manually completed transaction
* fixed AbstractJpaTests to not keep context reference in cache if context refresh failed

Package org.springframework.transaction
* AbstractPlatformTransactionManager exposes current transaction isolation level via TransactionSynchronizationManager
* AbstractPlatformTransactionManager properly resumes all synchronizations even after suspend or inner begin failure
* active transaction synchronization gets suspended when going from SUPPORTS/NOT_SUPPORTED into REQUIRED/REQUIRES_NEW
* JtaTransactionManager's "doRegisterAfterCompletionWithJtaTransaction" avoids NPE if no current JTA transaction active
* TransactionAttributeEditor does not accept transaction attributes with invalid whitespace anymore
* fixed AnnotationTransactionAspect to not throw a NoTransactionException in case of transaction begin failure
* AnnotationTransactionAspect supports protected and private methods that carry Spring's @Transactional annotation

Package org.springframework.ui
* deprecated FreeMarkerConfigurationFactory's "templateLoaders" property in favor of "pre/postTemplateLoaders"

Package org.springframework.util
* "ObjectUtils.toObjectArray(Object)" returns a given Object[] as-is instead of throwing an IllegalArgumentException
* added "containsWhitespace" method to StringUtils

Package org.springframework.web
* ExpressionEvaluationUtils catches any linkage error for the JSP 2.0 API, always falling back to the Jakarta JSTL
* WebDataBinder explicitly suppresses field marker prefix values in case of "ignoreUnknownFields" switched off
* Servlet/PortletRequestAttributes allow for accessing the session even after the request has been completed
* RequestContextHolder supports standard ThreadLocal as well as InheritableThreadLocal
* DispatcherServlet/Portlet do not expose LocaleContext/RequestAttributes as inheritable for child threads anymore
* added "threadContextInheritable" property to DispatcherServlet and DispatcherPortlet, for explicit choice
* factored out protected "buildLocaleContext" and "cleanupMultipart" methods in DispatcherServlet
* made AbstractHandlerMapping's "getDefaultHandler()" method public
* added public "getHandlerMap()" method to AbstractUrlHandlerMapping, exposing a read-only map of registered handlers
* added public "getUrlMap()" method to SimpleUrlHandlerMapping, to allow for adding or overriding individual entries
* added overloaded "suppressValidation" version with command object argument to BaseCommandController
* added overloaded "isFormChangeRequest" version with command object argument to SimpleFormController
* "spring:message" tag detects single expression argument that resolves to an array and processes it as arguments array
* "form:errors" tag can now be used in a nested JSP outside the scope of a "form:form" tag
* FreeMarkerView exposes all standard FreeMarker hash models now (including session and request parameters)
* FreeMarkerView uses the ObjectWrapper as specified in the FreeMarker configuration, rather than always the default
* FreeMarkerConfigurer always registers ClassTemplateLoader for its own package (rather than the package of a subclass)
* AbstractJasperReportsSingleFormatView only sets parameter Map on JRExporter instance in case of actual parameters
* added "boolean useWriter()" method to AbstractXsltView, allowing to prefer Writer access over OutputStream access
* DispatcherPortlet exposes thread-bound request attributes for render requests as well (not just action requests)
* DispatcherPortlet restores LocaleContextHolder/RequestContextHolder state (e.g. from surrounding DispatcherServlet)


Changes in version 2.0 final (3.10.2006)
----------------------------------------

Package org.springframework.aop
* dropped InvocationContextExposingAdvisorAutoProxyCreator base class

Package org.springframework.beans
* default property editors for primitive wrapper types (Boolean, Integer, etc) turn empty Strings into null values now
* ConstructorArgumentValues supports configuration source objects per argument (e.g. keep track of original XML element)
* ConfigurableBeanFactory's "setParentBeanFactory" throws IllegalStateException if already associated with a parent
* added "getRegisteredScopeNames" and "getRegisteredScope" accessors to ConfigurableBeanFactory interface
* added "getConversationId" method to Scope interface (exposing session id for session scope, null for request scope)
* introduced BeanMetadataElement interface, giving access to config source object (implemented by BeanDefinition etc)
* introduced BeanReference interface, implemented by RuntimeBeanReference as well as RuntimeBeanNameReference
* dropped BeanReferenceFactoryBean; use the available alias mechanisms instead
* reworked CustomScopeConfigurer to only support Scope instances as values for the "scopes" map
* DefaultSingletonBeanRegistry keeps singleton beans in registration order (requires JDK 1.4 or Commons Collections)
* AbstractBeanFactory does not explicitly register a given alias that is equal to the canonical bean name
* dropped BeanDefinitionRegistryBuilder in favor of refined BeanDefinitionReaderUtils convenience methods
* added "getInnerBeanDefinitions()" accessor to ComponentDefinition interface, exposing all relevant inner beans
* added Resource argument to SourceExtractor interface, exposing the defining resource for the given source candidate
* reworked type matching for FactoryBeans, avoiding repeated recreation/destruction through early "getObjectType" checks
* "lookup-method" overrides no-arg method only, to let overloaded variants be implemented in a traditional fashion
* added "setAllowRawInjectionDespiteWrapping" config method to DefaultListableBeanFactory, to enable Spring 1.2 behavior
* added overloaded AbstractSingleBeanDefinitionParser's "doParse" template method with a ParserContext argument
* moved ComponentDefinition, ReaderContext and support classes from "beans.factory.support" to "beans.factory.parsing"
* reworked ReaderEventListener to take AliasDefinition/ImportDefinition argument for alias/import callback, respectively
* revised BeanDefinitionParsingException to take a single Problem argument

Package org.springframework.cache
* EhCacheFactoryBean uses EHCache 1.2's extended Cache constructor to avoid EHCache warning (requires EHCache 1.2 now)

Package org.springframework.core
* AbstractLabeledEnum uses label as "toString()" representation, analogous to JDK 1.5 enums
* StaticLabeledEnum and AbstractGenericLabeledEnum use the code as default label

Package org.springframework.jdbc
* JdbcTemplate uses "PreparedStatement.setObject(index, null)" for null values with unknown SQL type on Informix
* turned visibility of "org.springframework.jdbc.core.StatementCreatorUtils" to public (again)

Package org.springframework.jms
* factored out protected "prepareSharedConnection" template method in AbstractMessageListenerContainer
* AbstractMessageListenerContainer's "durableSubscriptionName" property defaults to the message listener class name
* added "subscriptionDurable" flag to AbstractMessageListenerContainer (set this to "true" to for actual durability!)
* added "defaultResponseQueueName" and "defaultResponseTopicName" properties to MessageListenerAdapter
* added JMS invoker strategy for service-based remoting via JMS: JmsInvokerServiceExporter, JmsInvokerProxyFactoryBean

Package org.springframework.jmx
* MBeanExporter's MBean autodetection properly registers multiple beans even if their instances as equal
* MBeanExporter's "registerManagedResource" registers a given MBean as-is (only wrapping a plain object as ModelMBean)

Package org.springframework.mock
* AbstractSingleSpringContextTest's "loadContextLocations()" declares Exception, to allow subclasses to throw exceptions
* added MockMultipartFile, MockMultipartHttpServletRequest and MockMultipartActionRequest for testing multipart access

Package org.springframework.orm
* added overloaded query/insert/update/delete operations without parameter object to SqlMapClientOperations/Template
* refined Hibernate3 support to detect Hibernate 3.2's FlushMode.MANUAL as well, while remaining compatible with 3.0/3.1
* factored out AbstractSessionFactoryBean base class from Hibernate3 LocalSessionFactoryBean
* Hibernate3 LocalSessionFactoryBean registers filter definitions before loading any mapping files
* ScopedBeanInterceptor for Hibernate3 exposes target class name as Hibernate entity name in case of a CGLIB proxy
* changed the semantics of AbstractJpaVendorAdapter's "generateDdl" flag to create/update (instead of drop-and-recreate)

Package org.springframework.transaction
* clarified @Transactional semantics for JDK/CGLIB proxies as well as for AspectJ
* AbstractPlatformTransactionManager properly propagates an "afterCommit" synchronization exception to the caller
* JtaTransactionManager executes "afterCommit" callbacks even when synchronizing with an existing JTA transaction
* factored out TransactionSynchronizationUtils and JtaAfterCompletionSynchronization helper classes
* introduced CallbackPreferringPlatformTransactionManager interface, to be implemented by callback-loving PTM impls
* TransactionTemplate/TransactionInterceptor automatically detect and use CallbackPreferringPlatformTransactionManager
* fixed MethodMapTransactionAttributeSource to avoid unnecessary reinitialization of method map

Package org.springframework.util
* ClassUtils falls back to the system class loader if the thread context class loader is inaccessible
* all class loading is done via "ClassLoader.loadClass(name)" rather than "Class.forName(name, true, ClassLoader)"

Package org.springframework.validation
* DataBinder matches all field names using their canonical name (for required, allowed and disallowed checks)

Package org.springframework.web
* clarified MultipartFile constract details
* InternalResourceView correctly exports forward attributes on Servlet 2.3- (and preserves existing attributes on 2.4+)
* OptionTag and ErrorsTag implement BodyTag interface directly to work around a bug in WebLogic Server 8.1's JSP engine
* added "renderPhaseOnly" flag to Portlet WebRequestHandlerInterceptorAdapter, allowing to intercept action phase too
* added "applyWebRequestInterceptorsToRenderPhaseOnly" flag to Portlet AbstractHandlerMapping
* factored out AbstractMapBasedHandlerMapping base class from Parameter/PortletMode/PortletModeParameterHandlerMapping
* renamed PortletModeParameterHandlerMapping's "allowDupParameters" property to "allowDuplicateParameters"


Changes in version 2.0 RC4 (17.9.2006)
--------------------------------------

General
* renamed Spring 2.0 DTD to spring-beans-2.0.dtd, while keeping the Spring 1.2.x DTD as compatible spring-beans.dtd
* renamed Spring 2.0 XSDs to spring-beans-2.0.xsd etc, to allow for proper versioning of future additions and changes
* spring-beans-2.0.dtd/xsd does not support singleton="true"/"false" anymore. Use scope="singleton/"prototype" instead!
* added "spring-agent.jar" to "dist/weavers" directory, containing the agent for Spring's InstrumentationLoadTimeWeaver
* JPA support is fully tested against Oracle TopLink Essentials v2 b16 as well as Hibernate EntityManager 3.2.0 CR4
* removed ORM support for Apache OJB from the Spring core distribution. OJB support has been moved to Spring Modules.
* declared all internal ThreadLocal variables as final (to avoid potential class reloading issues)

Package org.springframework.aop
* replaced all use of AOP Alliance AspectException with AopInvocationException/AopConfigException/IllegalStateException
* Cglib2AopProxy exposes additional interfaces of a CGLIB-enhanced target bean on a CGLIB AOP proxy as well
* fixed PointcutAdvisor support classes to avoid eager access to Advice and Pointcut from "hashCode()"/"toString()"
* added "getTargetObject" method to ScopedObject interface, allowing for access to the raw object in the target scope
* fixed AnnotationAwareAspectJAutoProxyCreator to lazily retrieve aspect singletons (only once a pointcut matches)
* fixed @Configurable support to correctly identify the class name even for a CGLIB proxy

Package org.springframework.beans
* fixed BeanWrapperImpl to return a Collection/Map as-is if it is not accessible (e.g. because it is a scoped proxy)
* fixed BeanWrapperImpl to always use a valid read-write type for a converted collection/map (never use original class)
* fixed BeanWrapperImpl to properly resolve even nested generic Collections and Maps (List of Map, Map of List, etc)
* renamed PropertyAccessExceptionsException to PropertyBatchUpdateException and explicitly declared when it is thrown
* added "destroyBean" method to ConfigurableBeanFactory interface, for destroying a given instance based on a bean def
* added support for destruction callbacks to Scope abstraction, driven by a BeanFactory's definition for a scoped bean
* PropertyResourceConfigurer, CustomEditorConfigurer and CustomScopeConfigurer use highest Ordered precendence now
* fixed FieldRetrievingFactoryBean to return "false" from "isSingleton()", since it reobtains the field value every time
* FieldRetrievingFactoryBean and PropertyPathFactoryBean trim whitespace in all given names (even within the String)
* fixed AbstractBeanFactory to accept re-registration of alias for same bean name (-> bean definition overriding)
* reworked AbstractBeanFactory's alias handling to support local alias definitions for a bean in the parent BeanFactory
* AbstractAutowireCapableBeanFactory only logs name and class of eagerly cached bean (does not trigger toString anymore)
* AbstractAutowireCapableBeanFactory catches any exception from BeanPostProcessor and wraps it in BeanCreationException
* DefaultListableBeanFactory's "preInstantiateSingletons" only fetches the FactoryBean instance (instead of its object)
* reworked DefaultListableBeanFactory's beans-by-type lookup to ignore beans that have been overridden by an alias
* inner bean definitions inherit the singleton status of their containing bean even if generated by namespace handler
* fixed method overrides check to accept methods declared on interfaces as well
* removed deprecated BeanFactoryBootstrap class

Package org.springframework.cache
* EhCacheManagerFactoryBean creates an independent CacheManager instance by default now (requires EHCache 1.2)
* added "shared" flag to EhCacheManagerFactoryBean, allowing to explicitly ask for a shared CacheManager instance
* refined EhCacheManagerFactoryBean to use pass in an InputStream instead of a URL for CacheManager initialization

Package org.springframework.context
* exposed AbstractApplicationContext's "registerShutdownHook()" method in ConfigurableApplicationContext interface
* reverted AbstractApplicationContext to not inherit ClassLoader from parent context by default (as up until 2.0 RC1)
* added appropriate "equals"/"hashCode" implementations to DefaultMessageSourceResolvable

Package org.springframework.core
* fixed SpringVersion to return null if the package is not determinable because of ClassLoader restrictions
* ResourceArrayPropertyEditor always preserves order of resource entries, even on JDK 1.3 without Commons Collections
* PathMatchingResourcePatternResolver ignores classpath roots that cannot be resolved as jar or in file system

Package org.springframework.ejb
* introduced EjbAccessException as replacement of AOP Alliance AspectException in local/remote SLSB invoker interceptors

Package org.springframework.instrument
* removed unused AbstractLoadTimeWeaver and AspectJWeavingTransformer classes
* reworked ReflectiveLoadTimeWeaver to cache Method references and consider "getThrowawayClassLoader" as optional
* fixed AbstractOverridingClassLoader to override "loadClass(name, resolve)" and correctly synchronize its variables
* fixed and reworked AbstractOverridingClassLoader's facility for excluding class names
* added OC4JLoadTimeWeaver for Oracle OC4J 10.1.3.1+

Package org.springframework.jca
* SingleConnectionFactory's Connection proxy implements "equals" and "hashCode" based on proxy equality
* factored out "resetConnection", "prepareConnection" and "closeConnection" methods in SingleConnectionFactory

Package org.springframework.jdbc
* refined DataSourceUtils to catch Throwable on "Connection.close()"
* DataSourceUtils uses lower synchronization order for delegating handles (such as from TransactionAwareDataSourceProxy)
* SingleConnectionDataSource's Connection proxy implements "equals" and "hashCode" based on proxy equality
* factored out "resetConnection", "prepareConnection" and "closeConnection" methods in SingleConnectionDataSource
* CommonsDbcpNativeJdbcExtractor supports original Commons DBCP as well as Tomcat 5.5's relocated version
* revised JBossNativeJdbcExtractor to unwrap ResultSet even for WrappedResultSet subclasses (requires JBoss 3.2.4+ now)
* DataSourceLookup throws DataSourceLookupFailureException instead of DataAccessResourceFailureException
* added SingleDataSourceLookup, exposing a single given DataSource for any data source name
* added AbstractInterruptibleBatchPreparedStatementSetter base class, with single "setValuesIfAvailable" callback method
* added default SQL error codes for the Apache Derby database

Package org.springframework.jms
* SingleConnectionFactory's Connection proxy implements "equals" and "hashCode" based on proxy equality
* SingleConnectionFactory's Connection proxy ignores "stop()" calls as well (not just "close()" calls)
* factored out "resetConnection", "prepareConnection" and "closeConnection" methods in SingleConnectionFactory
* added "exceptionListener" and "reconnectOnException" properties to SingleConnectionFactory
* JmsTemplate and AbstractMessageListenerContainer call "stop()" on a Connection before closing it (if started before)
* DefaultMessageListenerContainer does not block on startup until it can establish a shared Connection (if necessary)
* added support for synchronized local JMS transactions (alongside some other main transaction) to JmsTemplate
* added TransactionAwareConnectionFactoryProxy, including support for synchronized local JMS transactions

Package org.springframework.orm
* iBATIS support works correctly with "useTransactionAwareDataSource" and JTA transaction resume with subsequent access
* reintroduced default SQLExceptionTranslator in JdoAccessor/JdoTransactionManager/LocalPersistenceManagerFactoryBean
* HibernateTemplate exposes Session proxies that implement the SessionImplementor interface as well now (if possible)
* exception translation for Hibernate3 turns PropertyValueException into Spring's DataIntegrityViolationException
* exception translation for Hibernate3 keeps original JDBCException as root cause of Spring's HibernateJdbcException
* added ScopedBeanInterceptor for Hibernate3, exposing the raw target class as entity name in case of a scoped proxy
* LocalPersistenceManagerFactoryBean and JdoTemplate perform full exception translation even for reflective calls
* expose underlying PersistenceProvider instance in EntityManagerFactoryInfo (if available)
* added "persistenceProvider" property to AbstractEntityManagerFactoryBean, for using a shared PersistenceProvider
* JpaVendorAdapter exposes a shared PersistenceProvider instance rather than just the PersistenceProvider class
* added PersistenceUnitManager interface and DefaultPersistenceUnitManager implementation (in "jpa.persistenceunit")
* added "persistenceUnitManager" bean property to LocalContainerEntityManagerFactoryBean (default is internal manager)
* "dataSourceLookup"/"dataSources" configuration is now available on DefaultPersistenceUnitManager instead of LCEMFB
* "postProcessPersistenceUnitInfo" hook method is now available on DefaultPersistenceUnitManager instead of LCEMFB
* introduced PersistenceUnitPostProcessor interface, to be registered on DefaultPersistenceUnitManager or LCEMFB
* introduced MutablePersistenceUnitInfo base class, to turn SpringPersistenceUnitInfo to package-protected again
* PersistenceUnitReader searches for "classpath*:**/SCHEMA_NAME" last, and catches and logs any IOException thrown
* added support for custom JPA properties to SharedEntityManagerBean/JpaTransactionManager/JpaInterceptor/JpaTemplate
* added support for custom JPA properties to OpenEntityManagerInViewInterceptor
* PersistenceAnnotationBeanPostProcessor supports @PersistenceContext's "properties", passed into "createEntityManager"
* PersistenceAnnotationBeanPostProcessor does not cache EntityManagerFactory instances anymore, to allow for new EMFs
* PersistenceAnnotationBeanPostProcessor throws IllegalStateException instead of NoSuchBeanDefinitionException

Package org.springframework.mock
* added support for attributes which implement the Servlet 2.3 HttpSessionBindingListener interface to MockHttpSession

Package org.springframework.remoting
* added service URL check to UrlBasedRemoteAccessor, in the form of an InitializingBean implementation
* refined cache synchronization in (Jndi)RmiClientInterceptor and JaxRpcPortClientInterceptor
* reworked RmiClientInterceptor to throw RemoteLookupFailureException instead of MalformedURLException/RemoteException
* reworked Hessian/BurlapClientInterceptor to throw RemoteLookupFailureException instead of MalformedURLException
* Hessian/BurlapClientInterceptor configure a Hessian/BurlapProxyFactory directly (dropped CauchoRemoteAccessor)
* added "serializerFactory" and "sendCollectionType" properties to HessianClientInterceptor/ProxyFactoryBean
* added "serializerFactory" property to HessianServiceExporter, applied to HessianInput/Output objects
* HessianServiceExporter is compatible with the Hessian 2 protocol (Hessian version 3.0.20+) as well as classic Hessian

Package org.springframework.scheduling
* Spring's Quartz support requires Quartz 1.5 or higher now
* added support for Quartz 1.5 JobFactory to SchedulerFactoryBean, through "jobFactory" bean property
* SchedulerFactoryBean uses AdaptableJobFactory as default, which also supports Runnables as job class
* added SpringBeanJobFactory as subclass of AdaptableJobFactory, as JobFactory replacement for QuartzJobBean
* JobDetailBean allows any job class to be specified, to allow a JobFactory to adapt any class to the Job interface
* added "jobDataAsMap" property to Simple/CronTriggerBean, supporting the Quartz 1.5 notion of trigger-specific job data
* MethodInvokingJobDetailFactoryBean always creates durable JobDetails (just like it also sets the volatile flag)

Package org.springframework.scripting
* fixed BshScriptFactory to correctly handle void, null, and primitive return values
* fixed JRubyScriptFactory to handle "toString()" invocations locally on the JRuby object proxy

Package org.springframework.test
* AbstractSpringContextTests calls ConfigurableApplicationContext's "registerShutdownHook()" for each context instance
* factored out concrete loading of a single context from specified config locations to AbstractSingleSpringContextTests
* restricted visibilities and stronger use of final in AbstractDependencyInjectionSpringContextTests

Package org.springframework.transaction
* added "afterCommit" callback to TransactionSynchronization interface
* fixed TransactionAttributeSourceAdvisor to avoid potential NPE in TransactionAttributeSourcePointcut's "hashCode"

Package org.springframework.validation
* added "getPropertyEditorRegistry" method to BindingResult interface, for re-registering custom editors
* AbstractBindingResult's "addAllErrors" only accepts Errors instance with same object name
* added appropriate "toString" implementation to AbstractBindingResult
* added appropriate "equals"/"hashCode" implementations to AbstractBindingResult and BindException
* added appropriate "equals"/"hashCode" implementations to ObjectError and FieldError

Package org.springframework.web
* ExpressionEvaluationUtils falls back to Jakarta JSTL if JSP 2.0 ExpressionEvaluator API present but not implemented
* added support for attribute destruction callbacks to RequestAttributes abstraction + Servlet/PortletRequestAttributes
* introduced "requestCompleted()" method in AbstractRequestAttributes base class for Servlet/PortletRequestAttributes
* adapted TagUtils to accept subclassed parent tag as expected ancestor too (e.g. OptionTag within subclassed SelectTag)
* AbstractJasperReportsView converts exporter parameter values "true"/"false" to Boolean.TRUE/FALSE
* removed deprecated FormatHelper from XSLT view package
* fixed various JSP form tag issues


Changes in version 2.0 RC3 (10.8.2006)
--------------------------------------

General
* spring.jar does not include Portlet support anymore (add spring-portlet.jar to your classpath if needed)

Package org.springframework.aop
* factored out AbstractGenericPointcutAdvisor (with a configurable Advice) as subclass of AbstractPointcutAdvisor
* fixed AbstractAdvisorAutoProxyCreator to ignore Advisors for which "getBean" throws a BeanCurrentlyInCreationException
* fixed AnnotationAwareAspectJAutoProxyCreator to explicitly ignore FactoryBeans when looking for aspect beans
* reworked AspectJ auto-proxy creation to avoid the creation of unnecessary proxies
* renamed ScopedObject's "remove" method to "removeFromScope", to avoid conflicts with methods on the target class

Package org.springframework.beans
* added overloaded "setPropertyValues" variant with additional "ignoreInvalidFields" flag to PropertyAccessor
* fixed BeanWrapperImpl to properly catch and wrap conversion failures for map keys/values in TypeMismatchExceptions
* introduced TypeConverter interface, implemented by BeanWrapperImpl, plus separate SimpleTypeConverter implementation
* refined PropertyAccessExceptionsException to show nested details even when wrapped in a standard JDK exception
* reworked ArgumentConvertingMethodInvoker to use a TypeConverter and allow the converter to be accessed/overridden
* BeanFactoryUtils returns bean names in order of definition even for merged name arrays (in case of ancestor factories)
* redefined BeanFactoryUtils' "countBeans/beanNamesIncludingAncestors" to build on "getBeanNamesOfType(Object.class)"
* reworked InstantiationAwareBeanPostProcessor's "postProcessPropertyValues" method to take a PropertyDescriptor array
* RequiredAnnotationBeanPostProcessor explicitly ignores special setter methods (such as "setBeanName"/"setBeanFactory")
* added "copyConfigurationFrom" method to ConfigurableBeanFactory, allowing to create a factory with same configuration
* exposed "getScope" and "setScope" methods on BeanDefinition interface, allowing a post-processor to override the scope
* DefaultSingletonBeanRegistry disallows the creation (or recreation) of singletons during "destroySingletons()" phase
* fixed AbstractBeanFactory to only invoke BeanPostProcessor for objects returned from FactoryBeans if non-null
* fixed AbstractBeanFactory to throw BeanCurrentlyInCreationException on null from non-fully-initialized FactoryBean
* AbstractBeanFactory's "getType" catches BeanCreationExceptions for a FactoryBean, treating it as "type unknown"
* AbstractBeanFactory catches an exception thrown from a FactoryBean's "getObjectType", treating it as "type unknown"
* AbstractAutowireCapableBeanFactory detects whether it injected raw instances of beans that eventually got wrapped
* refined AbstractAutowireCapableBeanFactory to only adapt inner bean names for uniqueness in case of a singleton
* refined AbstractAutowireCapableBeanFactory to reject an inner bean marked as singleton contained in a non-singleton
* DefaultListableBeanFactory's non-eager lookup by type finds matches for lazy-init beans as long as class is loadable
* added "setAllowEagerClassLoading" method to DefaultListableBeanFactory, to allow for turning off eager class loading
* restored Spring 1.2 compatibility for default-lazy-init="true", with respect to detection of special beans by type
* "idref" tag in XML bean definitions gets turned into a RuntimeBeanNameReference, which gets validated on bean creation
* XML definitions for inner beans receive a default scope based on their containing bean (prototype for a non-singleton)
* DefaultBeanDefinitionDocumentReader does not accept bean definitions with both "scope" and "singleton" values anymore

Package org.springframework.context
* added "isActive()" method to the ConfigurableApplicationContext interface
* AbstractRefreshableApplicationContext disallows access to underlying BeanFactory after a "close()" call
* avoid AbstractRefreshableApplicationContext deadlock in case of BeanFactory access in a multi-threaded destroy method

Package org.springframework.core
* fixed PathMatchingResourcePatternResolver to prevent eternal recursion in case of invalid prefix with pattern symbols

Package org.springframework.dao
* factored out reusable PersistenceExceptionTranslationInterceptor from PersistenceExceptionTranslationAdvisor

Package org.springframework.jdbc
* worked around "oracle.sql.DATE" problem on certain Oracle driver versions, extracting it as timestamp when appropriate
* check for ResultSetSupportingSqlParameter superclass instead of SqlOutParameter and SqlReturnResultSet subclasses
* factored out Spring/JtaLobCreatorSynchronization classes from Hibernate AbstractLobType to "jdbc.support.lob" package

Package org.springframework.jms
* introduced CachingDestinationResolver interface, implemented by JndiDestinationResolver (allowing to clear the cache)
* JmsTransactionManager starts the transactional Session's Connection early (at transaction begin) rather than on demand
* optimized JmsTemplate's resource handling to reuse the obtained JMS Connection/Session within a JTA transaction
* added "clientId" property to SingleConnectionFactory(102), for assigning a client id to the underlying Connection
* added "clientId" property to AbstractMessageListenerContainer, for assigning a client id to the underlying Connection
* AbstractMessageListenerContainer supports individual Connections per listener as alternative to a shared Connection
* DefaultMessageListenerContainer obtains all JMS resources fresh by default in case of "transactionManager" specified
* added "cacheLevel"/"cacheLevelName" property to DefaultMessageListenerContainer, for overriding the default caching
* DefaultMessageListenerContainer is able to recover from a broken Connection (both with and without cached Connection)
* DefaultMessageListenerContainer is able to recover from a broken Destination if obtained via JndiDestinationResolver
* DefaultMessageListenerContainer waits until all listener tasks have completed before returning from "destroy"
* added "taskExecutor" property to SimpleMessageListenerContainer, allowing to execute listener in different thread
* added protected "buildListenerArguments" template method to MessageListenerAdapter, allowing for multiple arguments

Package org.springframework.orm
* refined iBATIS SqlMapClientTemplate to allow for nested calls to same SqlMapSession (checking "getCurrentConnection")
* reworked Hibernate JTA synch to expose beforeCompletion exceptions to the caller (via SpringJtaSynchronizationAdapter)
* updated TopLink API jar to be fully compatible with the official TopLink 10.1.3 release jar (can be replaced with it)
* Hibernate3 and TopLink LocalSessionFactoryBeans implement the PersistenceExceptionTranslator interface now
* reworked Hibernate3 and TopLink exception translation to only apply a SQLExceptionTranslator if explicitly specified
* JDO LocalPersistenceManagerFactoryBean implements the PersistenceExceptionTranslator interface now
* DefaultJdoDialect only applies a SQLExceptionTranslator if explicitly specified (rely on default JDO translation else)
* removed warning for read-only from JdoTransactionManager/JpaTransactionManager, since a vendor dialect may support it
* factored out overridable "createEntityManager" template methods in OpenEntityManagerInViewFilter/Interceptor
* EntityManagerFactoryInfo interface does not extend PersistenceExceptionTranslator anymore (only JpaDialect does)
* SpringPersistenceUnitInfo is public to allow for post-processing in LocalContainerEntityManagerFactoryBean subclass
* added "determinePersistenceUnitInfo/postProcessPersistenceUnitInfo" methods to LocalContainerEntityManagerFactoryBean
* reworked OpenSession/PersistenceManager/EntityManagerInViewInterceptor to build on WebRequestInterceptor abstraction
* dropped PortletOpenSession/PersistenceManager/EntityManagerInViewInterceptor in favor of WebRequestInterceptor model

Package org.springframework.mock
* MockHttpServletRequest handles HTTP header names as case-insensitive

Package org.springframework.remoting
* added "registryClientSocketFactory" bean property to RmiClientInterceptor/RmiProxyFactoryBean
* added dedicated "prepare()" method to JndiRmiServiceExporter

Package org.springframework.scheduling
* renamed SchedulingTaskExecutor's "isShortLivedPreferred" method to "prefersShortLivedTasks"

Package org.springframework.scripting
* ScriptFactoryPostProcessor supports all callbacks that containing BeanFactory supports (e.g. ApplicationContextAware)

Package org.springframework.test
* AbstractTransactionalSpringContextTests only tries to end transaction on "tearDown" if the transaction is still active

Package org.springframework.transaction
* fixed AbstractPlatformTransactionManager to not invoke commit synchronization in case of propagated rollback-only flag
* added SpringJtaSynchronizationAdapter, exposing JTA Synchronization ifc on top of a Spring TransactionSynchronization
* added "timeout" attribute to Transactional annotation, allowing to specify a timeout in seconds within the annotation

Package org.springframework.util
* optimized "ObjectUtils.nullSafeToString" implementation to return a given String right away

Package org.springframework.validation
* added "ignoreInvalidFields" flag to DataBinder, allowing to ignore inaccessible fields (null value in nested path)

Package org.springframework.web
* redefined Servlet/PortletRequestUtils to treat empty parameter values as valid for Strings ("") and booleans (false)
* moved RequestScope/SessionScope and RequestContextListener from "web.context.scope" to "web.context.request"
* added WebRequest abstraction, with ServletWebRequest and PortletWebRequest implementations
* added WebRequestInterceptor interface, for generic request interceptors (independent of Servlet/Portlet)
* added support for WebRequestInterceptors to Servlet/Portlet MVC HandlerMappings (through "interceptors" property)
* renamed PortletBean to GenericPortletBean
* HttpServletBean/GenericPortletBean override "getXXXXletName"/"getXXXXletContext" to return null when no config set yet
* added "defaultLocale" property to CookieLocaleResolver and SessionLocaleResolver, for fallback to an explicit locale


Changes in version 2.0 RC2 (6.7.2006)
-------------------------------------

General
* added showcases to "samples" directory
* various documentation clarifications
* restored compatibility with IBM JDK 1.3 (with respect to referring to constants defined in implemented interfaces)

Package org.springframework.aop
* JdkDynamicAopProxy delegates "equals"/"hashCode" calls to target if "equals"/"hashCode" is defined on proxy interface
* Advisors used in combination with an advisor auto-proxy creator can now use beans which get adviced themselves
* moved AbstractAutoProxyCreator's "shouldSkip" check from "isInfrastructureClass" to "postProcessAfterInitialization"
* reworked AbstractAdvisorAutoProxyCreator to avoid fetching of all candidate Advisors on startup
* AbstractAdvisorAutoProxyCreator performs BeanFactory-based prototype cycle check instead of control flow check

Package org.springframework.beans
* factored out SingletonBeanRegistry interface from ConfigurableBeanFactory interface
* factored out DefaultSingletonBeanRegistry base class from AbstractBeanFactory
* added "isCurrentlyInCreation" method to ConfigurableBeanFactory interface
* reworked AbstractBeanFactory to allow for prototype cycle check for current thread
* fixed AbstractBeanFactory's "isBeanNameUsed" to correctly synchronize access to "dependentBeanMap"
* AbstractAutowireCapableBeanFactory creates "depends-on" beans even before resolving a bean's class
* AbstractAutowireCapableBeanFactory does not apply bean post-processors to "synthetic" beans
* AbstractAutowireCapableBeanFactory accepts null values returned from BeanPostProcessors
* added "synthetic" flag to AbstractBeanDefinition, for marking beans as internal infrastructure beans
* XmlBeanDefinitionReader uses given ResourceLoader/ApplicationContext's ClassLoader for schema resolution
* MethodInvokingFactoryBean returns "void.class" instead of "VoidType.class" for void methods

Package org.springframework.context
* AbstractApplicationContext uses the ClassLoader of its parent ApplicationContext (if any) as default
* turned ApplicationObjectSupport's "getApplicationContext()" method from public to protected (for consistency)

Package org.springframework.core
* NestedXxxException classes build nicer messages in case of root cause with no base exception message
* added "getClassLoader()" method to ResourceLoader, exposing the ClassLoader for direct access
* adapted PathMatchingResourcePatternResolver to always use the ResourceLoader's ClassLoader
* added "getResourcePatternResolver(ResourceLoader)" utility method to ResourcePatternUtils

Package org.springframework.jdbc
* reworked JDBC 3.0 savepoint support to use self-generated savepoint names (to avoid unnamed savepoints on IBM DB2)
* removed "S0" from default SQL state list in SQLStateSQLExceptionTranslator: it does not mean bad SQL on MS SQL Server
* SqlQuery and SqlUpdate correctly handle a named parameter with a list of values now

Package org.springframework.jms
* added support for durable subscriptions to message listener containers, driven by "durableSubscriptionName" property

Package org.springframework.jmx
* MBeanRegistrationSupport only logs a warning (no error) when an MBean does not exist anymore when trying to unregister

Package org.springframework.orm
* LocalContainerEntityManagerFactoryBean detects and reads all "META-INF/persistence.xml" files on the class path
* LocalContainerEntityManagerFactoryBean determines persistence unit root URL based on each "persistence.xml" location
* JdoTransactionManager uses JDO 2.0's rollback-only facility if available
* JpaTransactionManager uses JPA's rollback-only facility now, for better integration with the persistence provider
* JpaTransactionManager throws UnexpectedRollbackException in case of JPA RollbackException thrown from commit
* refined JPA exception translation to throw EmptyResultDataAccessException in case of JPA NoResultException
* refined JPA exception translation to throw IncorrectResultSizeDataAccessException in case of JPA NonUniqueResult
* refined JPA exception translation to throw DataIntegrityViolationException in case of JPA EntityExistsException
* refined JPA exception translation to throw InvalidDataAccessResourceUsageException in case of JPA TransactionRequired
* refined Hib exception translation to throw InvalidDataAccessApiUsageException in case of Hibernate ObjectDeleted
* refined Hib exception translation to throw IncorrectResultSizeDataAccessException in case of Hibernate NonUniqueResult

Package org.springframework.remoting
* JaxRpcPortClientInterceptor/JaxRpcPortProxyFactoryBean allow for direct "customPropertyMap[myKey]" access

Package org.springframework.scheduling
* Quartz SchedulerFactoryBean uses given "nonTransactionalDataSource" as default DataSource if no "dataSource" specified

Package org.springframework.test
* AbstractTransactionalSpringContextTests properly ends a started transaction early if "onSetupInTransaction" fails

Package org.springframework.transaction
* JtaTransactionManager explicitly only calls "UserTransaction.setRollbackOnly()" if the transaction is still active

Package org.springframework.validation
* clarified that "Errors.reject" always registers a global error for the entire target object
* "Errors.rejectValue" now accepts an empty field name to indicate the current object itself rather than a field of it

Package org.springframework.web
* added/moved constants for all Servlet spec include/forward request attributes to WebUtils
* added "getWebApplicationContext"/"getAutowireMode"/"getDependencyCheck" methods to Autowiring(Tiles)RequestProcessor
* DispatcherServlet logs its page-not-found warnings with the actual lookup URL even for import requests
* InternalResourceView exposes all forward request attributes (delegating to "WebUtils.exposeForwardRequestAttributes")
* RequestContext's "getContextPath()" always exposes the context path for the originating request now
* added "getQueryString" method to RequestContext, exposing query string for originating request (even after forward)
* fixed various JSP form tag issues


Changes in version 2.0 RC1 (20.6.2006)
--------------------------------------

General
* completed reference documentation
* fixed various documentation issues
* spring.jar includes all standard modules except for the Hibernate2 support (which has been superseded by Hibernate3)
* basic download only contains reference PDF: no HTML variant and API docs anymore (only in -with-dependencies now!)

Package org.springframework.aop
* fixed AspectJAutoProxyCreator to avoid NPE in case of abstract beans without bean class specified

Package org.springframework.beans
* FactoryBeans are allowed to return null values now, with FactoryBeanNotInitializedException to be thrown by themselves
* fixed AbstractBeanFactory's "getType" to avoid NPE in case of a bean definition without bean class
* AbstractBeanFactory uses inverse order of bean instantiation for shutdown even without dependency relationships
* fixed DefaultListableBeanFactory to not call "FactoryBean.getObject()" for prototype if bean class not resolved yet
* avoid ClassNotFoundException in case of explicit type specified on "value" tag
* resolve target type of a TypedStringValue lazily, consistent with the handling of bean classes
* moved parsing-related support classes from "beans.factory"/"beans.factory.support" to "beans.factory.parsing"

Package org.springframework.core
* StaticLabeledEnum offers its "readResolve" method with protected visibility, to kick in for subclasses as well

Package org.springframework.ejb
* fixed AbstractSlsbInvokerInterceptor to reobtain createMethod in case of cacheHome="false"/lookupHomeOnStartup="true"

Package org.springframework.jms
* added "cacheSessions" flag to DefaultMessageListenerContainer, to be turned off for reobtaining Sessions per receive
* added "handleListenerSetupFailure" callback to DefaultMessageListenerContainer, a sibling of "handleListenerException"
* DefaultMessageListenerContainer invokes a specified JMS ExceptionListener for listener setup failures as well

Package org.springframework.orm
* removed LocalSessionFactoryBean's early "buildMappings" call to avoid side effects with AnnotationSessionFactoryBean
* HibernateTransactionManager explicitly disconnects a pre-bound Session after a transaction (on Hibernate 3.1+)
* Hibernate Open-Session-In-View's deferred close mode always switches its Sessions to FlushMode.NEVER until closing
* refined HibernateTemplate to never register a Session for deferred close in case of "alwaysUseNewSession"=true
* removed special Session reconnection check for Hibernate 3.1 RC1
* renamed ContainerEntityManagerFactoryBean to "LocalContainerEntityManagerFactoryBean"
* fixed LocalContainerEntityManagerFactoryBean to always look for "META-INF/persistence.xml" in class path by default
* JpaTransactionManager autodetects the JDBC DataSource of the target EntityManagerFactory

Package org.springframework.samples
* added JPA support to PetClinic: EntityManagerClinic and JpaTemplateClinic, with TopLink Essentials as default provider

Package org.springframework.scheduling
* added "jobListenerNames" bean property to MethodInvokingJobDetailFactoryBean

Package org.springframework.scripting
* fixed "spring-lang.xsd" to allow for multiple nested property elements

Package org.springframework.web
* fixed (the deprecated) BindUtils to not call "ValidatorUtils.invokeValidator" if no Validator given
* fixed Servlet/PortletRequestAttributes to correctly update accessed attributes
* turned WebContentGenerator's method constants public again, for calling "setSupportedMethods" in subclasses
* FrameworkPortlet now catches all RuntimeException/Errors and rethrows them as PortletException
* PortletContentGenerator response preparation operates on RenderRequest and RenderResponse only
* changed Portlet HandlerInterceptor interface to have explicit callback methods for action/render requests
* Portlet HandlerInterceptorAdapter allows to adapt the specific action/render callback methods to general callbacks
* Portlet OpenXxxInViewInterceptors just wrap the render request, not the action request anymore
* VelocityView and FreeMarkerView do not override content type previously set on HTTP response anymore (on Servlet 2.4+)
* moved content type handling from VelocityView and FreeMarkerView up to AbstractTemplateView
* fixed various JSP form tag issues


Changes in version 2.0 M5 (1.6.2006)
------------------------------------

General
* spring.jar is now all-encompassing, including all modules (with the exception of mock and aspects)
* spring-aop.jar does not contain AOP Alliance interfaces (in contrast to spring.jar); explicitly add aopalliance.jar

Package org.springframework.aop
* reworked support for scoped proxies to build on scoping support in core BeanFactory
* removed incomplete support for ScopedObject handles and persistent scopes
* removed deprecated AttributesPooling/Prototype/ThreadLocalTargetSourceCreator
* removed unused Class argument from ParameterNameDiscoverer's "getParameterNames(Method)"
* reworked ProxyFactoryBean's "setProxyInterfaces" method from String array to Class array
* reworked ProxyFactoryBean to use the ClassLoader passed in through BeanClassLoaderAware
* factored out AbstractSingletonProxyFactoryBean from TransactionProxyFactoryBean

Package org.springframework.beans
* introduced lazy loading (and lazy validation) of bean classes in standard bean factories and bean definition readers
* redefined ListableBeanFactory's "includeFactoryBeans" flag for "getBean(Name)sOfType" into "allowEagerInit"
* introduced BeanClassLoaderAware interface, for passing the factory's class loader to beans that resolve class names
* reworked all FactoryBeans that resolve class names to leverage the BeanClassLoaderAware mechanism
* PropertyPlaceholderConfigurer is able to resolve placeholders in lazily loaded bean class names
* added support for PropertyEditorRegistrars to ConfigurableBeanFactory, for non-synchronized usage of custom editors
* CustomEditorConfigurer supports PropertyEditorRegistrars, to be applied to its containing BeanFactory
* reworked ConfigurableBeanFactoryUtils into ResourceEditorRegistrar
* added "postProcessPropertyValues" callback method to InstantiationAwareBeanPostProcessor interface
* reworked RequiredBeanFactoryPostProcessor into RequiredAnnotationBeanPostProcessor, properly handling bean inheritance
* added scoping support to core BeanFactory, for creating raw target beans in arbitrary scopes
* added "scope" attribute at bean level to XML bean definition format, superseding singleton="true"/"false"
* renamed XmlBeanDefinitionReader's (Default)XmlBeanDefinitionParser SPI to (Default)BeanDefinitionDocumentReader
* renamed XmlBeanDefinitionParserHelper to BeanDefinitionParserDelegate
* re-introduced Spring 1.2 XmlBeanDefinitionParser SPI for backwards compatibility in case of "parserClass" specified

Package org.springframework.context
* synchronized AbstractApplicationContext's "refresh()" method, for hot refreshing in concurrent environments

Package org.springframework.core
* renamed GenericsHelper to GenericCollectionTypeResolver, more clearly reflecting its actual role
* AnnotationUtils discovers annotations inherited via bridge methods now, through the new BridgeMethodResolver

Package org.springframework.dao
* added generic PersistenceExceptionTranslator mechanism, supported by the JpaDialect abstraction for JPA providers
* added PersistenceExceptionTranslationPostProcessor, for automatic translation to DataAccessExceptions

Package org.springframework.instrument
* introduced class instrumentation support based on standard ClassFileTransformers (used by JPA SPI support)
* introduced LoadTimeWeaver abstraction for instrumentation-aware ClassLoaders plus throwaway ClassLoader support

Package org.springframework.jdbc
* refined default SQL error codes for DB2 and HSQLDB
* removed deprecated special check for DB2 error codes - always use "DB2*" as database product name for DB2
* reworked SimpleJdbcDaoSupport/NamedParameterJdbcDaoSupport initialization to work without afterPropertiesSet as well

Package org.springframework.orm
* Hibernate3 LocalSessionFactoryBean explicitly calls "buildMappings()" to prepare Configuration metadata for subclasses
* fixed JpaTransactionManager to not cause an NPE when the creation of a transactional EntityManager raises an exception
* fixed JpaInterceptor to actually bind a new EntityManager to the thread again (worked in M3, didn't work in M4)
* fixed EntityManagerFactoryUtils's "convertJpaAccessException" to always return rather than throw DataAccessExceptions
* added full support for JPA SPI, in the form of a ContainerEntityManagerFactoryBean with LoadTimeWeaver support
* added JpaVendorAdapter abstraction, with out-of-the-box TopLinkJpaVendorAdapter and HibernateJpaVendorAdapter
* added PersistenceAnnotationPostProcessor, processing EJB3-style @PersistenceUnit and @PersistenceContext annotations

Package org.springframework.test
* added support classes for annotation-based tests in general and for JPA-based tests in particular

Package org.springframework.transaction
* added "failEarlyOnGlobalRollbackOnly" flag to AbstractPlatformTransactionManager, for consistent fail-early behavior

Package org.springframework.util
* "ClassUtils.isPresent" logs exception message only instead of full stacktrace for classes that haven't been found
* introduced PatternMatchUtils, for unified matching of Spring's typical "xxx*", "*xxx" and "*xxx*" pattern styles

Package org.springframework.validation
* reworked ValidationUtils to not accept a null Validator for "invokeValidator" anymore
* added "setDisallowedFields" method to DataBinder, for specifying disallowed fields instead of allowed fields

Package org.springframework.web
* reworked mvc RequestHandler interface into HttpRequestHandler in root web package, to minimize module dependencies
* reworked RequestMethodNotSupportedException into HttpRequestMethodNotSupportedException in root web package
* reworked SessionRequiredException into HttpSessionRequiredException and PortletSessionRequiredException
* added HttpRequestHandlerServlet to "web.context.support" package, for exposing a single HttpRequestHandler bean
* dropped "getCause()" method from NestedServletException, to avoid conflicts with JDK-1.4-based ServletException class
* added support for request and session scopes to all WebApplicationContexts
* moved StaticPortletApplicationContext from test tree over to main source tree
* fixed SimpleMappingExceptionResolver to use local "exceptionMappings" reference
* factored out reusable "prepareBinder" method in BaseCommandController, for easier overriding of "createBinder"
* InternalResourceView exposes Servlet 2.4 forward request attributes even for Servlet 2.3-
* added "getOriginatingRequestUri" method to UrlPathHelper, detecting the Servlet 2.4 request URI attribute in a forward
* refined JSP form tag library


Changes in version 2.0 M4 (23.4.2006)
-------------------------------------

General
* included "tiger" and "aspectj" source trees in source build (spring-src.zip)
* included spring-src.zip in both release distributions as a convenience
* basic distribution doesn't include build script and exploded source trees anymore

Package org.springframework.aop
* fixed Cglib2AopProxy to register an explicitly given ClassLoader with the CGLIB Enhancer
* deprecated Commons Attributes based TargetSourceCreators (PoolingAttribute, PrototypeAttribute, ThreadLocalAttribute)
* fixed CustomizableTraceInterceptor to expose the actual invocation time for exception messages
* added "trackAllInvocations" flag to JamonPerformanceMonitorInterceptor, for gathering statistics without logging
* auto-proxying works for objects created by FactoryBeans as well (rather than just on FactoryBean instances themselves)
* BeanNameAutoProxyCreator always proxies exposed objects, with "&beanName" syntax for proxying FactoryBean instances
* renamed "aspectj.autoproxy.AspectJAutoProxyCreator" to "aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"

Package org.springframework.beans
* BeanUtils throws explicit BeanInstantiationException in case of bean instantiation failure
* deprecated BeanUtils's "isAssignable" methods in favor of new "isAssignable"/"isAssignableValue" methods on ClassUtils
* fixed BeanWrapperImpl to convert a null input for an array type to a null value rather than an array with null element
* fixed BeanWrapperImpl to apply property-specific editors to elements even for collections without generic type
* refined BeanWrapperImpl to apply map key conversion on property access as well, not just on property setting
* refined BeanWrapperImpl to inject original collections as far as possible (i.e. unless element conversion necessary)
* refined BeanWrapperImpl to correctly detect element type of collections with parameterization in superclass/interface
* BeanWrapperImpl does not register a StringArrayPropertyEditor by default anymore
* fixed BeanWrapperImpl to convert a ManagedProperties instance into a plain Properties instance before applying it
* fixed BeanWrapperImpl to fall back to approximate collection/map type if it cannot reinstantiate given collection/map
* fixed BeanArrayPropertyEditor to translate null value to null byte array
* added CharArrayPropertyEditor to translate String value into char array
* CharacterEditor supports unicode specification passed in as literal String, for example "\u00F6"
* refined FileEditor to treat absolute file paths as straight files (no ResourceLoader), for Spring 1.2 compatibility
* PropertyPlaceholderConfigurer catches and logs SecurityException on system property access, continuing resolution
* FieldRetrievingFactoryBean is able to access non-public fields as well
* added "propertiesArray" bean property to PropertiesFactoryBean, for merging multiple local Properties instances
* fixed AbstractBeanFactory to avoid potential deadlock on singleton destruction with concurrent singleton creation
* AbstractBeanFactory always registers inner beans with a unique name, adapting overlapping names accordingly
* AbstractBeanFactory caches objects returned from "FactoryBean.getObject()" now, in case of a singleton object
* BeanPostProcessor's "postProcessAfterInitialization" gets applied to objects created by FactoryBeans as well
* BeanPostProcessor's "postProcessAfterInitialization" gets applied after "postProcessBeforeInstantiation" as well
* fixed DefaultListableBeanFactory to not preinstantiate bean definition if explicit singleton object already registered
* added "loadBeanDefinitions(String[] locations)" method to BeanDefinitionReader and AbstractBeanDefinitionReader
* added Requiered annotation and RequiredBeanFactoryPostProcessor, allowing to enforce required bean properties

Package org.springframework.context
* refined AbstractMessageSource to resolve arguments eagerly, for message defined in parent and msg arg defined in child
* added (String[], Class) constructors to ClassPathXmlApplicationContext, allowing to load relative to a specified class

Package org.springframework.core
* refined NestedXxxException to be serialization-compatible with Spring 1.2
* refined NestedXxxException to properly handle null message in root cause, through using the cause's "toString()"
* fixed FileSystemResource/UrlResource to retain leading "../" parts in paths, building correct relative paths for them
* ResourceEditor resolves placeholders in resource locations against system environment variables as well

Package org.springframework.dao
* introduced PermissionDeniedDataAccessException, thrown for valid operation that was rejected due to lack of permission

Package org.springframework.jdbc
* added "permissionDeniedCodes" category to SQLErrorCodes, with default code 229 for MS SQL Server in sql-error-codes
* JdbcTemplate's "queryForString"/"queryForInt"/etc methods correctly detect incorrect result sizes even for null values
* turned JdbcTemplate's "query(PreparedStatementCreator,PreparedStatementSetter,ResultSetExtractor rse)" method public
* JdbcTemplate does not check static SQL for bind parameters anymore, to avoid overhead of double parsing
* improved JdbcTemplate's logging of ignored SQLWarnings, including SQL state and error code in the log output
* refined NativeJdbcExtractorAdapter to retry with DatabaseMetaData Connection if extraction failed (for Hibernate 3.1)
* added NamedParameterJdbcTemplate which provides named parameters support for query and update functionality
* added "allowsUnusedParameters()" and "checkCompiled()" methods to RdbmsOperation, for better customizing in subclasses
* refined StoredProcedure to accept unused entries in given parameter Maps by default
* added named parameters support to SqlQuery/SqlUpdate hierarchy of classes

Package org.springframework.jms
* AbstractMessageListenerContainer prefers SessionAwareMessageListener over MessageListener (if both are implemented)
* added "exceptionListener" property to AbstractMessageListenerContainer, accepting a standard JMS ExceptionListener
* added "handleListenerException" template method to AbstractMessageListenerContainer, by default logging at error level
* fixed DefaultMessageListenerContainer to properly use separate invokers per thread, for actually concurrent Sessions
* fixed ServerSessionMessageListenerContainer(102) to use "createSession(Connection)" method to avoid JMS 1.1 dependency
* added MessageListenerAdapter(102), delegating to listener methods that operate on content types (String, byte array)

Package org.springframework.jmx
* reworked NotificationListenerBean to avoid overloaded bean property setters for "mappedObjectNames"

Package org.springframework.mail
* refined JavaMailSenderImpl to use "Session.getInstance(properties, null)", for compatibility with (old) JavaMail 1.1

Package org.springframework.mock
* added overloaded constructors to MockFilterConfig, using a MockServletContext instead of a ServletContext argument

Package org.springframework.orm
* updated JDO API 2.0 jar to 2.0 RC1 from the Apache JDO project
* updated JPA API 1.0 jar to build 40 from the GlassFish project
* fixed LocalSessionFactoryBean's "updateDatabaseSchema" to declare the correct exception (DataAccessException)
* fixed BlobStringType for Hibernate2/3 to correctly handle SQL NULL
* refined JDO PersistenceManagerFactoryUtils to explicitly suspend pre-bound PM in the course of transaction suspension
* refined JPA EntityManagerFactoryUtils to explicitly suspend pre-bound EM in the course of transaction suspension
* removed support for obsolete "EntityManagerFactory.getEntityManager()" method from LocalEntityManagerFactoryBean
* added "entityManagerInterface" property to SharedEntityManagerAdapter, for exposing a vendor-extended interface
* adapted OpenEntityManagerInViewFilter/Interceptor to not specify obsolete PersistenceContextType.EXTENDED anymore
* fixed JpaDaoSupport's "setEntityManager" method to accept an EntityManager instead of an EntityManagerFactory
* removed "getEntityManager()"/"getEntityManagerFactory()" accessor methods from JpaDaoSupport
* removed "allowCreate" flag from JpaTemplate, always allowing creation (analogous to shared EntityManager)
* added "exceptionConversionEnabled" flag to HibernateInterceptor, TopLinkInterceptor, JdoInterceptor, JpaInterceptor

Package org.springframework.remoting
* HTTP invoker and RMI invoker fill the client-side portion of the stack trace into transferred exceptions now
* RmiClientInterceptorUtils throws clearer exception message in case of proxy mismatch (for underlying RMI stubs)
* added "setContentType" configuration method to HttpInvokerServiceExporter and AbstractHttpInvokerRequestExecutor
* built client-side HTTP GZIP response support into SimpleHttpInvokerRequestExecutor/CommonsHttpInvokerRequestExecutor
* JaxRpcPortClientInterceptor synchronizes creation of JAX-RPC Calls, to make dynamic invocations with Axis thread-safe
* refined JaxRpcPortClientInterceptor to only use JAX-RPC port if "portInterface" specified (prefer dynamic invocations)
* added "setCustomPropertyMap" method to JaxRpcPortClientInterceptor/ProxyFactoryBean, accepting String-Object pairs
* added AxisBeanMappingServicePostProcessor to "jaxrpc.support" package, for declarative registration of bean mappings

Package org.springframework.scheduling
* refined Quartz SchedulerFactoryBean to re-register the associated JobDetail when overwriting a JobDetailAwareTrigger
* fixed Quartz SchedulerFactoryBean to handle potential cluster race condition on trigger registration

Package org.springframework.scripting
* AOP-based auto-proxying works for scripted objects as well now
* added "lang" namespace for XML schema definitions, providing configuration for beans written in dynamic languages

Package org.springframework.transaction
* AbstractPlatformTransactionManager logs "Should roll back transaction but cannot" message at debug level (not warn)
* TransactionInterceptor logs application exception at error level if commit throws an exception

Package org.springframework.util
* added null-safe hashCode and toString methods to ObjectUtils (analogous to JDK 1.5), moved over from Spring Modules
* fixed StringUtils's "endsWithIgnoreCase" to correctly handle any String length
* fixed CollectionsUtils's "hasUniqueObject" to correctly handle null values
* refined NumberUtils to perform a value-in-range check for any Number returned from a NumberFormat
* reworked MethodInvoker to match arguments against parameter types when searching for a matching method

Package org.springframework.validation
* renamed SimpleMapBindingResult to MapBindingResult
* DataBinder does not use a default StringArrayPropertyEditor anymore, to nicely handle select list entries with commas
* fixed ValidationUtils's "invokeValidator" to work correctly even in case of a null reference as object to be validated
* added BindingResultUtils, providing convenience methods for looking up BindingResults in a model Map

Package org.springframework.web
* refined GenericFilterBean to fully support initialization as bean in a Spring bean factory (without FilterConfig)
* refined OncePerRequestFilter to fall back to bean name or fully qualified class name if no filter name is available
* refined FrameworkServlet to log a request handling failure at debug level rather than error level
* refined AbstractRefreshablePortletApplicationContext to take PortletContext from PortletConfig if not explicitly set
* factored out "handleNoSuchRequestHandlingMethod" method in MultiActionController, to be overridden in subclasses
* fixed SimpleMappingExceptionResolver to correctly check the depth of all exception mappings before choosing a view
* refined SimpleMappingExceptionResolver to only apply a "defaultStatusCode" to a top-level request (not to an include)
* added "clearCache()" method to AbstractCachingViewResolver, for removing all cached view objects
* optimized BeanNameViewResolver to avoid internal throwing and catching of NoSuchBeanDefinitionExceptions
* ExpressionEvaluationManager supports concatenated expressions (e.g. "${var1}text${var2}") on all JSP 2.0 engines
* added optional caching of JSP 2.0 Expressions, driven by "cacheJspExpressions" context-param in web.xml (true/false)
* "javaScriptEscape" feature of Spring tags correctly escapes "</script>" inside a literal value
* fixed JSP SelectTag to correctly handle null values
* AbstractJasperReportsView and subclasses require JasperReports 1.0.1 or higher (removed backwards compatibility check)
* fixed AbstractJasperReportsView and subclasses to be compatible with J2EE <1.4 (avoid response.setCharacterEncoding)
* AbstractJasperReportsView autodetects a JDBC DataSource in the model, as alternative to specifying it in configuration
* Struts ContextLoaderPlugIn ignores "Action.setServlet(ActionServlet)" method when performing a dependency check
* optimized Struts Delegating(Tiles)RequestProcessor to avoid unnecessary NoSuchBeanDefinitionException throw+catch
* added Autowiring(Tiles)RequestProcessor, autowiring created Actions (configurable through ActionServlet init-params)


Changes in version 2.0 M3 (8.3.2006)
------------------------------------

Package org.springframework.aop
* AbstractBeanFactoryBasedTargetSource offers explicit "setTargetClass" method, else determines target class on demand
* renamed AbstractLazyInitTargetSource to AbstractLazyCreationTargetSource
* renamed AbstractPerformanceMonitorInterceptor to AbstractMonitoringInterceptor
* refined DebugInterceptor to keep its count in a field of type long instead of int, with "long getCount()" accessor
* fixed DebugInterceptor to properly synchronize access to its count field in a multithreading environment

Package org.springframework.beans
* factored out extended PropertyAccessor and ConfigurablePropertyAccessor interfaces from BeanWrapper/BeanWrapperImpl
* BeanWrapperImpl supports PropertyEditors exposed by PropertyDescriptors (typically from BeanInfo classes)
* BeanWrapperImpl passes a null value to a PropertyEditor's "setValue" method, allowing for conversion of null values
* changed MutablePropertyValues's "addPropertyValue" signature back to void, to remain binary compatible with Spring 1.2
* fixed PropertyTypeConverter to never build "null[...]" property paths that lead to exceptions in "findCustomEditor"
* fixed ArgumentConvertingMethodInvoker to perform conversion attempts on a copy of the argument array (not the source)
* added "nullAsEmptyCollection" flag to CustomCollectionEditor, allowing to convert a null value to an empty Collection
* added "containsLocalBean" method to HierarchicalBeanFactory interface, refactored from AbstractApplicationContext
* fixed AbstractBeanFactory to use canonical bean name (id) for prototype creation, exposing it to BeanPostProcessors
* fixed AbstractBeanFactory to destroy a failed bean completely, including dependent beans (in case of eager references)
* fixed AbstractBeanFactory's definition caching to allow for proper placeholder substitution even with parent/child
* added "configureBean" method to AutowireCapableBeanFactory, fully configuring an instance based on a bean definition
* DefaultListableBeanFactory does not instantiate "factory-bean" references anymore, not even for eager-init singletons
* re-added support for deprecated "class" property to PropertiesBeanDefinitionReader, alongside "(class)"
* DefaultXmlBeanDefinitionParser considers "" as default namespace as well, for compatibility with the Oracle XML parser

Package org.springframework.context
* AbstractApplicationContext discovers its context MessageSource as "messageSource" bean even through an alias

Package org.springframework.core
* added "getRootCause()" method to NestedRuntime/CheckedException, for retrieving the innermost exception
* refined PropertiesLoaderUtils to use a URLConnection with "setUseCaches(false)", to avoid jar file locking on Windows

Package org.springframework.jdbc
* added further default SQL error codes for MS SQL, MySQL, and Oracle
* refined DataSourceUtils to expect an "afterCompletion" callback from a different thread (in case of JTA transaction)

Package org.springframework.jms
* reworked DefaultMessageListenerContainer to allow for breaking the receive loop into smaller, schedulable tasks
* DefaultMessageListenerContainer defaults "maxMessagesPerTask" to 1 for short-lived-preferring SchedulingTaskExecutor
* renamed ServerSessionMessageListenerContainer's "maxMessages" to "maxMessagesPerTask", for consistency

Package org.springframework.jmx
* fixed MBeanServerConnectionFactoryBean to avoid potential initialization of unused JMX Connector on shutdown

Package org.springframework.jndi
* added "defaultObject" property to JndiObjectFactoryBean, allowing to fall back to default object if JNDI lookup fails

Package org.springframework.mock
* MockServletContext's "getResourcePaths" correctly resolves directories as paths that end with a slash
* MockHttpServletResponse detects charset specification in "setContentType" and sets character encoding accordingly
* fixed AbstractTransactionalSpringContextTests's "startNewTransaction" to initialize "complete" to "!defaultRollback"

Package org.springframework.orm
* Hibernate LocalSessionFactoryBean offers protected "executeSchemaStatement" method for overriding the failure handling
* fixed JpaTemplate's "findByNamedQuery" to correctly apply parameter indexes starting from 1

Package org.springframework.scheduling
* added SchedulingTaskExecutor interface, letting an executor declare a preference for short-lived tasks
* all thread-pool-backed executors implement SchedulingTaskExecutor to expose a preference for short-lived tasks
* added SchedulingAwareRunnable interface, exposing an "isLongLived" flag (analogous to CommonJ's "isDaemon")
* CommonJ WorkManagerTaskExecutor/DelegatingWork exposes SchedulingAwareRunnable's "isLongLived" flag appropriately
* fixed TimerFactoryBean to properly initialize even without "scheduledTimerTasks" configured

Package org.springframework.scripting
* fixed ScriptFactoryPostProcessor to let scripts receive bean references up the entire container hierarchy

Package org.springframework.transaction
* added CompositeTransactionAttributeSource and "setTransactionAttributeSources([])" method for TransactionInterceptor
* JtaTransactionManager autodetects JNDI location "java:pm/TransactionManager" on Borland and Sun application servers

Package org.springframework.util
* fixed ResponseTimeMonitorImpl to properly synchronize access to its instance variables in a multithreading environment

Package org.springframework.validation
* added further accessors to Errors interface: hasFieldErrors(), getFieldErrorCount(), getFieldErrors(), getFieldError()
* introduced BindingResult interface, as extension of the Errors interface
* reworked BindException to implement the BindingResult interface, wrapping an existing BindingResult
* added BeanPropertyBindingResult and SimpleMapBindingResult implementations, based on a refactoring of BindException
* added "BindingResult getBindingResult()" method to DataBinder, deprecating the "BindException getErrors()" method
* adapted BindingErrorProcessor interface to operate on a BindingResult instead of a BindException
* added support for direct field access in the form of DirectFieldBindingResult and DataBinder's "initDirectFieldAccess"

Package org.springframework.web
* changed WebApplicationContext's "ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE" to actually start with the package name
* ContextLoader throws IllegalStateException if there is already a root application context present
* fixed DispatcherServlet to keep and restore previous thread-bound LocaleContext and RequestAttributes
* added overloaded "getModelAndView" method with HttpServletRequest argument to SimpleMappingExceptionResolver
* added "cookieSecure" property to CookieGenerator, indicating that cookies should only be sent using HTTPS connections
* added schema support for configuring a SimpleUrlHandlerMapping using spring-web.xsd
* renamed "Handler" interface to "RequestHandler", to differentiate it from the dispatcher's generic "handler" concept
* moved ControllerClassNameHandlerMapping from package "web.servlet.mvc.mapping" to "web.servlet.mvc"
* added "useDirectFieldAccess()" template method to BaseCommandController, for initializing the DataBinder accordingly
* added overloaded "onFormChange" method with BindException argument to SimpleFormController
* MultiActionController does not consider "handleRequest" itself as handler method (to avoid potential stack overflow)
* added full JSP 1.2 form tag library in package "web.servlet.tags", complementing the existing base tag library
* upgraded VelocityToolboxView to use Velocity Tools 1.2+ API and avoid using deprecated earlier API
* added VelocityLayoutViewResolver, a convenience subclass of VelocityViewResolver with support for VelocityLayoutView
* added protected "callNextHandlerInChain" method to DecoratingNavigationHandler, to be called by subclasses


Changes in version 2.0 M2 (1.2.2006)
------------------------------------

Overall
* all of Spring must be built on JDK 1.5 now; the test suite is still able to run on JDK 1.4 and 1.3

Package org.springframework.aop
* added equals/hashCode implementations to all pointcuts and advisors
* removed restriction on proxying protected methods from Cglib2AopProxy
* allowed AopUtils's "invokeJoinpointUsingReflection" to invoke protected methods
* added "autodetectInterfaces" to ProxyFactoryBean, for TransactionProxyFactoryBean style behavior (is the default now!)
* refined ProxyFactoryBean to lazily initialize a singleton proxy, to let "getObjectType()" expose the type beforehand
* improved performance of IntroductionInfoSupport by faster determination of whether method is on introduced interface
* refined ThreadLocalTargetSource's synchronization to guarantee thread-safe destruction on shutdown
* added "hideProxyClassNames" property to AbstractTraceInterceptor, to log with target class instead of proxy class
* added "target.dynamic" package to support dynamic refresh of object instances
* added BeanFactoryRefreshableTargetSource to allow object instances to be refreshed with new instances from BeanFactory
* AspectJ binding from pointcut expressions to arbitrary advice method arguments now working
* support for introductions using AspectJ @DeclareParents
* support for new AspectJ 5 "pertypewithin" aspect instantiation model
* completed implementation of @AspectJ integration class MethodInvocationProceedingJoinPoint

Package org.springframework.beans
* fixed PropertyAccessorUtils's "getLastNestedPropertySeparatorIndex" to correctly handle property paths without dot
* added overloaded constructor to StringArrayPropertyEditor, allowing to specify a custom separator for String splitting
* BeanWrapperImpl keeps registered editors in a linked Map: the first registered editor that matches will be used
* BeanWrapperImpl caches registered editors that match superclass or interface, to avoid repeated assignable-from checks
* added support for bean properties with generic Collections/Maps, auto-converting to their element/key/value type
* added support for constructor arguments with generic Collections/Maps, auto-converting to their element/key/value type
* added "merge" attribute to "list"/"set/"map"/"props", for merging of collection values across parent/child definitions
* added "default-merge" attribute to "beans" element to allow control of collection merging at the file level
* changed FileEditor's behavior to consider input text as standard Spring resource location (instead of plain filename)
* added "postProcessAfterInstantiation" method to InstantiationAwareBeanPostProcessor
* fixed AbstractBeanFactory to correctly delegate to parent BeanFactory from "isFactoryBean"
* optimized AbstractBeanFactory to avoid internal NoSuchBeanDefinitionException throw+catch as far as possible
* AbstractBeanFactory caches merged bean definitions, for efficient prototype child creation and CGLIB class reuse
* reworked AbstractBeanFactory's currently-in-creation check to log debug message when unfinished singleton is returned
* added "allowCircularReferences" flag to AbstractAutowireCapableBeanFactory, to disallow circular references completely
* DefaultListableBeanFactory's "getBeansOfType" logs BeanCurrentlyInCreationException message instead of stacktrace
* refined DefaultXmlBeanDefinitionParser to explicity check for empty ref name and throw meaningful exception
* DefaultXmlBeanDefinitionParser wraps unexpected exceptions in BeanDefinitionStoreException with context info
* inner bean parsing/instantiation exceptions get wrapped in outer exceptions with appropriate context information
* moved general bean wiring support from "beans.factory.aspectj" to "beans.factory.wiring"/"beans.factory.annotation"
* renamed AspectJ AnnotationBeanConfigurer to AnnotationBeanConfigurerAspect
* deprecated BeanFactoryBootstrap in favor of using a BeanFactoryLocator or a custom bootstrap class

Package org.springframework.context
* refined AbstractApplicationContext to never register more than one JVM shutdown hook
* deprecated ConsoleListener, since it doesn't serve any purpose

Package org.springframework.core
* JdkVersion explicitly detects JDK 1.6 and 1.7 as well (does not mis-detect 1.6 as 1.3 anymore)
* refined Jdk13ControlFlow to be compatible with GNU ClassPath (whose stacktrace has a whitespace after the method name)
* added NestedIOException, deriving from java.io.IOException and adding NestedCheckedException-style root cause handling
* refined AbstractResource to work around "FilterInputStream.close()" NPE, simply catching Throwable and ignoring it
* PathMatchingResourcePatternResolver considers URL protocol "wsjar" as jar file (to load from WebSphere-managed jars)
* ResourceArrayPropertyEditor can translate a set/list of patterns into a Resource array (rather than just one pattern)
* split previous AnnotationUtils delegatetetetete into core.annotation.AnnotationUtils and beans.annotation.AnnotationBeanUtils

Package org.springframework.jdbc
* DataSourceTransactionManager only attempts to release Connection if not pre-bound (to avoid inappropriate log message)
* TransactionAwareDataSourceProxy works correctly in combination with JdbcTemplate and transaction suspend/resume now
* fixed SingleColumnRowMapper to explicitly check "ResultSet.wasNull()" after "getInt"/"getLong"/"getFloat" etc
* turned visibility of "org.springframework.jdbc.core.StatementCreatorUtils" to package-protected
* removed ResultReader interface (sub-interface of RowCallbackHandler): use RowMapper instead
* reworked RowMapperResultReader adapter into RowMapperResultSetExtractor
* reworked ResultSetSupportingSqlParameter to expose a RowMapper directly through a "getRowMapper()" method
* reworked SqlQuery and subclasses to work with a RowMapper instead of a ResultReader -> "newRowMapper" template method
* fixed BatchSqlUpdate's constructor that takes a "batchSize" argument to correctly interpret it as batch size
* added "trackRowsAffected" property to BatchSqlUpdate, allowing to turn off the row counts list to save memory
* refined JdbcBeanDefinitionReader to offer constructors with BeanDefinitionRegistry and PropertiesBeanDefinitionReader

Package org.springframework.jmx
* fixed MBeanExporter to work correctly with an "excludedBeans" list that it not sorted by bean name ascending
* fixed "persistPeriod" default to be -1 even in ManagedResource attribute (not just in ManagedResource annotation)

Package org.springframework.mock
* made "servletContextName" and "portletContextName" configurable in MockServletContext respectively MockPortletContext
* added "set/removeParameter" methods to MockHttpServletRequest, allowing to replace/remove existing parameters
* added alternative MockPortalContext constructor that accepts custom PortletMode and WindowState lists
* reworked MockActionResponse and MockPortletURL to check against list of supported PortletModes/WindowStates

Package org.springframework.orm
* SqlMapClientTemplate always works with SqlMapSession and provided Connection to enable proper batching in all cases
* added "configLocations" property to LocalSessionFactoryBean for Hibernate3, allowing to load multiple config files
* LocalSessionFactoryBean supports cache regions specified through "entity/collectionCacheStrategies" (on Hibernate 3.1)
* LocalSessionFactoryBean supports multiple event listeners per type through "eventListeners" (on Hibernate 3.1)
* added optional SpringSessionContext for Hibernate 3.1, to plug Spring into "getCurrentSession()" without proxying
* added "replicate" convenience methods to HibernateTemplate for both Hibernate2 and Hibernate3
* added BlobStringType with configurable character encoding for both Hibernate2 and Hibernate3
* updated Spring's JDO 2.0 support to JDO API 2.0 beta (as provided by Apache, corresponding to JPOX 1.1.0-beta-6)
* added full support for Java Persistence API 1.0 (JPA) Public Final Draft, in package "org.springframework.orm.jpa"

Package org.springframework.samples
* updated "views.properties" files in all sample applications to use "(class)" and "(parent)"
* renamed PetClinic's "Entity" base class to "BaseEntity", to avoid name collision with the JPA Entity annotation
* marked JPetStore's OrderForm, AccountForm and UserSession as Serializable

Package org.springframework.scheduling
* removed special Quartz 1.3 check from SchedulerFactoryBean: requires Quartz 1.4 or higher now
* added support for Quartz 1.5's merged JobDataMap to QuartzJobBean, falling back to plain JobDataMap on Quartz 1.4

Package org.springframework.scripting
* introduced scripting package based on ScriptFactory and ScriptSource abstractions
* added support for BeanShell, Groovy and JRuby scripted objects

Package org.springframework.test
* fixed AbstractDependencyInjectionSpringContextTests's "populateProtectedVariables" to avoid incorrect warnings
* added "startNewTransaction()" method to AbstractTransactionalSpringContextTests

Package org.springframework.transaction
* refined AbstractPlatformTransactionManager to suspend synchronizations before the actual transaction (not after)
* fixed AbstractPlatformTransactionManager to serialize all relevant state
* fixed TransactionInterceptor to correctly serialize TransactionAspectSupport state
* marked AnnotationTransactionAttributeSource as Serializable

Package org.springframework.ui
* added ModelMap, providing "addObject" methods that auto-generate model attribute names according to conventions
* added "defaultEncoding" bean property to FreeMarkerConfigurationFactory(Bean), inherited by FreeMarkerConfigurer
* added overloaded methods to JasperReportsUtils to allow exporter parameter to be specified for specific formats

Package org.springframework.util
* ClassUtils's "forName(String)" method uses "getDefaultClassLoader()" instead of thread context ClassLoader only
* fixed "StringUtils.delimitedListToStringArray" to properly handle an empty String as delimiter
* refined StopWatch to not add new lines for "shortSummary()" but rather only for "prettyPrint()"
* fixed ConcurrencyThrottleSupport to serialize all relevant state

Package org.springframework.validation
* DataBinder registers suppressed fields in BindException, which offers a "getSuppressedFields()" accessor now

Package org.springframework.web
* "contextConfigLocation" params in "web.xml" support "${...}" style placeholders for system properties
* deprecated BindUtils and BindInitializer in package "web.bind" in favor of direct ServletRequestDataBinder usage
* deprecated RequestUtils in package "web.bind" in favor of ServletRequestUtils
* renamed RequestUtils in package "web.portlet.bind" to PortletRequestUtils
* reworked MultipartException to derive from NestedIOException instead of NestedServletException, for Portlet reuse
* upgraded CommonsMultipartResolver to Commons FileUpload 1.1 (not using deprecated FileUpload 1.0 API anymore)
* added PortletMultipartResolver abstraction, with CommonsPortletMultipartResolver implementation as default
* added multipart support to PortletRequestDataBinder, with factored-out common functionality in WebDataBinder
* reworked RequestContextHolder to hold a RequestAttributes facade instead of a full HttpServletRequest
* added RequestContextHolder support to DispatcherPortlet, to enable Request/SessionScopeMap with portlets
* refactored RequestHandledEvent into RequestHandledEvent base class and ServletRequestHandledEvent subclass
* renamed FrameworkPortlet's RequestHandledEvent to PortletRequestHandledEvent, a subclass of RequestHandledEvent
* PortletBean ignores init-params that do not match bean properties, analogous to HttpServletBean
* DispatcherServlet does not log handler exceptions at warn level anymore but rather only at debug level
* fixed DispatcherPortlet to properly support an exposed View object in a given ModelAndView
* reworked Servlet ModelAndView and Portlet ModelAndView to fully support ModelMap's conventional attribute names
* added HttpSessionMutexListener and "WebUtils.getSessionMutex", used by AbstractController's "synchronizeOnSession"
* added "PortletUtils.getSessionMutex", used by the Portlet AbstractController's "synchronizeOnSession"
* added "FacesContextUtils.getSessionMutex", to make HttpSessionMutexListener's session mutex available to JSF code
* turned AbstractController's "passAllParametersToRenderPhase"/"clearAllRenderParameters" into PortletUtils methods
* added "propertyEditorRegistrars" property to BaseCommandController, for applying PropertyEditorRegistrars
* added "propertyEditorRegistrars" property to Portlet BaseCommandController, for applying PropertyEditorRegistrars
* added "bindingErrorProcessor" property to Portlet BaseCommandController, for configurable BindingErrorProcessor
* turned AbstractCommandController's and AbstractFormController's "handleRequestInternal" methods non-final
* refactored AbstractFormController's session form check into one single place, throwing SessionRequiredException
* reworked MultiActionController's "bind" and "createBinder" to work on HttpServletRequest instead of ServletRequest
* deprecated MultiActionController's "initBinder(ServletRequest...)" in favor of "initBinder(HttpServletRequest...)"
* refined ParameterMethodNameResolver to treat an empty method name as no name at all, letting the default kick in
* added protected accessors for UrlBasedViewResolver's bean properties, allowing subclasses to access the settings
* added "argumentSeparator" property to MessageTag, allowing to specify a custom separator instead of the default comma
* added "useSingleModelNameAsRoot" property to AbstractXlstView, allowing to enforce the value of the "root" property
* added RequestToViewNameTranslator strategy to allow DispatcherServlet to auto-generate view names where necessary
* added DefaultRequestToViewNameTranslator to provide intuitive defaults for automatic view name generation
* refined Struts DelegatingActionProxy and Delegating(Tiles)RequestProcessor to fall back to root WebApplicationContext
* added DelegatingNavigationHandlerProxy and DelegatingPhaseListenerMulticaster to JSF support (used by Spring Web Flow)


Changes in version 2.0 M1 (22.12.2005)
--------------------------------------

Overall
* removed all deprecated classes and methods
* removed support for iBATIS SQL Maps 1.3 (if you haven't done so already, upgrade to iBATIS SQL Maps 2.0/2.1!)
* added explicit support for Hibernate 3.1 while remaining compatible with Hibernate 3.0 (as far as possible)
* factored out "spring-jdo", "spring-hibernate2/3", "spring-toplink", "spring-ojb" jars (not in "spring.jar" anymore!)
* distributed first AspectJ aspects (for transaction management and DI of objects not instantiated by Spring container)

Package org.springframework.aop
* added support for AspectJ pointcut expressions, specified in AspectJ pointcut language
* added support for AspectJ aspect implementations, both for classic AspectJ style and the AspectJ 5 annotation style
* added @Configurable annotation plus BeanConfigurer aspect to allow injection on any arbitrary object through AspectJ
* added AopNamespaceHandler to support dedicated "aop:*" XML tags

Package org.springframework.beans
* added intelligent error messages to BeanWrapperImpl when properties are not found
* fixed BeanWrapperImpl to pass its "extractOldValueForEditor" setting on to nested BeanWrappers
* refined BeanWrapperImpl to perform the accessible checking for read/write methods before every invocation
* changed "MutablePropertyValues.addPropertyValue(String, Object)" to return 'this'
* removed deprecated "getBeanDefinitionNames(type)" method from ListableBeanFactory and BeanFactoryUtils
* added "createBean" and "initializeBean" methods to AutowireCapableBeanFactory interface
* fixed AbstractBeanFactory to allow child bean definitions to refer to a parent via its alias name
* DefaultListableBeanFactory is able to call non-public factory methods as well
* PropertiesBeanDefinitionReader trims String values for special keys such as "(class)", "(parent)", etc
* added "default-init-method" and "default-destroy-method" attributes to the XML bean definition format
* added support for XSD-driven XML bean definitions, with pluggable namespace handlers
* added UtilNamespaceHandler to support dedicated "util:*" XML tags

Package org.springframework.core
* introduced TaskExecutor abstraction, as strategy interface for the execution of Runnables
* added SyncTaskExecutor and SimpleAsyncTaskExecutor as simple default implementations of the TaskExecutor interface

Package org.springframework.context
* added "getAutowireCapableBeanFactory()" accessor to ApplicationContext interface, for direct access without casting
* refined AbstractApplicationContext's lifecycle behavior to properly ignore repeated "close()" calls
* moved DefaultListableBeanFactory's cleanup on "preInstantiateSingletons()" behavior to AbstractApplicationContext
* reworked SimpleApplicationEventMulticaster to delegate to a TaskExecutor, using a SyncTaskExecutor as default

Package org.springframework.dao
* introduced EmptyResultDataAccessException as specific subclass of IncorrectResultSizeDataAccessException

Package org.springframework.jdbc
* added further error codes for Oracle and MySQL to default "sql-error-codes.xml" file
* OracleLobHandler lazily initializes Oracle driver classes, always loading via the actual Connection's class loader
* fixed DataSourceUtils to correctly re-suspend a Connection even if the Connection hasn't been used since resume
* fixed JdbcTemplate to extract the JDBC Connection for CallableStatementCreators if a NativeJdbcExtractor has been set
* factored out protected "getColumnMapRowMapper" and "getSingleColumnRowMapper" hooks within JdbcTemplate
* SingleColumnRowMapper throws specific IncorrectResultSetColumnCountException in case of invalid column count
* SingleColumnRowMapper explicitly calls "ResultSet.getBigDecimal()" if the required type is BigDecimal
* added SimpleJdbcTemplate with ParameterizableRowMapper for Java 5, leveraging varargs and generics

Package org.springframework.jms
* SimpleMessageConverter accepts a passed-in raw JMS Message and returns a raw JMS Message if content type is unknown
* added DefaultMessageListenerContainer mechanism for async message reception via the plain JMS MessageConsumer API
* added SimpleMessageListenerContainer mechanism for async message reception via the plain JMS MessageListener API
* added ServerSessionMessageListenerContainer mechanism for async message reception via the JMS ServerSessionPool API

Package org.springframework.jmx
* introduced MBeanExportOperations interface, providing a programmatic facility for registering MBeans on MBeanExporter
* introduced MBeanExportException as unified exception hierarchy for MBeanExporter and MBeanExportOperations
* MBeanExporter no longer ignores autodetected MBeans with invalid object names: specify appropriate "excludedBeans"
* added support for registering NotificationListeners with the MBeanServer
* added @ManagedNotification(s) annotation (and corresponding Commons attributes) for describing notification MBeanInfo
* extended static MBeanInfoAssemblers to support configuration of Notification metadata
* added NotificationPublisher(Aware) to support publication of JMX Notifications from Spring-managed beans
* added MBeanExporter option to have Spring extend ObjectNames to ensure they are unique per-instance
* added MBeanExporter option to have Spring expose the ClassLoader of the managed resource before MBean invocations

Package org.springframework.jndi
* added JndiNamespaceHandler to support dedicated "jndi:*" XML tags

Package org.springframework.orm
* JdoTransactionManager does explicit "isActive()" check before attempting a rollback, to avoid illegal state exception
* HibernateTransactionManager autodetects Hibernate 3.1 to support its native transaction timeout
* removed "save" operations with explicit id argument from HibernateTemplate (following Hibernate 3.1's removal)
* upgraded FilterDefinitionFactoryBean to Hibernate 3.1 (which changed its FilterDefinition in an incompatible fashion)
* upgraded IdTransferringMergeEventListener to Hibernate 3.1 (which changed its listener API in an incompatible fashion)
* Hibernate LocalSessionFactoryBean exposes its DataSource on "SessionFactory.close()", for potential schema export

Package org.springframework.remoting
* RmiServiceExporter performs explicit RMI unexport if binding to the registry failed, to avoid dangling exports
* JaxRpcPortClientInterceptor/ProxyFactoryBean apply given JaxRpcServicePostProcessors to existing JAX-RPC Service too
* HttpInvokerServiceExporter, HessianServiceExporter and BurlapServiceExporter implement Handler instead of Controller
* HttpInvokerRequestExecutor is allowed to throw any Exception, not just IOException and ClassNotFoundException

Package org.springframework.scheduling
* TimerFactoryBean creates a non-daemon Timer by default, to let running tasks finish after Timer was cancelled
* added TimerTaskExecutor adapter for accessing a "java.util.Timer" through the TaskExecutor interface
* added "taskExecutor" property to Quartz SchedulerFactoryBean, for replacing Quartz's default thread pool
* added SimpleThreadPoolTaskExecutor for Quartz, allowing to define Quartz's default thread pool as Spring TaskExecutor
* added scheduling-style support for the JDK 1.5 ThreadPoolExecutor mechanism in the "java.util.concurrent" package
* added ConcurrentTaskExecutor adapter for accessing a JDK 1.5 Executor through the TaskExecutor interface
* added scheduling-style support for the CommonJ TimerManager API, as supported by WebLogic 9 and WebSphere 6
* added WorkManagerTaskExecutor adapter for accessing a CommonJ WorkManager through the TaskExecutor interface

Package org.springframework.samples
* upgraded JPetStore (standard and annotation version) to use the new XML schema namespaces "aop", "tx" and "jndi"

Package org.springframework.test
* added AbstractModelAndViewTests, a convenience super class for testing ModelAndView objects

Package org.springframework.transaction
* JtaTransactionManager only invokes rollback if transaction is still active (some JTA providers eagerly terminate)
* added TransactionNamespaceHandler to support dedicated "tx:*" XML tags

Package org.springframework.util
* added "isNull()" methods to Assert class
* added "setPathSeparator" method to AntPathMatcher, allowing to override the default path separator "/"
* fixed AntPathMatcher to correctly treat "*" right after separator, i.e. to accept path "/test/" for pattern "/test/*"
* WeakReferenceMonitor uses a daemon thread, to avoid a hanging thread even if weak references have not been released
* changed ConcurrencyThrottleSupport's default "concurrencyLimit" to -1 (keeping ConcurrencyThrottleInterceptor at 1)

Package org.springframework.web
* use NestedServletException wherever a root cause gets wrapped by a ServletException (for nicer root cause handling)
* WebApplicationContext interface does not extend ThemeSource anymore; implementing ThemeSource is now optional
* introduced ServletConfigAware interface, for getting access to a Framework/DispatcherServlet's ServletConfig object
* SimpleServletPostProcessor configures Servlets with DispatcherServlet's ServletConfig by default (can be turned off)
* introduced Handler interface as alternative to Controller, with no ModelAndView and only throwing Servlet/IOException
* AbstractCachingViewResolver guarantees at-most-once instantiation of each View instance (-> extended synchronization)
* added "currentFormObject" template method to AbstractFormController, for post-processing of a session form object
* "RequestContextUtils.getLocale(request)" falls back to the accept-header Locale if no LocaleResolver found
* FixedLocaleResolver returns the JVM's default Locale if no explicit default Locale specified
* VelocityView converts Velocity's MethodInvocationException to a Spring NestedServletException with original root cause