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
|