{"id":40451,"date":"2023-11-24T03:49:16","date_gmt":"2023-01-26T08:17:51","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8eseasar2%e8%bf%81%e7%a7%bb%e5%88%b0spring-boot2%e7%b3%bb\/"},"modified":"2024-05-04T10:31:21","modified_gmt":"2024-05-04T02:31:21","slug":"%e4%bb%8eseasar2%e8%bf%81%e7%a7%bb%e5%88%b0spring-boot2%e7%b3%bb","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8eseasar2%e8%bf%81%e7%a7%bb%e5%88%b0spring-boot2%e7%b3%bb\/","title":{"rendered":"\u4eceseasar2\u8fc1\u79fb\u5230spring boot2\u7cfb"},"content":{"rendered":"<h3>\u8bf7\u5728\u522b\u7684\u7f51\u7ad9\u4e0a\u641c\u7d22\u3002<\/h3>\n<p>\u7531\u4e8e\u4e4b\u524d\u5199\u8fc7\u7684\u5185\u5bb9\u5df2\u7ecf\u5728\u67d0\u4e2a\u65f6\u95f4\u7ed3\u675f\u4e86\uff0c\u6240\u4ee5\u6211\u8f6c\u79fb\u5230\u4e86\u8fd9\u7bc7\u7b2c6\u7bc7\u6587\u7ae0\u3002\u8fd9\u662f2019\u5e7410\u67081\u65e5\u7684\u5185\u5bb9\u3002<\/p>\n<h2>\u4eceseasar2\u8fc1\u79fb\u5230spring boot2<\/h2>\n<p>\u7531\u4e8e\u5de5\u4f5c\u9700\u8981\uff0c\u6211\u5c06seasar2\u8fc1\u79fb\u5230spring boot\uff0c\u5e76\u5c06\u5176\u5185\u5bb9\u8bb0\u5f55\u4e0b\u6765\u3002<\/p>\n<p>\u5f53\u7136\uff0c\u5f88\u591a\u5185\u5bb9\u90fd\u88ab\u6539\u5199\u4e86\u3002<\/p>\n<h2>\u8fc7\u6e21\u671f\u524d\u7684\u914d\u7f6e\u3002<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">seasar2<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">SAStruts<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Doma2\uff08ORM\uff09<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">velocity\uff08\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30a8\u30f3\u30b8\u30f3\uff09<\/ul>\n<p>\u5728Gradle\u7684\u591a\u9879\u76ee\u4e2d\uff0c\u5c06\u8fd9\u4e9b\u9879\u76ee\u5206\u5f00\u4f7f\u7528\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">build.gradle\uff08\u89aa\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\uff09<\/ul>\n<\/li>\n<\/ul>\n<p>web\/build.gradle\uff08\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u304b\u3089\u30a2\u30af\u30bb\u30b9\u3059\u308b\u5c64\uff09<br \/>\nadmin\/build.gradle\uff08\u4f1a\u793e\u5074\u304b\u3089\u89e6\u308b\u7ba1\u7406\u7528\u30da\u30fc\u30b8\u306e\u5c64\uff09<br \/>\ncore\/build.gradle\uff08\u30c7\u30fc\u30bf\u3068\u306e\u63a5\u7d9a\u3092\u884c\u3046\u5c64\uff09<br \/>\nbatch\/build.gradle\uff08\u5b9a\u671f\u30d0\u30c3\u30c1\u51e6\u7406\u7528\u306e\u5c64\uff09<\/p>\n<p>\u51e0\u5e74\u6765\uff0c\u6211\u4eec\u4e00\u76f4\u5728\u4f7f\u7528\u7c7b\u4f3c\u4e0a\u8ff0\u7684\u65b9\u6848\u3002<\/p>\n<h2>\u7acb\u5373\u91c7\u53d6\u884c\u52a8<\/h2>\n<h3>dicon\u6587\u4ef6<\/h3>\n<p>\u8ba9\u6211\u4eec\u62b9\u6389\u5b83\uff0c\u6beb\u65e0\u7591\u95ee\u5730\u3002<\/p>\n<h3>\u4fee\u6539 build.gradle \u6587\u4ef6<\/h3>\n<p>\u53ea\u9700\u8981\u4e00\u79cd\u9009\u62e9\u7684\u8bdd\uff0c\u4ee5\u4e0b\u662f\u5bf9\u8be5\u53e5\u5b50\u7684\u6c49\u8bed\u672c\u5730\u5316\u6539\u5199\uff1a<br \/>\n\u53ea\u6539\u53d8\u4e86\u4e00\u4e9b\u5730\u65b9\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"n\">buildscript<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">ext<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">-<\/span>       <span class=\"n\">seasarVersion<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'2.4.48'<\/span>\r\n<span class=\"o\">+<\/span>      <span class=\"n\">springBootVersion<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'2.1.1.RELEASE'<\/span>\r\n\r\n<span class=\"o\">+<\/span>       <span class=\"n\">profile<\/span> <span class=\"o\">=<\/span> <span class=\"n\">project<\/span><span class=\"o\">.<\/span><span class=\"na\">hasProperty<\/span><span class=\"o\">(<\/span><span class=\"s1\">'profile'<\/span><span class=\"o\">)<\/span> <span class=\"o\">?<\/span> <span class=\"n\">project<\/span><span class=\"o\">[<\/span> <span class=\"s1\">'profile'<\/span> <span class=\"o\">]<\/span>  <span class=\"o\">:<\/span> <span class=\"s1\">'localhost'<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"n\">repositories<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">gradlePluginPortal<\/span><span class=\"o\">()<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"n\">dependencies<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">+<\/span>         <span class=\"n\">classpath<\/span><span class=\"o\">(<\/span><span class=\"s2\">\"org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n <span class=\"n\">plugins<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">+<\/span>     <span class=\"n\">id<\/span> <span class=\"s1\">'org.springframework.boot'<\/span> <span class=\"n\">version<\/span> <span class=\"s1\">'2.1.1.RELEASE'<\/span>\r\n <span class=\"o\">}<\/span>\r\n\r\n <span class=\"n\">subprojects<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">+<\/span>   <span class=\"n\">apply<\/span> <span class=\"nl\">plugin:<\/span> <span class=\"s1\">'io.spring.dependency-management'<\/span>\r\n\r\n    <span class=\"n\">repositories<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">gradlePluginPortal<\/span><span class=\"o\">()<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"n\">dependencies<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">-<\/span>       <span class=\"c1\">\/\/ seasar<\/span>\r\n<span class=\"o\">-<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.seasar.container:s2-framework:${seasarVersion}\"<\/span>\r\n<span class=\"o\">-<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.seasar.container:s2-extension:${seasarVersion}\"<\/span>\r\n<span class=\"o\">-<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.seasar.container:s2-tiger:${seasarVersion}\"<\/span>\r\n\r\n<span class=\"o\">+<\/span>       <span class=\"c1\">\/\/ spring boot<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.springframework.boot:spring-boot-dependencies:${springBootVersion}\"<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.springframework.boot:spring-boot-starter-web:${springBootVersion}\"<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.springframework.boot:spring-boot-starter:${springBootVersion}\"<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.springframework.boot:spring-boot-starter-jdbc:${springBootVersion}\"<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.springframework.boot:spring-boot-starter-aop:${springBootVersion}\"<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.springframework.data:spring-data-commons:${springBootVersion}\"<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.apache.tomcat:tomcat-jdbc:9.0.13\"<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.seasar.doma.boot:doma-spring-boot-starter:1.1.1\"<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.springframework.boot:spring-boot-devtools:${springBootVersion}\"<\/span>\r\n\r\n        <span class=\"c1\">\/\/ web<\/span>\r\n<span class=\"o\">-<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.seasar.sastruts:sa-struts:1.0.4-sp9\"<\/span>\r\n<span class=\"o\">-<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"struts:struts:1.2.9\"<\/span>\r\n<span class=\"o\">-<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.apache.velocity:velocity:1.7\"<\/span>\r\n<span class=\"o\">-<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.apache.velocity:velocity-tools:2.0\"<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.springframework.boot:spring-boot-starter-thymeleaf:${springBootVersion}\"<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"net.sourceforge.nekohtml:nekohtml:1.9.22\"<\/span>\r\n\r\n<span class=\"o\">-<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"log4j:log4j:1.2.17\"<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.springframework.boot:spring-boot-starter-log4j2:${springBootVersion}\"<\/span>\r\n\r\n<span class=\"o\">+<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"ognl:ognl:3.1.12\"<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">implementation<\/span> <span class=\"s2\">\"commons-dbutils:commons-dbutils:1.7\"<\/span>\r\n\r\n<span class=\"o\">-<\/span>       <span class=\"n\">testImplementation<\/span> <span class=\"s2\">\"org.seasar.aptina:aptina-unit:1.0.0\"<\/span>\r\n<span class=\"o\">-<\/span>       <span class=\"n\">testCompile<\/span> <span class=\"s1\">'junit:junit'<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">testImplementation<\/span> <span class=\"s2\">\"org.springframework.boot:spring-boot-starter-test:${springBootVersion}\"<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">testImplementation<\/span> <span class=\"s1\">'junit:junit:4.12'<\/span>\r\n\r\n    <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">+<\/span>   <span class=\"n\">configurations<\/span><span class=\"o\">.<\/span><span class=\"na\">all<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">exclude<\/span> <span class=\"nl\">module:<\/span> <span class=\"s1\">'spring-boot-starter-logging'<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">exclude<\/span> <span class=\"nl\">module:<\/span> <span class=\"s2\">\"HikariCP\"<\/span>\r\n<span class=\"o\">+<\/span>       <span class=\"n\">exclude<\/span> <span class=\"nl\">module:<\/span> <span class=\"s2\">\"android-json\"<\/span>\r\n<span class=\"o\">+<\/span>   <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5220\u9664\u4e0eseasar2\u6709\u5173\u7684\u5185\u5bb9\uff0c\u5e76\u6dfb\u52a0spring boot\u76f8\u5173\u7684\u5185\u5bb9\u3002\u5173\u4e8e\u8981\u6dfb\u52a0\u7684\u5185\u5bb9\uff0c\u53ef\u4ee5\u9009\u62e9\u9879\u76ee\u6240\u9700\u7684\u5185\u5bb9\u3002\u5c06\u9700\u8981\u6392\u9664\u7684\u5185\u5bb9\u653e\u5165configurations.all\u4e2d\u3002\u5728\u8fd9\u4e00\u70b9\u4e0a\uff0c\u4f1a\u51fa\u73b0\u5927\u91cf\u9519\u8bef\uff0c\u8ba9\u4eba\u5fc3\u7070\u610f\u51b7\u3002<\/p>\n<h3>subproject\u7684build.gradle\u914d\u7f6e\u6587\u4ef6<\/h3>\n<pre class=\"post-pre\"><code> <span class=\"o\">+<\/span><span class=\"n\">apply<\/span> <span class=\"nl\">plugin:<\/span> <span class=\"s1\">'org.springframework.boot'<\/span>\r\n\r\n <span class=\"o\">+<\/span><span class=\"n\">sourceSets<\/span> <span class=\"o\">{<\/span>\r\n <span class=\"o\">+<\/span>    <span class=\"n\">main<\/span> <span class=\"o\">{<\/span>\r\n <span class=\"o\">+<\/span>      <span class=\"n\">java<\/span> <span class=\"o\">{<\/span>\r\n <span class=\"o\">+<\/span>            <span class=\"n\">srcDir<\/span> <span class=\"s2\">\"${rootDir}\/core\/src\/main\/java\"<\/span>\r\n <span class=\"o\">+<\/span>      <span class=\"o\">}<\/span>\r\n <span class=\"o\">+<\/span>        <span class=\"n\">resources<\/span> <span class=\"o\">{<\/span>\r\n <span class=\"o\">+<\/span>            <span class=\"n\">srcDir<\/span> <span class=\"s2\">\"${rootDir}\/core\/src\/main\/resources\"<\/span>\r\n <span class=\"o\">+<\/span>        <span class=\"o\">}<\/span>\r\n <span class=\"o\">+<\/span>    <span class=\"o\">}<\/span>\r\n <span class=\"o\">+}<\/span>\r\n\r\n <span class=\"n\">dependencies<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">+<\/span>   <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.springframework.boot:spring-boot-starter-security:2.1.1.RELEASE\"<\/span> \r\n<span class=\"o\">+<\/span>   <span class=\"n\">implementation<\/span> <span class=\"s2\">\"org.springframework.boot:spring-boot-starter-actuator:2.1.1.RELEASE\"<\/span>\r\n<span class=\"o\">+<\/span>   <span class=\"n\">implementation<\/span> <span class=\"s2\">\"de.codecentric:spring-boot-admin-starter-client:2.1.1\"<\/span>\r\n <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">+<\/span> <span class=\"n\">springBoot<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">+<\/span>     <span class=\"n\">mainClassName<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"${project.group}.admin.Application\"<\/span>\r\n<span class=\"o\">+<\/span> <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">+<\/span> <span class=\"n\">bootRun<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">+<\/span>     <span class=\"n\">systemProperties<\/span> <span class=\"o\">=<\/span> <span class=\"o\">[<\/span><span class=\"s1\">'spring.profiles.active'<\/span><span class=\"o\">:<\/span> <span class=\"s2\">\"${profile}\"<\/span><span class=\"o\">]<\/span>\r\n<span class=\"o\">+<\/span> <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">+<\/span> <span class=\"n\">bootJar<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">+<\/span>   <span class=\"n\">mainClassName<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">\"${project.group}.admin.Application\"<\/span>\r\n<span class=\"o\">+<\/span>     <span class=\"n\">launchScript<\/span><span class=\"o\">()<\/span>\r\n<span class=\"o\">+<\/span> <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u52a0\u5165spring boot\u7684\u8a2d\u5b9a\u3002<br \/>\n\u7531\u65bc\u4f7f\u7528core\u4f86\u9032\u884cweb\u7b49\u64cd\u4f5c\uff0c\u6240\u4ee5\u9700\u8981\u8a2d\u5b9asourceSets\u3002<br \/>\n\u81f3\u65bcspring security\u548cspring actuator\uff0c\u5247\u6839\u64da\u500b\u4eba\u559c\u597d\u9078\u64c7\u3002<br \/>\n\u5982\u679c\u4e0d\u9700\u8981\u4f7f\u7528\uff0c\u5c31\u6c92\u6709\u7279\u5225\u9700\u8981\u52a0\u5165\u7684\u5fc5\u8981\u3002<\/p>\n<h3>\u521b\u5efa\u5e94\u7528\u7a0b\u5e8f<\/h3>\n<pre class=\"post-pre\"><code> <span class=\"nd\">@EnableAsync<\/span>\r\n <span class=\"nd\">@SpringBootApplication<\/span><span class=\"o\">(<\/span><span class=\"n\">exclude<\/span> <span class=\"o\">=<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">ManagementWebSecurityAutoConfiguration<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">,<\/span>\r\n        <span class=\"nc\">SecurityAutoConfiguration<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">,<\/span>\r\n        <span class=\"nc\">UserDetailsServiceAutoConfiguration<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">,<\/span>\r\n        <span class=\"nc\">SecurityFilterAutoConfiguration<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span>\r\n        <span class=\"o\">})<\/span>\r\n <span class=\"nd\">@ComponentScan<\/span><span class=\"o\">(<\/span><span class=\"n\">basePackages<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"[\u30d1\u30c3\u30b1\u30fc\u30b8\u306eroot]\"<\/span><span class=\"o\">)<\/span>\r\n <span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Application<\/span> <span class=\"o\">{<\/span>\r\n\r\n    <span class=\"kd\">static<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">Security<\/span><span class=\"o\">.<\/span><span class=\"na\">setProperty<\/span><span class=\"o\">(<\/span><span class=\"s\">\"networkaddress.cache.ttl\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"60\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"nc\">Security<\/span><span class=\"o\">.<\/span><span class=\"na\">setProperty<\/span><span class=\"o\">(<\/span><span class=\"s\">\"networkaddress.cache.negative.ttl\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"10\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">Exception<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">setProperty<\/span><span class=\"o\">(<\/span><span class=\"s\">\"server.servlet.context-path\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"\/admin\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"nc\">SpringApplication<\/span> <span class=\"n\">springApplication<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">SpringApplication<\/span><span class=\"o\">(<\/span><span class=\"nc\">Application<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"nc\">Properties<\/span> <span class=\"n\">properties<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Properties<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"n\">properties<\/span><span class=\"o\">.<\/span><span class=\"na\">setProperty<\/span><span class=\"o\">(<\/span><span class=\"s\">\"spring.profiles.active\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"localhost\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">properties<\/span><span class=\"o\">.<\/span><span class=\"na\">setProperty<\/span><span class=\"o\">(<\/span><span class=\"s\">\"spring.datasource.initialization-mode\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"NEVER\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">properties<\/span><span class=\"o\">.<\/span><span class=\"na\">setProperty<\/span><span class=\"o\">(<\/span><span class=\"s\">\"spring.resources.add-mappings\"<\/span><span class=\"o\">,<\/span> <span class=\"s\">\"true\"<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">springApplication<\/span><span class=\"o\">.<\/span><span class=\"na\">setDefaultProperties<\/span><span class=\"o\">(<\/span><span class=\"n\">properties<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">springApplication<\/span><span class=\"o\">.<\/span><span class=\"na\">run<\/span><span class=\"o\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span> \r\n <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5b89\u5168\u6027\u3092\u8ffd\u52a0\u3057\u305f\u304c\u3001\u4f7f\u7528\u3057\u3066\u3044\u308bURL\u304c\u8aa4\u3063\u3066\u4e0d\u6b63\u3068\u3055\u308c\u3066\u3057\u307e\u3044\u307e\u3057\u305f\u306e\u3067\u3001URL\u3092\u4fee\u6b63\u3059\u308b\u306e\u306f\u5c11\u3057\u56f0\u96e3\u306a\u72b6\u6cc1\u3067\u3057\u305f\u306e\u3067\u3001\u7d50\u5c40\u9664\u5916\u3057\u3066\u7121\u52b9\u306b\u3057\u307e\u3057\u305f\u3002\u610f\u5473\u304c\u3042\u308a\u307e\u305b\u3093&#8230;<br \/>\n\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u8a2d\u5b9a\u3084\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u30d1\u30b9\u306e\u8a2d\u5b9a\u3001\u305d\u306e\u4ed6\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u8a2d\u5b9a\u306a\u3069\u3092\u884c\u3044\u307e\u3059\u3002<\/p>\n<h3>\u5404\u79cd\u52a8\u4f5c\u7684\u54cd\u5e94<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Controller<\/span>\r\n<span class=\"nd\">@RequiredArgsConstructor<\/span>\r\n<span class=\"nd\">@RequestMapping<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\"<\/span><span class=\"o\">)<\/span>\r\n<\/code><\/pre>\n<p>\u5bf9\u4e8e\u7c7b\u7684\u6ce8\u89e3<br \/>\n\u4f7f\u7528@Controller\u6765\u6307\u5b9aseasar2\u4e2d\u7684action<br \/>\n@RequiredArgsConstructor\u662flombok\u7684\u4e00\u4e2a\u6ce8\u89e3\uff0c\u4f46\u7531\u4e8e\u6784\u9020\u5668\u6ce8\u5165\u5f88\u65b9\u4fbf\uff0c\u6240\u4ee5\u8fdb\u884c\u8bbe\u7f6e<br \/>\n\u901a\u8fc7@RequestMapping\u6765\u8fdb\u884cURL\u7684\u8bbe\u7f6e<br \/>\n\u987a\u4fbf\u8bf4\u4e00\u4e0b\uff0c\u5373\u4f7f\u5728@RestController\u4e2d\u57fa\u672c\u4e0a\u4e5f\u662f\u4e00\u6837\u7684\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">-<\/span>    <span class=\"nd\">@Resource<\/span>\r\n<span class=\"o\">-<\/span>    <span class=\"kd\">private<\/span> <span class=\"nc\">LoginService<\/span> <span class=\"n\">loginService<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"o\">+<\/span>    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">LoginService<\/span> <span class=\"n\">loginService<\/span><span class=\"o\">;<\/span>\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0b\u662fDI\uff08\u4f9d\u8d56\u6ce8\u5165\uff09\u7684\u66f4\u6539\u793a\u4f8b\u3002\u901a\u8fc7\u5c06\u5176\u8bbe\u4e3aprivate final\uff0c\u4f7f\u5176\u6210\u4e3a\u6784\u9020\u51fd\u6570\u6ce8\u5165\u7684\u76ee\u6807\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">-<\/span>     <span class=\"nd\">@Resource<\/span>\r\n<span class=\"o\">-<\/span>     <span class=\"nd\">@ActionForm<\/span>\r\n<span class=\"o\">-<\/span>     <span class=\"kd\">public<\/span> <span class=\"nc\">LoginForm<\/span> <span class=\"n\">loginForm<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"o\">+<\/span>    <span class=\"nd\">@ModelAttribute<\/span>\r\n<span class=\"o\">+<\/span>     <span class=\"nc\">LoginForm<\/span> <span class=\"nf\">setUpForm<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">+<\/span>         <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">LoginForm<\/span><span class=\"o\">();<\/span>\r\n<span class=\"o\">+<\/span>     <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u6709\u5f88\u591a\u79cd\u65b9\u6cd5\u53ef\u4ee5\u8bbe\u7f6e\u8868\u5355\uff0c\u4f46\u6211\u89c9\u5f97\u4f7f\u7528@ModelAttribute\u662f\u6700\u5bb9\u6613\u7406\u89e3\u7684\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">-<\/span>    <span class=\"kd\">public<\/span> <span class=\"nc\">Boolean<\/span> <span class=\"n\">notLoginFlg<\/span><span class=\"o\">;<\/span>\r\n\r\n<span class=\"o\">-<\/span>    <span class=\"nd\">@Execute<\/span><span class=\"o\">(<\/span><span class=\"n\">validator<\/span><span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"o\">)<\/span>\r\n<span class=\"o\">-<\/span>    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">index<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">-<\/span>        <span class=\"n\">notLoginFlg<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"o\">;<\/span>\r\n<span class=\"o\">-<\/span>        <span class=\"k\">return<\/span> <span class=\"s\">\"index.html\"<\/span><span class=\"o\">;<\/span>\r\n<span class=\"o\">-<\/span>    <span class=\"o\">}<\/span>\r\n\r\n<span class=\"o\">+<\/span>    <span class=\"nd\">@RequestMapping<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/\"<\/span><span class=\"o\">)<\/span>\r\n<span class=\"o\">+<\/span>    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">index<\/span><span class=\"o\">(<\/span><span class=\"nc\">ModelMap<\/span> <span class=\"n\">model<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n<span class=\"o\">+<\/span>        <span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"notLoginFlg\"<\/span><span class=\"o\">,<\/span> <span class=\"kc\">null<\/span><span class=\"o\">);<\/span>\r\n<span class=\"o\">+<\/span>        <span class=\"k\">return<\/span> <span class=\"s\">\"index\"<\/span><span class=\"o\">;<\/span>\r\n<span class=\"o\">+<\/span>    <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4f7f\u7528\u4e0d\u540c\u7684\u6ce8\u91ca\u65b9\u6cd5\u548cModelMap\u5b58\u50a8\u6570\u636e\u7684\u52a8\u4f5c\u65b9\u6cd5\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Controller<\/span>\r\n<span class=\"nd\">@RequiredArgsConstructor<\/span>\r\n<span class=\"nd\">@RequestMapping<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\"<\/span><span class=\"o\">)<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">IndexAction<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">LoginService<\/span> <span class=\"n\">loginService<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"nd\">@ModelAttribute<\/span>\r\n    <span class=\"nc\">HogeForm<\/span> <span class=\"nf\">setUpForm<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">HogeForm<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@RequestMapping<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">index<\/span><span class=\"o\">(<\/span><span class=\"nc\">HttpServletRequest<\/span> <span class=\"n\">request<\/span><span class=\"o\">,<\/span> <span class=\"nc\">HttpServletResponse<\/span> <span class=\"n\">response<\/span><span class=\"o\">,<\/span> <span class=\"nc\">HogeForm<\/span> <span class=\"n\">hogeForm<\/span><span class=\"o\">,<\/span> <span class=\"nc\">ModelMap<\/span> <span class=\"n\">model<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">model<\/span><span class=\"o\">.<\/span><span class=\"na\">put<\/span><span class=\"o\">(<\/span><span class=\"s\">\"notLoginFlg\"<\/span><span class=\"o\">,<\/span> <span class=\"kc\">null<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"s\">\"index\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>   \r\n <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u7ed3\u679c\u5c31\u662f\u8fd9\u79cd\u611f\u89c9<br \/>\n\u987a\u4fbf\u4e00\u63d0\uff0c\u5982\u679c\u628aHttpServletRequest\u548cHttpServletResponse\u4f5c\u4e3a\u53c2\u6570\u8f93\u5165\uff0c\u5b83\u4eec\u4f1a\u5e2e\u4f60\u4f20\u9012\u6570\u636e\uff0c\u5f88\u65b9\u4fbf\u3002<\/p>\n<p>\u7528\u8fd9\u79cd\u65b9\u5f0f\u6765\u6539\u53d8DI\u914d\u7f6e\u3001\u8868\u5355\u548c\u64cd\u4f5c\u5b9a\u4e49\u7684\u5199\u6cd5\u3002<\/p>\n<p>\u4f7f\u7528@RequiredArgsConstructor\u6ce8\u89e3\uff0c\u4f1a\u4e3afinal\u5b57\u6bb5\u751f\u6210\u6784\u9020\u51fd\u6570\uff0c\u56e0\u6b64\u53ef\u4ee5\u5b9e\u73b0\u5bf9\u76ee\u6807\u5b57\u6bb5\u7684\u6784\u9020\u51fd\u6570\u6ce8\u5165\uff0c\u4f7f\u4ee3\u7801\u66f4\u52a0\u6e05\u6670\u3002<br \/>\n\uff08\u6211\u8bb0\u5f97\u5728searsar2\u4e2d\uff0c\u9ed8\u8ba4\u6784\u9020\u51fd\u6570\u4e0d\u5b58\u5728\uff0c\u56e0\u6b64\u65e0\u6cd5\u8fdb\u884c\u6784\u9020\u51fd\u6570\u6ce8\u5165\uff0c\u6211\u66fe\u7ecf\u653e\u5f03\u8fc7\u3002\uff09<\/p>\n<p>\u5e94\u7528\u7a0b\u5e8f\u4e2d\uff0c\u91c7\u7528\u5c06\u53d8\u91cf\u4f20\u9012\u7ed9\u5c4f\u5e55\u7aef\u7684\u6784\u6210\u65b9\u5f0f\uff0c\u9700\u8981\u5c06\u5176\u8bbe\u7f6e\u5230MedelMap\u7b49\u7c7b\u4e2d\uff0c\u56e0\u6b64\u5728\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\u53d8\u5f97\u975e\u5e38\u9ebb\u70e6\u3002\uff08\u6211\u4e5f\u6709\u540c\u6837\u7684\u7ecf\u5386\uff0c\u975e\u5e38\u8f9b\u82e6\u3002\uff09<\/p>\n<h3>\u5f53\u4f7f\u7528path\u4f5c\u4e3a\u53d8\u91cf\u65f6<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nd\">@RequestMapping<\/span><span class=\"o\">(<\/span><span class=\"n\">value<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"\/{hoge}\/{huga}\"<\/span><span class=\"o\">)<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">index<\/span><span class=\"o\">(<\/span><span class=\"nd\">@PathVariable<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">hoge<\/span><span class=\"o\">,<\/span> <span class=\"nd\">@PathVariable<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">huga<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"s\">\"index\"<\/span><span class=\"o\">;<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u901a\u8fc7\u4f7f\u7528@PathVariable\u53ef\u4ee5\u83b7\u53d6<\/p>\n<h3>\u5f53\u4f7f\u7528@Controller\u65f6\uff0c\u60f3\u8981\u8fd4\u56deJSON\u65f6\u3002<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nd\">@RequestMapping<\/span><span class=\"o\">(<\/span><span class=\"n\">value<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"\/\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">produces<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">MediaType<\/span><span class=\"o\">.<\/span><span class=\"na\">APPLICATION_JSON_VALUE<\/span><span class=\"o\">)<\/span>\r\n<span class=\"nd\">@ResponseBody<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">index<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"s\">\"{}\"<\/span><span class=\"o\">;<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u901a\u8fc7\u4f7f\u7528 produces = MediaType.APPLICATION_JSON_VALUE \u548c @ResponseBody\uff0c\u5373\u4f7f\u5728 @Controller \u4e2d\u4e5f\u53ef\u4ee5\u8fd4\u56de JSON\u3002<br \/>\n\u7531\u4e8e\u6211\u5728 @Controller \u4e2d\u6267\u884c\u9875\u9762\u8df3\u8f6c\u5e76\u5728\u540c\u4e00\u4e2a action \u7c7b\u4e2d\u5904\u7406 ajax \u8bf7\u6c42\uff0c\u6240\u4ee5\u9700\u8981\u8fd9\u6837\u505a\u3002<\/p>\n<h3>\u4f1a\u8bdd\u4fe1\u606f\u5b58\u50a8\u7c7b<\/h3>\n<pre class=\"post-pre\"><code><span class=\"o\">-<\/span> <span class=\"nd\">@Component<\/span><span class=\"o\">(<\/span><span class=\"n\">instance<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">InstanceType<\/span><span class=\"o\">.<\/span><span class=\"na\">SESSION<\/span><span class=\"o\">)<\/span>\r\n<span class=\"o\">+<\/span> <span class=\"nd\">@Component<\/span>\r\n<span class=\"o\">+<\/span> <span class=\"nd\">@Scope<\/span><span class=\"o\">(<\/span><span class=\"n\">value<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"session\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">proxyMode<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">ScopedProxyMode<\/span><span class=\"o\">.<\/span><span class=\"na\">TARGET_CLASS<\/span><span class=\"o\">)<\/span>\r\n<\/code><\/pre>\n<p>\u53ea\u8981\u66f4\u6539\u6807\u6ce8\u5c31\u53ef\u4ee5\u4e86\u3002<\/p>\n<h3>\u901f\u5ea6 -&gt; \u65f6\u5149\u53f6<\/h3>\n<p>\u6625\u59295\u4ee5\u540e\uff0c\u4e0eVelocity\u534f\u4f5c\u7684\u7c7b\u88ab\u5220\u9664\u4e86\uff0c\u5bfc\u81f4Velocity\u65e0\u6cd5\u6b63\u5e38\u8fd0\u884c\uff0c\u6240\u4ee5\u8fc1\u79fb\u8d77\u6765\u6709\u4e9b\u56f0\u96be\u3002<br \/>\n\u5982\u679c\u4e0d\u64c5\u957f\u64cd\u4f5c\uff0c\u5c31\u6ca1\u5fc5\u8981\u52c9\u5f3a\u81ea\u5df1\u53bb\u505a\u3002<br \/>\n\u7531\u4e8e\u9700\u8981\u5c06HTML\u8c03\u6574\u4e3a\u6b63\u786e\u7684\u8bed\u6cd5\uff0c\u8fd9\u4e2a\u6b65\u9aa4\u53ef\u4ee5\u7701\u7565\u3002<br \/>\n\u5b58\u50a8\u6587\u4ef6\u5939\u4f3c\u4e4e\u4ecewebapp\u53d8\u4e3aresources\/static\u548cresources\/templates\u7b49\u3002<br \/>\n\u8fd9\u65b9\u9762\u53ef\u4ee5\u53c2\u8003Thymeleaf\u7684\u5b98\u65b9\u6587\u6863\u3002<br \/>\n\u57fa\u672c\u800c\u8a00\uff0cHTML\u7684\u8868\u73b0\u5e94\u8be5\u53ef\u4ee5\u5b9e\u73b0\u76f8\u540c\u7684\u6548\u679c\u3002<br \/>\n\u53ea\u662f\u7531\u4e8eHTML\u6587\u4ef6\u8f83\u591a\uff0c\u5b9e\u9645\u5de5\u4f5c\u4e2d\u6709\u4e00\u534a\u7684\u65f6\u95f4\u90fd\u82b1\u5728\u8fd9\u4e0a\u9762\uff0c\u771f\u7684\u5f88\u8ba9\u4eba\u6cae\u4e27\u3002<\/p>\n<h3>\u5982\u679c\u5728Velocity\u4e2d\u4f7f\u7528\u4e86\u81ea\u5b9a\u4e49\u5b8f\u51fd\u6570\u7684\u60c5\u51b5\u4e0b<\/h3>\n<p>\u5982\u679c\u6211\u4eec\u80fd\u591f\u521b\u5efa\u4e0ethymeleaf\u76f8\u540c\u7684\u4e1c\u897f\uff0c\u5c31\u80fd\u591f\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002<\/p>\n<h4>\u5b8f\u5904\u7406<\/h4>\n<pre class=\"post-pre\"><code><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">ThymeleafUtils<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">hoge<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"kc\">true<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u6211\u5c06\u5728\u67d0\u5904\u521b\u5efa\u76f8\u540c\u7684\u5b8f\u3002\u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u4e4b\u524d\u7684\u5b8f\u3002<\/p>\n<h4>\u521b\u5efa\u4e00\u4e2a\u5b8f\u8c03\u7528\u7c7b<\/h4>\n<pre class=\"post-pre\"><code> <span class=\"nd\">@Component<\/span>\r\n <span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">ThymeleafDialect<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">IExpressionObjectDialect<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">String<\/span> <span class=\"no\">KEY<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"\u547c\u3073\u51fa\u3059\u6642\u306e\u30ad\u30fc\u540d\"<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"kd\">final<\/span> <span class=\"nc\">Set<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">names<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">HashSet<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">String<\/span><span class=\"o\">&gt;()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"o\">{<\/span>\r\n            <span class=\"n\">add<\/span><span class=\"o\">(<\/span><span class=\"no\">KEY<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">};<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">IExpressionObjectFactory<\/span> <span class=\"nf\">getExpressionObjectFactory<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">IExpressionObjectFactory<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n\r\n            <span class=\"nd\">@Override<\/span>\r\n            <span class=\"kd\">public<\/span> <span class=\"nc\">Set<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"nf\">getAllExpressionObjectNames<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n                <span class=\"k\">return<\/span> <span class=\"n\">names<\/span><span class=\"o\">;<\/span>\r\n            <span class=\"o\">}<\/span>\r\n\r\n            <span class=\"nd\">@Override<\/span>\r\n            <span class=\"kd\">public<\/span> <span class=\"nc\">Object<\/span> <span class=\"nf\">buildObject<\/span><span class=\"o\">(<\/span><span class=\"nc\">IExpressionContext<\/span> <span class=\"n\">context<\/span><span class=\"o\">,<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">expressionObjectName<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n                <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"no\">KEY<\/span><span class=\"o\">.<\/span><span class=\"na\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">expressionObjectName<\/span><span class=\"o\">))<\/span> <span class=\"o\">{<\/span> <span class=\"c1\">\/\/\u540d\u524d\u304c\u4e00\u81f4\u3057\u305f\u306a\u3089<\/span>\r\n                    <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">ThymeleafUtils<\/span><span class=\"o\">();<\/span> <span class=\"c1\">\/\/ \u30de\u30af\u30ed\u3092\u8fd4\u3059<\/span>\r\n                <span class=\"o\">}<\/span>\r\n                <span class=\"k\">return<\/span> <span class=\"kc\">null<\/span><span class=\"o\">;<\/span>\r\n            <span class=\"o\">}<\/span>\r\n\r\n            <span class=\"nd\">@Override<\/span>\r\n            <span class=\"kd\">public<\/span> <span class=\"kt\">boolean<\/span> <span class=\"nf\">isCacheable<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">expressionObjectName<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n                <span class=\"k\">return<\/span> <span class=\"kc\">true<\/span><span class=\"o\">;<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">};<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">getName<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"s\">\"ThymeleafUtilsDialect\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4f7f\u7528IExpressionObjectDialect\u5e76\u6307\u5b9a\u7279\u5b9a\u7684\u952e\u65f6\uff0c\u5e94\u4f7f\u7528\u5df2\u8bbe\u7f6e\u5b8f\u7684ThymeleafUtils\u3002<\/p>\n<h4>\u6ce8\u518c\u5230\u6a21\u677f\u5f15\u64ce<\/h4>\n<pre class=\"post-pre\"><code> <span class=\"nd\">@Configuration<\/span>\r\n <span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">ThymeleafConfig<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@Autowired<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">ThymeleafDialect<\/span> <span class=\"n\">thymeleafDialect<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"nd\">@Bean<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">TemplateEngine<\/span> <span class=\"nf\">templateEngine<\/span><span class=\"o\">(<\/span><span class=\"nc\">TemplateEngine<\/span> <span class=\"n\">templateEngine<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">templateEngine<\/span><span class=\"o\">.<\/span><span class=\"na\">addDialect<\/span><span class=\"o\">(<\/span><span class=\"n\">thymeleafDialect<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">templateEngine<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4f7f\u7528\u4e4b\u524d\u6240\u521b\u5efa\u7684\u6a21\u677f\u5f15\u64ce\u914d\u7f6e\u3002\u8fd9\u6837\u5c31\u53ef\u4ee5\u5728Thymeleaf\u4e0a\u4f7f\u7528\u4e86\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nx\">$<\/span><span class=\"p\">{<\/span><span class=\"err\">#<\/span><span class=\"nx\">\u30ad\u30fc\u540d<\/span><span class=\"p\">.<\/span><span class=\"nx\">hoge<\/span><span class=\"p\">()}<\/span>\r\n<\/code><\/pre>\n<p>\u5e94\u8be5\u53ef\u4ee5\u5728\u8bf8\u5982\u8fd9\u6837\u7684\u5730\u65b9\u4f7f\u7528\u3002<\/p>\n<h3>\u9762\u5411\u5207\u9762\u7f16\u7a0b<\/h3>\n<p>\u8f6c\u79fb\u62e6\u622a\u5668\u5904\u7406<\/p>\n<pre class=\"post-pre\"><code><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">HogeInterceptor<\/span> <span class=\"kd\">extends<\/span> <span class=\"nc\">AbstractInterceptor<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">Object<\/span> <span class=\"nf\">invoke<\/span><span class=\"o\">(<\/span><span class=\"nc\">MethodInvocation<\/span> <span class=\"n\">invocation<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">Throwable<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">invocation<\/span><span class=\"o\">.<\/span><span class=\"na\">proceed<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5728seasar2\u4e2d\uff0c\u6211\u8ba4\u4e3a\u53ef\u4ee5\u5c06\u5176\u5b9a\u4e49\u5728customizer.dicon\u6587\u4ef6\u4e2d\uff0c\u5e76\u4ee5\u7c7b\u4f3c\u7684\u65b9\u5f0f\u6765\u5b9e\u73b0\u3002<\/p>\n<p>\u79fb\u884c\u540e\u7684\u611f\u89c9\u5982\u4e0b\u3002\u6211\u4eec\u5c06\u5728Java\u5185\u7f16\u5199\u62e6\u622a\u6761\u4ef6\u7b49\u3002<br \/>\n\u5728\u4ee5\u4e0b\u793a\u4f8b\u4e2d\uff0c\u5f53\u7ecf\u8fc7\u4e0eaction\u5305\u76f8\u5173\u7684\u5904\u7406\u65f6\uff0c\u5c06\u8fdb\u884c\u62e6\u622a\u3002<br \/>\n\u5982\u679c\u4e0d\u9700\u8981Order\uff0c\u4f46\u60f3\u8981\u63d2\u5165\u591a\u4e2a\u62e6\u622a\u5668\u5e76\u63a7\u5236\u987a\u5e8f\uff0c\u5efa\u8bae\u4f7f\u7528\u5b83\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Order<\/span><span class=\"o\">(<\/span><span class=\"mi\">10<\/span><span class=\"o\">)<\/span>\r\n<span class=\"nd\">@Component<\/span>\r\n<span class=\"nd\">@Aspect<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">HogeInterceptor<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@Around<\/span><span class=\"o\">(<\/span><span class=\"s\">\"execution(* *..*Action.*(..))\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">Object<\/span> <span class=\"nf\">invoke<\/span><span class=\"o\">(<\/span><span class=\"nc\">ProceedingJoinPoint<\/span> <span class=\"n\">jp<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">Throwable<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">MethodSignature<\/span> <span class=\"n\">signature<\/span> <span class=\"o\">=<\/span> <span class=\"o\">(<\/span><span class=\"nc\">MethodSignature<\/span><span class=\"o\">)<\/span> <span class=\"n\">jp<\/span><span class=\"o\">.<\/span><span class=\"na\">getSignature<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"nc\">Method<\/span> <span class=\"n\">method<\/span> <span class=\"o\">=<\/span> <span class=\"n\">signature<\/span><span class=\"o\">.<\/span><span class=\"na\">getMethod<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">jp<\/span><span class=\"o\">.<\/span><span class=\"na\">proceed<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span> \r\n <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u7ecf\u5e38\u7528\u5230\u7684Method\u548cClass&lt;?&gt;\u5f88\u65b9\u4fbf\u5feb\u901f\u83b7\u53d6\u3002<\/p>\n<h3>\u5355\u4f8bS2\u5bb9\u5668<\/h3>\n<pre class=\"post-pre\"><code><span class=\"o\">-<\/span> <span class=\"nc\">SingletonS2Container<\/span><span class=\"o\">.<\/span><span class=\"na\">getComponent<\/span><span class=\"o\">(<\/span><span class=\"s\">\"hogehoge\"<\/span><span class=\"o\">);<\/span>\r\n<span class=\"o\">+<\/span> <span class=\"nc\">ApplicationContextProvider<\/span><span class=\"o\">.<\/span><span class=\"na\">getApplicationContext<\/span><span class=\"o\">().<\/span><span class=\"na\">getBean<\/span><span class=\"o\">(<\/span><span class=\"nc\">HogeHoge<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\r\n<\/code><\/pre>\n<p>\u7531\u4e8eSingletonS2Container\u4e0d\u518d\u5b58\u5728\uff0c\u6240\u4ee5\u9700\u8981\u4eceSpring\u5bb9\u5668\u4e2d\u83b7\u53d6\u4fe1\u606f\u6765\u8fdb\u884c\u66f4\u6539\u3002<\/p>\n<h3>\u5f53\u4ecejar\u6587\u4ef6\u4e2d\u8c03\u7528\u65f6<\/h3>\n<p>\u5982\u679c\u539f\u59cb\u7684\u5f62\u5f0f\u662f\u5728Java\u4e2d\u653e\u7f6e\u4e00\u4e2amain\u7c7b\u5e76\u8c03\u7528\u5b83\uff0c<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">CLASSPATH<\/span><span class=\"o\">=<\/span><span class=\"nv\">$CLASSPATH<\/span>:<span class=\"nv\">$ROOTDIR<\/span>\/bin\/batch.jar\r\njava <span class=\"nt\">-cp<\/span> <span class=\"nv\">$CLASSPATH<\/span> hogehoge.batch.job.BatchJob\r\n<\/code><\/pre>\n<p>\u79fb\u884c\u540e\u7684\u60c5\u51b5\u662f\u8fd9\u6837\u7684<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">ENVIRONMENT_NAME<\/span><span class=\"o\">=<\/span>dev\r\njava <span class=\"nt\">-jar<\/span> <span class=\"nt\">-Dspring<\/span>.profiles.active<span class=\"o\">=<\/span><span class=\"nv\">$ENVIRONMENT_NAME<\/span> <span class=\"nt\">-Dserver<\/span>.port<span class=\"o\">=<\/span>9000 <span class=\"nt\">-Dbatch<\/span>.execute<span class=\"o\">=<\/span>BatchJob <span class=\"nv\">$ROOTDIR<\/span>\/bin\/batch.jar\r\n<\/code><\/pre>\n<p>\u5728\u4e2a\u4eba\u8d44\u6599\u4e0a\uff0c\u53ef\u4ee5\u901a\u8fc7\u53d8\u91cf\u6765\u5207\u6362\u548c\u83b7\u53d6\u4fe1\u606f\u3002<\/p>\n<p>\u4e3b\u8981\u5728\u901a\u8fc7sh\u8c03\u7528\u6279\u5904\u7406\u65f6\uff0c\u6211\u4eec\u4f7f\u7528\u4e86Java\u547d\u4ee4\u8fdb\u884c\u8c03\u7528\uff0c\u6240\u4ee5\u9700\u8981\u505a\u76f8\u5e94\u7684\u9002\u914d\u3002<br \/>\n\u5728Java\u7aef\uff0c\u5c06\u91c7\u7528\u4ee5\u4e0b\u65b9\u5f0f\u5b9e\u73b0\uff0c\u4f7f\u7528ApplicationRunner\u8fdb\u884c\u5b9e\u73b0\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">BatchJob<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">ApplicationRunner<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">run<\/span><span class=\"o\">(<\/span><span class=\"nc\">ApplicationArguments<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">Exception<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"o\">}<\/span>  \r\n\r\n    <span class=\"nd\">@Configuration<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">BatchConfig<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nd\">@Bean<\/span>\r\n        <span class=\"nd\">@ConditionalOnProperty<\/span><span class=\"o\">(<\/span><span class=\"n\">value<\/span> <span class=\"o\">=<\/span> <span class=\"o\">{<\/span> <span class=\"s\">\"batch.execute\"<\/span> <span class=\"o\">},<\/span> <span class=\"n\">havingValue<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"BatchJob\"<\/span><span class=\"o\">)<\/span>\r\n        <span class=\"kd\">public<\/span> <span class=\"nc\">BatchJob<\/span> <span class=\"nf\">batchJob<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">BatchJob<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u9053<\/h3>\n<p>\u5728Spring Boot\u4e2d\u9700\u8981\u4f7f\u7528@ConfigAutowireable\u8fdb\u884c\u6dfb\u52a0\uff0c\u867d\u7136Dao\u7c7b\u662f\u7531doma-gen\u81ea\u52a8\u751f\u6210\u7684\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">+<\/span> <span class=\"nd\">@ConfigAutowireable<\/span>\r\n <span class=\"nd\">@Dao<\/span>\r\n <span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">HogeDao<\/span> <span class=\"o\">{<\/span>\r\n <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4fee\u6539\u81ea\u52a8\u751f\u6210\u6a21\u677f\u540e\uff0c\u4e4b\u540e\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u5316\u3002<\/p>\n<h3>\u50cf\u662fHelper\u8fd9\u6837\u7684\u7ec4\u4ef6<\/h3>\n<p>\u7ed9\u8fd9\u4e2a\u7c7b\u6dfb\u52a0@Component\u6ce8\u89e3\uff0c\u5982\u679c\u8fd8\u6dfb\u52a0@RequiredArgsConstructor\u6ce8\u89e3\uff0c\u5c31\u4e0d\u9700\u8981@Autowired\u6ce8\u89e3\u4e86\uff0c\u4ee3\u7801\u4f1a\u53d8\u5f97\u66f4\u7b80\u6d01\u3002<\/p>\n<p>\u5bf9\u4e8e\u670d\u52a1\u7c7b\uff0c\u8981\u4f7f\u7528`@Service`\u8fdb\u884c\u6807\u6ce8\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">\/\/ \u5143\u306e\u3084\u3064<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">HogeHelper<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@Resource<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">HogeDao<\/span> <span class=\"n\">hogeDao<\/span><span class=\"o\">;<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<span class=\"c1\">\/\/ \u79fb\u884c\u5f8c<\/span>\r\n<span class=\"nd\">@Component<\/span>\r\n<span class=\"nd\">@RequiredArgsConstructor<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">HogeHelper<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">HogeDao<\/span> <span class=\"n\">hogeDao<\/span><span class=\"o\">;<\/span>\r\n<span class=\"o\">}<\/span>\r\n\r\n<span class=\"c1\">\/\/ service<\/span>\r\n<span class=\"nd\">@Service<\/span>\r\n<span class=\"nd\">@RequiredArgsConstructor<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">HogeService<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">HogeHelper<\/span> <span class=\"n\">hogeHelper<\/span><span class=\"o\">;<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u5207\u6362\u8fde\u63a5\u7684\u6570\u636e\u5e93\u3002 de .)<\/h3>\n<p>\u56e0\u4e3aseasar2\u548c\u539f\u6765\u7684\u65b9\u6cd5\u6709\u5f88\u5927\u7684\u4e0d\u540c\uff0c\u4e00\u5f00\u59cb\u6211\u6709\u70b9\u9677\u5165\u56f0\u5883\u3002<br \/>\n\u539f\u6765\u7684\u65b9\u5f0f\u662f\u5728dao\u5305\u4e2d\u7684\u5904\u7406\u4e2d\u6dfb\u52a0\u62e6\u622a\u5668\uff0c\u5c06dataSource\u540d\u8bbe\u7f6e\u5230DataSourceFactory\u4e2d\u3002<br \/>\n\u7531\u4e8e\u6ca1\u6709\u4e86DataSourceFactory\uff0c\u4e3a\u4e86\u4ee5\u540c\u6837\u7684\u65b9\u5f0f\u8fdb\u884c\u64cd\u4f5c\uff0c\u6211\u521b\u5efa\u4e86\u4e00\u4e2a\u6301\u6709\u76ee\u6807\u6570\u636e\u5e93\u7684\u6301\u6709\u8005\uff0c\u5728\u8fde\u63a5\u65f6\u4ece\u8be5\u6301\u6709\u8005\u4e2d\u83b7\u53d6\uff0c\u91c7\u7528\u8fd9\u79cd\u65b9\u5f0f\u3002<\/p>\n<p>\u5728doma\u7684\u8bbe\u7f6e\u4e2d\uff0c\u9010\u6b65\u5c06\u5176\u66f4\u6539\u4e3a\u5f15\u7528\u6b64\u6301\u6709\u8005\u3002<\/p>\n<h4>\u5207\u6362\u62e6\u622a\u5668<\/h4>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Component<\/span>\r\n<span class=\"nd\">@Aspect<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">HogeInterceptor<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@Around<\/span><span class=\"o\">(<\/span><span class=\"s\">\"execution(* *..*Dao.*(..))\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">Object<\/span> <span class=\"nf\">invoke<\/span><span class=\"o\">(<\/span><span class=\"nc\">ProceedingJoinPoint<\/span> <span class=\"n\">jp<\/span><span class=\"o\">)<\/span> <span class=\"kd\">throws<\/span> <span class=\"nc\">Throwable<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">Schema<\/span> <span class=\"n\">schema<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">SchemaHolder<\/span><span class=\"o\">.<\/span><span class=\"na\">getSchema<\/span><span class=\"o\">()<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">null<\/span> <span class=\"o\">?<\/span> <span class=\"nc\">Schema<\/span><span class=\"o\">.<\/span><span class=\"na\">DEFAULT<\/span> <span class=\"o\">:<\/span> <span class=\"nc\">SchemaHolder<\/span><span class=\"o\">.<\/span><span class=\"na\">getSchema<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"c1\">\/\/ \u3053\u3053\u3067\u5207\u308a\u66ff\u3048\u305f\u3044DB\u306edataSourceName\u3092\u3068\u3063\u3066\u304f\u308b<\/span>\r\n        <span class=\"nc\">String<\/span> <span class=\"n\">dataSourceName<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"hogehogeDataSource\"<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"k\">try<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"nc\">SchemaHolder<\/span><span class=\"o\">.<\/span><span class=\"na\">setSchema<\/span><span class=\"o\">(<\/span><span class=\"n\">dataSourceName<\/span><span class=\"o\">);<\/span>\r\n            <span class=\"k\">return<\/span> <span class=\"n\">jp<\/span><span class=\"o\">.<\/span><span class=\"na\">proceed<\/span><span class=\"o\">();<\/span>\r\n        <span class=\"o\">}<\/span> <span class=\"k\">finally<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"c1\">\/\/ \u623b\u3059<\/span>\r\n            <span class=\"nc\">SchemaHolder<\/span><span class=\"o\">.<\/span><span class=\"na\">setSchema<\/span><span class=\"o\">(<\/span><span class=\"n\">schema<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span>\r\n <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h4>\u4e00\u4e2a\u7528\u4e8e\u6301\u6709\u8005\u7684\u7c7b<\/h4>\n<pre class=\"post-pre\"><code><span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">SchemaHolder<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@AllArgsConstructor<\/span>\r\n    <span class=\"nd\">@Getter<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">enum<\/span> <span class=\"nc\">Schema<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"no\">DEFAULT<\/span><span class=\"o\">(<\/span><span class=\"s\">\"defaultDataSource\"<\/span><span class=\"o\">),<\/span>\r\n        <span class=\"no\">HOGEHOGE<\/span><span class=\"o\">(<\/span><span class=\"s\">\"hogehogeDataSource\"<\/span><span class=\"o\">),<\/span>\r\n        <span class=\"o\">;<\/span>\r\n        <span class=\"kd\">private<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">name<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"kd\">static<\/span> <span class=\"kd\">final<\/span> <span class=\"nc\">ThreadLocal<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Schema<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">schemaHolder<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">ThreadLocal<\/span><span class=\"o\">&lt;&gt;();<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setSchema<\/span><span class=\"o\">(<\/span><span class=\"nc\">Schema<\/span> <span class=\"n\">schema<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">schemaHolder<\/span><span class=\"o\">.<\/span><span class=\"na\">set<\/span><span class=\"o\">(<\/span><span class=\"n\">schema<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">setSchema<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span> <span class=\"n\">name<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">for<\/span> <span class=\"o\">(<\/span><span class=\"nc\">Schema<\/span> <span class=\"n\">schema<\/span> <span class=\"o\">:<\/span> <span class=\"nc\">Schema<\/span><span class=\"o\">.<\/span><span class=\"na\">values<\/span><span class=\"o\">())<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">schema<\/span><span class=\"o\">.<\/span><span class=\"na\">getName<\/span><span class=\"o\">().<\/span><span class=\"na\">equals<\/span><span class=\"o\">(<\/span><span class=\"n\">name<\/span><span class=\"o\">))<\/span> <span class=\"o\">{<\/span>\r\n                <span class=\"n\">setSchema<\/span><span class=\"o\">(<\/span><span class=\"n\">schema<\/span><span class=\"o\">);<\/span>\r\n                <span class=\"k\">break<\/span><span class=\"o\">;<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">}<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"nc\">Schema<\/span> <span class=\"nf\">getSchema<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">schemaHolder<\/span><span class=\"o\">.<\/span><span class=\"na\">get<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">clear<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">schemaHolder<\/span><span class=\"o\">.<\/span><span class=\"na\">remove<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u591a\u9ebb\u4e8c (Du\u014d m\u00e1 \u00e8r)<\/h3>\n<p>\u5bf9\u4e8edoma\u7684\u60c5\u51b5\uff0c\u901a\u8fc7\u5b9e\u73b0org.seasar.doma.jdbc.Config\u5e76\u5b9a\u4e49\u8bbe\u7f6e\uff0c\u56e0\u6b64\u53ef\u4ee5\u91cd\u65b0\u7f16\u5199\u8be5\u90e8\u5206\u3002<\/p>\n<p>\u6839\u636e\u6211\u4eec\u6240\u77e5\uff0c\u4f7f\u7528MyBatis\u65f6\u4f3c\u4e4e\u4e0d\u9700\u8981\uff0c\u4f46\u5982\u679c\u4f7f\u7528Doma\uff0c\u4e3a\u4e86\u4f7f\u4e8b\u52a1\u53c2\u4e0e\u5176\u4e2d\uff0c\u9700\u8981\u901a\u8fc7TransactionAwareDataSourceProxy\u5bf9DataSource\u8fdb\u884c\u5305\u88c5\u3002<\/p>\n<p>\u5c06tomcat\u548cdatasource\u7684\u914d\u7f6e\u5199\u5165yml\u6587\u4ef6\uff0c\u5e76\u901a\u8fc7\u8bfb\u53d6\u548c\u8bbe\u7f6e\u6765\u5b9e\u73b0\u3002<\/p>\n<p>\u4f7f\u7528\u5148\u524d\u7684\u6301\u6709\u8005\u8fdb\u884cDB\u5207\u6362<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Configuration<\/span>\r\n<span class=\"nd\">@EnableTransactionManagement<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">DaoAppConfig<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">Config<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"nd\">@Bean<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">DataSource<\/span> <span class=\"nf\">getDataSource<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">dataSource<\/span> <span class=\"o\">!=<\/span> <span class=\"kc\">null<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"k\">return<\/span> <span class=\"n\">dataSource<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"o\">}<\/span>\r\n        <span class=\"nc\">AbstractRoutingDataSource<\/span> <span class=\"n\">abstractRoutingDataSource<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">AbstractRoutingDataSource<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"nd\">@Override<\/span>\r\n            <span class=\"kd\">protected<\/span> <span class=\"nc\">Object<\/span> <span class=\"nf\">determineCurrentLookupKey<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n                <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"nc\">SchemaHolder<\/span><span class=\"o\">.<\/span><span class=\"na\">getSchema<\/span><span class=\"o\">()<\/span> <span class=\"o\">==<\/span> <span class=\"kc\">null<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n                    <span class=\"k\">return<\/span> <span class=\"nc\">Schema<\/span><span class=\"o\">.<\/span><span class=\"na\">DEFAULT<\/span><span class=\"o\">.<\/span><span class=\"na\">getName<\/span><span class=\"o\">();<\/span>\r\n                <span class=\"o\">}<\/span>\r\n                <span class=\"k\">return<\/span> <span class=\"nc\">SchemaHolder<\/span><span class=\"o\">.<\/span><span class=\"na\">getSchema<\/span><span class=\"o\">().<\/span><span class=\"na\">getName<\/span><span class=\"o\">();<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">};<\/span>\r\n\r\n        <span class=\"nc\">Map<\/span><span class=\"o\">&lt;<\/span><span class=\"nc\">Object<\/span><span class=\"o\">,<\/span> <span class=\"nc\">Object<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">dataSources<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Map<\/span><span class=\"o\">.<\/span><span class=\"na\">ofEntries<\/span><span class=\"o\">(<\/span>\r\n            <span class=\"n\">entry<\/span><span class=\"o\">(<\/span><span class=\"nc\">Schema<\/span><span class=\"o\">.<\/span><span class=\"na\">DEFAULT<\/span><span class=\"o\">.<\/span><span class=\"na\">getName<\/span><span class=\"o\">(),<\/span> <span class=\"n\">defaultDataSource<\/span><span class=\"o\">()),<\/span>\r\n            <span class=\"n\">entry<\/span><span class=\"o\">(<\/span><span class=\"nc\">Schema<\/span><span class=\"o\">.<\/span><span class=\"na\">HOGEHOGE<\/span><span class=\"o\">.<\/span><span class=\"na\">getName<\/span><span class=\"o\">(),<\/span> <span class=\"n\">hogehogeDataSource<\/span><span class=\"o\">()),<\/span>\r\n        <span class=\"o\">);<\/span>\r\n        <span class=\"n\">abstractRoutingDataSource<\/span><span class=\"o\">.<\/span><span class=\"na\">setTargetDataSources<\/span><span class=\"o\">(<\/span><span class=\"n\">dataSources<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">abstractRoutingDataSource<\/span><span class=\"o\">.<\/span><span class=\"na\">setDefaultTargetDataSource<\/span><span class=\"o\">(<\/span><span class=\"n\">defaultDataSource<\/span><span class=\"o\">());<\/span>\r\n        <span class=\"n\">dataSource<\/span> <span class=\"o\">=<\/span> <span class=\"n\">abstractRoutingDataSource<\/span><span class=\"o\">;<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">dataSource<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Bean<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">DataSource<\/span> <span class=\"nf\">defaultDataSource<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">TransactionAwareDataSourceProxy<\/span><span class=\"o\">(<\/span><span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">tomcatJdbcConnectionPool<\/span><span class=\"o\">(<\/span><span class=\"n\">defaultDbc<\/span><span class=\"o\">(),<\/span> <span class=\"n\">dbcProp<\/span><span class=\"o\">()));<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Bean<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">DataSource<\/span> <span class=\"nf\">hogehogeDataSource<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">TransactionAwareDataSourceProxy<\/span><span class=\"o\">(<\/span><span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">tomcatJdbcConnectionPool<\/span><span class=\"o\">(<\/span><span class=\"n\">hogehogeDbc<\/span><span class=\"o\">(),<\/span> <span class=\"n\">dbcProp<\/span><span class=\"o\">()));<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Bean<\/span>\r\n    <span class=\"nd\">@ConfigurationProperties<\/span><span class=\"o\">(<\/span><span class=\"n\">prefix<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"spring.datasource.default\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">protected<\/span> <span class=\"nc\">DataBaseConnectionSetting<\/span> <span class=\"nf\">defaultDbc<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">PostgresqlConnectionSetting<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Bean<\/span>\r\n    <span class=\"nd\">@ConfigurationProperties<\/span><span class=\"o\">(<\/span><span class=\"n\">prefix<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"spring.datasource.hogehoge\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">protected<\/span> <span class=\"nc\">DataBaseConnectionSetting<\/span> <span class=\"nf\">hogehogeDbc<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">PostgresqlConnectionSetting<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Bean<\/span>\r\n    <span class=\"nd\">@ConfigurationProperties<\/span><span class=\"o\">(<\/span><span class=\"n\">prefix<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"spring.datasource.tomcat\"<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">protected<\/span> <span class=\"nc\">DataBaseConnectionSettingProperties<\/span> <span class=\"nf\">dbcProp<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">PostgresqlConnectionSettingProperties<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"kd\">private<\/span> <span class=\"n\">org<\/span><span class=\"o\">.<\/span><span class=\"na\">apache<\/span><span class=\"o\">.<\/span><span class=\"na\">tomcat<\/span><span class=\"o\">.<\/span><span class=\"na\">jdbc<\/span><span class=\"o\">.<\/span><span class=\"na\">pool<\/span><span class=\"o\">.<\/span><span class=\"na\">DataSource<\/span> <span class=\"nf\">tomcatJdbcConnectionPool<\/span><span class=\"o\">(<\/span><span class=\"nc\">DataBaseConnectionSetting<\/span> <span class=\"n\">dbc<\/span><span class=\"o\">,<\/span> <span class=\"nc\">DataBaseConnectionSettingProperties<\/span> <span class=\"n\">dbcProp<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"n\">org<\/span><span class=\"o\">.<\/span><span class=\"na\">apache<\/span><span class=\"o\">.<\/span><span class=\"na\">tomcat<\/span><span class=\"o\">.<\/span><span class=\"na\">jdbc<\/span><span class=\"o\">.<\/span><span class=\"na\">pool<\/span><span class=\"o\">.<\/span><span class=\"na\">DataSource<\/span> <span class=\"n\">ds<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">org<\/span><span class=\"o\">.<\/span><span class=\"na\">apache<\/span><span class=\"o\">.<\/span><span class=\"na\">tomcat<\/span><span class=\"o\">.<\/span><span class=\"na\">jdbc<\/span><span class=\"o\">.<\/span><span class=\"na\">pool<\/span><span class=\"o\">.<\/span><span class=\"na\">DataSource<\/span><span class=\"o\">();<\/span>\r\n\r\n        <span class=\"c1\">\/\/ \u63a5\u7d9a\u5148\u60c5\u5831\u7b49\u3092\u8a2d\u5b9a<\/span>\r\n        <span class=\"n\">ds<\/span><span class=\"o\">.<\/span><span class=\"na\">setDriverClassName<\/span><span class=\"o\">(<\/span><span class=\"n\">dbc<\/span><span class=\"o\">.<\/span><span class=\"na\">getDriver<\/span><span class=\"o\">());<\/span>\r\n        <span class=\"n\">ds<\/span><span class=\"o\">.<\/span><span class=\"na\">setUsername<\/span><span class=\"o\">(<\/span><span class=\"n\">dbc<\/span><span class=\"o\">.<\/span><span class=\"na\">getUser<\/span><span class=\"o\">());<\/span>\r\n        <span class=\"n\">ds<\/span><span class=\"o\">.<\/span><span class=\"na\">setPassword<\/span><span class=\"o\">(<\/span><span class=\"n\">dbc<\/span><span class=\"o\">.<\/span><span class=\"na\">getPassword<\/span><span class=\"o\">());<\/span>\r\n        <span class=\"n\">ds<\/span><span class=\"o\">.<\/span><span class=\"na\">setUrl<\/span><span class=\"o\">(<\/span><span class=\"n\">dbc<\/span><span class=\"o\">.<\/span><span class=\"na\">getUrl<\/span><span class=\"o\">());<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">ds<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Bean<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">PlatformTransactionManager<\/span> <span class=\"nf\">transactionManager<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">PlatformTransactionManager<\/span><span class=\"o\">[]<\/span> <span class=\"n\">platformTransactionManagers<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">PlatformTransactionManager<\/span><span class=\"o\">[]<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"k\">new<\/span> <span class=\"nf\">DataSourceTransactionManager<\/span><span class=\"o\">(<\/span><span class=\"n\">defaultDataSource<\/span><span class=\"o\">()),<\/span>\r\n            <span class=\"k\">new<\/span> <span class=\"nf\">DataSourceTransactionManager<\/span><span class=\"o\">(<\/span><span class=\"n\">hogehogeDataSource<\/span><span class=\"o\">()),<\/span>\r\n        <span class=\"o\">};<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">ChainedTransactionManager<\/span><span class=\"o\">(<\/span><span class=\"n\">platformTransactionManagers<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>DB\u8bbe\u7f6e\u7684\u65b9\u6cd5\u63a5\u53e3<\/p>\n<pre class=\"post-pre\"><code><span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">DataBaseConnectionSettingProperties<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nc\">Integer<\/span> <span class=\"nf\">getMaxActive<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Integer<\/span> <span class=\"nf\">getInitialSize<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Integer<\/span> <span class=\"nf\">getMaxIdle<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Integer<\/span> <span class=\"nf\">getMinIdle<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Integer<\/span> <span class=\"nf\">getMaxAge<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Boolean<\/span> <span class=\"nf\">getFairQueue<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Integer<\/span> <span class=\"nf\">getMaxWait<\/span><span class=\"o\">();<\/span> \r\n    <span class=\"nc\">Boolean<\/span> <span class=\"nf\">getTestOnBorrow<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Boolean<\/span> <span class=\"nf\">getTestOnReturn<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">String<\/span> <span class=\"nf\">getValidationQuery<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Integer<\/span> <span class=\"nf\">getValidationQueryTimeout<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Integer<\/span> <span class=\"nf\">getValidationInterval<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Boolean<\/span> <span class=\"nf\">getTestWhileIdle<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Integer<\/span> <span class=\"nf\">getTimeBetweenEvictionRunsMillis<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Integer<\/span> <span class=\"nf\">getMinEvictableIdleTimeMillis<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Boolean<\/span> <span class=\"nf\">getRemoveAbandoned<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Integer<\/span> <span class=\"nf\">getRemoveAbandonedTimeout<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">String<\/span> <span class=\"nf\">getConnectionProperties<\/span><span class=\"o\">();<\/span>\r\n <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u6570\u636e\u5e93\u8bbe\u7f6e\u7684\u5c5e\u6027\u7c7b (DB\u8bbe\u7f6e\u5c5e\u6027\u7684\u7c7b)<\/p>\n<pre class=\"post-pre\"><code> <span class=\"nd\">@Data<\/span>\r\n <span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">PostgresqlConnectionSettingProperties<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">DataBaseConnectionSettingProperties<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">maxActive<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">initialSize<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">maxIdle<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">minIdle<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">maxAge<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Boolean<\/span> <span class=\"n\">fairQueue<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">maxWait<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Boolean<\/span> <span class=\"n\">testOnBorrow<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Boolean<\/span> <span class=\"n\">testOnReturn<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">validationQuery<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">validationQueryTimeout<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">validationInterval<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Boolean<\/span> <span class=\"n\">testWhileIdle<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">timeBetweenEvictionRunsMillis<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">minEvictableIdleTimeMillis<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Boolean<\/span> <span class=\"n\">removeAbandoned<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">removeAbandonedTimeout<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">connectionProperties<\/span><span class=\"o\">;<\/span>\r\n <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>DB\u8a2d\u7f6e\u7684\u9023\u63a5\u4ecb\u9762<\/p>\n<pre class=\"post-pre\"><code> <span class=\"kd\">public<\/span> <span class=\"kd\">interface<\/span> <span class=\"nc\">DataBaseConnectionSetting<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"nc\">String<\/span> <span class=\"nf\">getUrl<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">String<\/span> <span class=\"nf\">getUser<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">String<\/span> <span class=\"nf\">getPassword<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">String<\/span> <span class=\"nf\">getDriver<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">String<\/span> <span class=\"nf\">getDriverClassName<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Integer<\/span> <span class=\"nf\">getMaxActive<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Integer<\/span> <span class=\"nf\">getInitialSize<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Integer<\/span> <span class=\"nf\">getMaxIdle<\/span><span class=\"o\">();<\/span>\r\n    <span class=\"nc\">Integer<\/span> <span class=\"nf\">getMinIdle<\/span><span class=\"o\">();<\/span>\r\n <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u6570\u636e\u5e93\u8bbe\u7f6e\u7684\u8fde\u63a5\u7c7b (DB\u8bbe\u7f6e\u7684\u8fde\u63a5\u7c7b)<\/p>\n<pre class=\"post-pre\"><code> <span class=\"nd\">@Data<\/span>\r\n <span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">PostgresqlConnectionSetting<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">DataBaseConnectionSetting<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">driver<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"org.postgresql.Driver\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">port<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">5432<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">domain<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"127.0.0.1\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">schema<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">user<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">password<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">String<\/span> <span class=\"n\">dbname<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"postgresql\"<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">maxActive<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">initialSize<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">maxIdle<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">Integer<\/span> <span class=\"n\">minIdle<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">null<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">getUrl<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"nc\">String<\/span><span class=\"o\">.<\/span><span class=\"na\">format<\/span><span class=\"o\">(<\/span><span class=\"s\">\"jdbc:%s:\/\/%s:%s\/%s\"<\/span><span class=\"o\">,<\/span> <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">dbname<\/span><span class=\"o\">,<\/span> <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">domain<\/span><span class=\"o\">,<\/span> <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">port<\/span><span class=\"o\">,<\/span> <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">schema<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@Override<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">String<\/span> <span class=\"nf\">getDriverClassName<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"n\">driver<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u5e94\u7528\u914d\u7f6e\u6587\u4ef6.yml<\/h3>\n<p>\u63cf\u8ff0\u5e94\u7528\u7a0b\u5e8f\u7684\u8bbe\u7f6e<\/p>\n<p>\u6839\u636e\u542f\u52a8\u65f6\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u4f1a\u8bfb\u53d6\u5e76\u8986\u76d6\u5bf9\u5e94\u7684 application-[profile\u540d\u79f0].yml \u6587\u4ef6\u7684\u8bbe\u7f6e\uff0c\u56e0\u6b64\u53ef\u4ee5\u5728 application.yml \u4e2d\u7f16\u5199\u9ed8\u8ba4\u8bbe\u7f6e\uff0c\u5e76\u6839\u636e\u6bcf\u4e2a\u914d\u7f6e\u6587\u4ef6\u8fdb\u884c\u7279\u5b9a\u7684\u66f4\u6539\u3002\u53e6\u5916\uff0c\u7531\u4e8e\u4f7f\u7528\u4e86 actuator \u548c spring boot admin\uff0c\u9700\u8981\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d\u8bf4\u660e\u8fd9\u4e00\u70b9\u3002<\/p>\n<h4>\u5e94\u7528\u914d\u7f6e\u6587\u4ef6\u3002<\/h4>\n<pre class=\"post-pre\"><code> <span class=\"s\">spring.thymeleaf.mode<\/span><span class=\"pi\">:<\/span> <span class=\"s\">HTML<\/span> \r\n <span class=\"s\">spring.datasource.initialization-mode<\/span><span class=\"pi\">:<\/span> <span class=\"s\">NEVER<\/span>\r\n <span class=\"s\">spring.datasource.type<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">[<\/span><span class=\"nv\">org.seasar.doma.jdbc.Config\u3092implements\u3057\u305f\u30af\u30e9\u30b9<\/span><span class=\"pi\">]<\/span> \r\n <span class=\"s\">spring.main.allow-bean-definition-overriding<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n\r\n<span class=\"s\">server.connection-timeout<\/span><span class=\"pi\">:<\/span> <span class=\"m\">600000<\/span>\r\n\r\n<span class=\"s\">spring.datasource.tomcat<\/span><span class=\"pi\">:<\/span>\r\n   <span class=\"na\">maxActive<\/span><span class=\"pi\">:<\/span> <span class=\"m\">10<\/span>\r\n   <span class=\"na\">initialSize<\/span><span class=\"pi\">:<\/span> <span class=\"m\">10<\/span>\r\n   <span class=\"na\">maxIdle<\/span><span class=\"pi\">:<\/span> <span class=\"m\">2<\/span>\r\n   <span class=\"na\">minIdle<\/span><span class=\"pi\">:<\/span> <span class=\"m\">1<\/span>\r\n\r\n <span class=\"na\">spring<\/span><span class=\"pi\">:<\/span>\r\n   <span class=\"na\">datasource<\/span><span class=\"pi\">:<\/span>\r\n     <span class=\"na\">default<\/span><span class=\"pi\">:<\/span>\r\n       <span class=\"na\">domain<\/span><span class=\"pi\">:<\/span> <span class=\"s\">localhost<\/span>\r\n       <span class=\"na\">user<\/span><span class=\"pi\">:<\/span> <span class=\"s\">user<\/span>\r\n       <span class=\"na\">password<\/span><span class=\"pi\">:<\/span> <span class=\"s\">password<\/span>\r\n       <span class=\"na\">schema<\/span><span class=\"pi\">:<\/span> <span class=\"s\">default<\/span>\r\n     <span class=\"na\">hogehoge<\/span><span class=\"pi\">:<\/span>\r\n       <span class=\"na\">domain<\/span><span class=\"pi\">:<\/span> <span class=\"s\">localhost<\/span>\r\n       <span class=\"na\">user<\/span><span class=\"pi\">:<\/span> <span class=\"s\">user<\/span>\r\n       <span class=\"na\">password<\/span><span class=\"pi\">:<\/span> <span class=\"s\">password<\/span>\r\n       <span class=\"na\">schema<\/span><span class=\"pi\">:<\/span> <span class=\"s\">hogehoge<\/span>\r\n\r\n <span class=\"na\">management<\/span><span class=\"pi\">:<\/span>\r\n   <span class=\"na\">endpoints<\/span><span class=\"pi\">:<\/span>\r\n     <span class=\"na\">web<\/span><span class=\"pi\">:<\/span>\r\n       <span class=\"na\">base-path<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/actuator<\/span>\r\n       <span class=\"na\">exposure<\/span><span class=\"pi\">:<\/span>\r\n         <span class=\"na\">exclude<\/span><span class=\"pi\">:<\/span> <span class=\"s1\">'<\/span><span class=\"s\">*'<\/span>\r\n   <span class=\"na\">endpoint<\/span><span class=\"pi\">:<\/span>\r\n     <span class=\"na\">shutdown<\/span><span class=\"pi\">:<\/span>\r\n       <span class=\"na\">enabled<\/span><span class=\"pi\">:<\/span> <span class=\"no\">false<\/span>\r\n<\/code><\/pre>\n<p>\u57fa\u672c\u7684\u8bbe\u7f6e\u548c\u7528\u4e8edoma2\u52a0\u8f7d\u7684\u6570\u636e\u5e93\u8bbe\u7f6e\u4ee5\u53caactuator\u8bbe\u7f6e\u90fd\u88ab\u5b8c\u6210\u4e86<\/p>\n<h4>\u5e94\u7528\u5f00\u53d1\u914d\u7f6e\u6587\u4ef6- application-dev.yml<\/h4>\n<pre class=\"post-pre\"><code> <span class=\"na\">spring<\/span><span class=\"pi\">:<\/span>\r\n   <span class=\"na\">datasource<\/span><span class=\"pi\">:<\/span>\r\n     <span class=\"na\">default<\/span><span class=\"pi\">:<\/span>\r\n       <span class=\"na\">domain<\/span><span class=\"pi\">:<\/span> <span class=\"s\">255.255.255.255<\/span>\r\n       <span class=\"na\">user<\/span><span class=\"pi\">:<\/span> <span class=\"s\">user<\/span>\r\n       <span class=\"na\">password<\/span><span class=\"pi\">:<\/span> <span class=\"s\">password<\/span>\r\n       <span class=\"na\">schema<\/span><span class=\"pi\">:<\/span> <span class=\"s\">default<\/span>\r\n     <span class=\"na\">hogehoge<\/span><span class=\"pi\">:<\/span>\r\n       <span class=\"na\">domain<\/span><span class=\"pi\">:<\/span> <span class=\"s\">255.255.255.255<\/span>\r\n       <span class=\"na\">user<\/span><span class=\"pi\">:<\/span> <span class=\"s\">user<\/span>\r\n       <span class=\"na\">password<\/span><span class=\"pi\">:<\/span> <span class=\"s\">password<\/span>\r\n       <span class=\"na\">schema<\/span><span class=\"pi\">:<\/span> <span class=\"s\">hogehoge<\/span>\r\n<\/code><\/pre>\n<p>\u53ea\u6709\u5f53profile=dev\u65f6\uff0c\u624d\u4f1a\u521b\u5efa\u5e76\u8986\u5199\u8fd9\u6837\u7684\u6587\u4ef6\u3002<\/p>\n<h3>\u4ea4\u6613<\/h3>\n<p>\u5982\u679c\u60f3\u8981\u5728\u6240\u6709\u9519\u8bef\u53d1\u751f\u65f6\u8fdb\u884c\u56de\u6eda\uff0c\u53ef\u4ee5\u4f7f\u7528@Transactional\u6765\u8bbe\u7f6e\u4e8b\u52a1\u7684\u8fb9\u754c\u3002\u53e6\u5916\uff0c\u53ef\u4ee5\u901a\u8fc7\u8bbe\u7f6erollbackFor\u6765\u6307\u5b9a\u56de\u6eda\u7684\u5f02\u5e38\u7c7b\u578b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Transactional<\/span><span class=\"o\">(<\/span><span class=\"n\">rollbackFor<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Exception<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">)<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"nc\">List<\/span><span class=\"o\">&lt;&gt;<\/span> <span class=\"nf\">findList<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"n\">hogeHelper<\/span><span class=\"o\">.<\/span><span class=\"na\">findList<\/span><span class=\"o\">();<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u6240\u4ee5\uff0c\u53ea\u8981\u89e3\u51b3\u9519\u8bef\uff0c\u5c1d\u8bd5\u8fd0\u884c\u5e76\u5904\u7406\u5f02\u5e38\u60c5\u51b5\uff0c\u770b\u8d77\u6765\u5c31\u53ef\u4ee5\u987a\u5229\u5b8c\u6210\u8fc1\u79fb\u3002<\/p>\n<p>\u8bf7\u8bb0\u5f55\u4e0b\u9047\u5230\u7684\u56f0\u96be\u4ee5\u53ca\u4e4b\u540e\u9700\u8981\u8ffd\u52a0\u5b8c\u6210\u7684\u4e8b\u9879\u3002<\/p>\n<h3>\u5728\u4f7f\u7528\u6784\u9020\u51fd\u6570\u6ce8\u5165\u65f6\uff0c\u51fa\u73b0\u4e86\u4f9d\u8d56\u5faa\u73af\u5bfc\u81f4\u9519\u8bef\u3002<\/h3>\n<p>\u5982\u679c\u4f7f\u7528\u6784\u9020\u51fd\u6570\u6ce8\u5165\uff0c\u5219\u5728\u542f\u52a8\u65f6\u8fdb\u884c\u4f9d\u8d56\u6ce8\u5165\uff0c\u5e76\u5bf9\u5176\u6210\u5458\u8fdb\u884c\u4f9d\u8d56\u6ce8\u5165\uff0c\u56e0\u6b64\u5982\u679c\u6e90\u4ee3\u7801\u5b58\u5728\u76f8\u4e92\u4f9d\u8d56\u6216\u5faa\u73af\u4f9d\u8d56\uff0c\u5219\u4f1a\u5728\u5e94\u7528\u7a0b\u5e8f\u542f\u52a8\u65f6\u51fa\u73b0\u9519\u8bef\u3002<\/p>\n<p>\u5bf9\u4e8e\u89e3\u51b3\u4f9d\u8d56\u6027\u53ef\u4ee5\u4f7f\u7528\u5b57\u6bb5\u6ce8\u5165\u6216\u8005setter\u6ce8\u5165\u7684\u65b9\u5f0f\uff0c\u4f46\u6709\u65f6\u4e5f\u53ef\u80fd\u4f1a\u9047\u5230\u65e0\u6cd5\u4fee\u6539\u6216\u8bbf\u95ee\u7684\u60c5\u51b5\uff0c\u6bd4\u5982\u5728\u4f7f\u7528Spaghetti\u6846\u67b6\u65f6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Component<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">HogeHelper<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kd\">private<\/span> <span class=\"nc\">HogeDao<\/span> <span class=\"n\">hogeDao<\/span><span class=\"o\">;<\/span>\r\n\r\n    <span class=\"nd\">@Autowired<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">hogeDao<\/span><span class=\"o\">(<\/span><span class=\"nc\">HogeDao<\/span> <span class=\"n\">hogeDao<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">hogeDao<\/span> <span class=\"o\">=<\/span> <span class=\"n\">hogeDao<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>log4j\u8f6c\u53d8\u4e3alog4j2\u3002<\/h3>\n<p>\u5728\u4f7f\u7528\u6267\u884c\u5668\uff08actuator\uff09\u65f6\uff0c\u5f53\u5c1d\u8bd5\u66f4\u6539\u65e5\u5fd7\u7ea7\u522b\u65f6\uff0c\u53d1\u73b0\u65e5\u5fd7\u914d\u7f6e\u4e2d\u6ca1\u6709\u5bf9\u5e94\u7684\u8bbe\u7f6e\u9879\uff0c\u7ecf\u8fc7\u8c03\u67e5\u53d1\u73b0\u5fc5\u987b\u4f7f\u7528log4j2\u6216logback\u624d\u80fd\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff0c\u6240\u4ee5\u987a\u5229\u8fdb\u884c\u8fc1\u79fb\u3002<\/p>\n<h4>log4j.xml \u6587\u4ef6<\/h4>\n<pre class=\"post-pre\"><code> <span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\" ?&gt;<\/span>\r\n <span class=\"cp\">&lt;!DOCTYPE log4j:configuration SYSTEM \"log4j.dtd\"&gt;<\/span>\r\n <span class=\"nt\">&lt;log4j:configuration<\/span> <span class=\"na\">xmlns:log4j=<\/span><span class=\"s\">\"http:\/\/jakarta.apache.org\/log4j\/\"<\/span><span class=\"nt\">&gt;<\/span>\r\n    <span class=\"nt\">&lt;appender<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"STDOUT\"<\/span> <span class=\"na\">class=<\/span><span class=\"s\">\"org.apache.log4j.ConsoleAppender\"<\/span><span class=\"nt\">&gt;<\/span>\r\n        <span class=\"nt\">&lt;param<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"threshold\"<\/span> <span class=\"na\">value=<\/span><span class=\"s\">\"info\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;layout<\/span> <span class=\"na\">class=<\/span><span class=\"s\">\"org.apache.log4j.PatternLayout\"<\/span><span class=\"nt\">&gt;<\/span>\r\n            <span class=\"nt\">&lt;param<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"ConversionPattern\"<\/span> <span class=\"na\">value=<\/span><span class=\"s\">\"%d [%t] %-5p %c - %m%n\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;\/layout&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/appender&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;appender<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"FILE\"<\/span> <span class=\"na\">class=<\/span><span class=\"s\">\"org.apache.log4j.FileAppender\"<\/span><span class=\"nt\">&gt;<\/span>\r\n        <span class=\"nt\">&lt;param<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"File\"<\/span> <span class=\"na\">value=<\/span><span class=\"s\">\"\/tmp\/logs\/hoge.log\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;layout<\/span> <span class=\"na\">class=<\/span><span class=\"s\">\"org.apache.log4j.PatternLayout\"<\/span><span class=\"nt\">&gt;<\/span>\r\n            <span class=\"nt\">&lt;param<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"ConversionPattern\"<\/span> <span class=\"na\">value=<\/span><span class=\"s\">\"%m%n\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;\/layout&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/appender&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;logger<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"org.apache.commons\"<\/span> <span class=\"na\">additivity=<\/span><span class=\"s\">\"false\"<\/span><span class=\"nt\">&gt;<\/span>\r\n        <span class=\"nt\">&lt;level<\/span> <span class=\"na\">value=<\/span><span class=\"s\">\"WARN\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;appender-ref<\/span> <span class=\"na\">ref=<\/span><span class=\"s\">\"STDOUT\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/logger&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;logger<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"file_log\"<\/span> <span class=\"na\">additivity=<\/span><span class=\"s\">\"false\"<\/span><span class=\"nt\">&gt;<\/span>\r\n        <span class=\"nt\">&lt;level<\/span> <span class=\"na\">value=<\/span><span class=\"s\">\"INFO\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;appender-ref<\/span> <span class=\"na\">ref=<\/span><span class=\"s\">\"FILE\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/logger&gt;<\/span>\r\n\r\n    <span class=\"nt\">&lt;root&gt;<\/span>\r\n        <span class=\"nt\">&lt;priority<\/span> <span class=\"na\">value=<\/span><span class=\"s\">\"INFO\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;appender-ref<\/span> <span class=\"na\">ref=<\/span><span class=\"s\">\"STDOUT\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/root&gt;<\/span>\r\n\r\n <span class=\"nt\">&lt;\/log4j:configuration&gt;<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679clog4j.xml\u6587\u4ef6\u88ab\u5b9a\u4e49\u4e3a\u8fd9\u6837\uff0c\u53ef\u4ee5\u6309\u7167\u4e0b\u9762\u7684\u65b9\u5f0f\u8fdb\u884c\u8fc1\u79fb\u3002<\/p>\n<h4>log4j2\u914d\u7f6e\u6587\u4ef6<\/h4>\n<pre class=\"post-pre\"><code> <span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;<\/span>\r\n <span class=\"nt\">&lt;Configuration<\/span> <span class=\"na\">status=<\/span><span class=\"s\">\"off\"<\/span><span class=\"nt\">&gt;<\/span>\r\n     <span class=\"nt\">&lt;Appenders&gt;<\/span>\r\n        <span class=\"nt\">&lt;Console<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"STDOUT\"<\/span> <span class=\"na\">target=<\/span><span class=\"s\">\"SYSTEM_OUT\"<\/span><span class=\"nt\">&gt;<\/span>\r\n            <span class=\"nt\">&lt;PatternLayout<\/span> <span class=\"na\">pattern=<\/span><span class=\"s\">\"%d [%t] %-5p %c - %m%n\"<\/span><span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;\/Console&gt;<\/span>\r\n        <span class=\"nt\">&lt;File<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"FILE\"<\/span> <span class=\"na\">fileName=<\/span><span class=\"s\">\"\/tmp\/logs\/hoge.log\"<\/span><span class=\"nt\">&gt;<\/span>\r\n            <span class=\"nt\">&lt;PatternLayout<\/span> <span class=\"na\">pattern=<\/span><span class=\"s\">\"%m%n\"<\/span><span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;\/File&gt;<\/span>\r\n     <span class=\"nt\">&lt;\/Appenders&gt;<\/span>\r\n\r\n     <span class=\"nt\">&lt;Loggers&gt;<\/span>\r\n        <span class=\"nt\">&lt;Logger<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"org.apache.commons\"<\/span> <span class=\"na\">level=<\/span><span class=\"s\">\"WARN\"<\/span> <span class=\"na\">additivity=<\/span><span class=\"s\">\"false\"<\/span><span class=\"nt\">&gt;<\/span>\r\n            <span class=\"nt\">&lt;AppenderRef<\/span> <span class=\"na\">ref=<\/span><span class=\"s\">\"STDOUT\"<\/span><span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;\/Logger&gt;<\/span>\r\n        <span class=\"nt\">&lt;Logger<\/span> <span class=\"na\">name=<\/span><span class=\"s\">\"file_log\"<\/span> <span class=\"na\">level=<\/span><span class=\"s\">\"INFO\"<\/span> <span class=\"na\">additivity=<\/span><span class=\"s\">\"false\"<\/span><span class=\"nt\">&gt;<\/span>\r\n            <span class=\"nt\">&lt;AppenderRef<\/span> <span class=\"na\">ref=<\/span><span class=\"s\">\"FILE\"<\/span><span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;\/Logger&gt;<\/span>\r\n        <span class=\"nt\">&lt;Root<\/span> <span class=\"na\">level=<\/span><span class=\"s\">\"INFO\"<\/span><span class=\"nt\">&gt;<\/span>\r\n            <span class=\"nt\">&lt;AppenderRef<\/span> <span class=\"na\">ref=<\/span><span class=\"s\">\"STDOUT\"<\/span><span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;\/Root&gt;<\/span>\r\n     <span class=\"nt\">&lt;\/Loggers&gt;<\/span>\r\n\r\n <span class=\"nt\">&lt;\/Configuration&gt;<\/span>\r\n<\/code><\/pre>\n<h3>\u5e94\u7528\u7a0b\u5e8f\u542f\u52a8\u540e\u7684\u5904\u7406<\/h3>\n<p>\u4e00\u65e6\u5e94\u7528\u7a0b\u5e8f\u542f\u52a8\uff0c\u7531\u4e8e\u6709\u4e00\u4e9b\u60f3\u8981\u6267\u884c\u7684\u64cd\u4f5c\uff0c\u6240\u4ee5\u4e5f\u8fdb\u884c\u4e86\u76f8\u5e94\u7684\u5b9e\u73b0\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@EventListener<\/span><span class=\"o\">(<\/span><span class=\"nc\">ApplicationReadyEvent<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">)<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u6307\u5b9a\u67d0\u9879\u5185\u5bb9\u65f6\uff0c\u5728\u542f\u52a8\u51c6\u5907\u5b8c\u6bd5\u65f6\u8c03\u7528\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@SpringBootApplication<\/span>\r\n<span class=\"nd\">@ComponentScan<\/span><span class=\"o\">(<\/span><span class=\"n\">basePackages<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"hoge\"<\/span><span class=\"o\">)<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">Application<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kd\">static<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"o\">(<\/span><span class=\"nc\">String<\/span><span class=\"o\">[]<\/span> <span class=\"n\">args<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"nc\">SpringApplication<\/span> <span class=\"n\">springApplication<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">SpringApplication<\/span><span class=\"o\">(<\/span><span class=\"nc\">Application<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span>\r\n        <span class=\"n\">springApplication<\/span><span class=\"o\">.<\/span><span class=\"na\">run<\/span><span class=\"o\">(<\/span><span class=\"n\">args<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@EventListener<\/span><span class=\"o\">(<\/span><span class=\"nc\">ApplicationReadyEvent<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">doAfterStartup<\/span><span class=\"o\">()<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"c1\">\/\/ \u8d77\u52d5\u6642\u306b\u3084\u308a\u305f\u3044\u51e6\u7406\u3092\u3059\u308b<\/span>\r\n        <span class=\"c1\">\/\/ \u3053\u3053\u306b\u6765\u305f\u6642\u70b9\u3067DI\u7b49\u306f\u884c\u308f\u308c\u3066\u3044\u308b\u306f\u305a\u306a\u306e\u3067Dao\u64cd\u4f5c\u3059\u308b\u51e6\u7406\u306e\u547c\u3073\u51fa\u3057\u3068\u304b\u3082\u3067\u304d\u308b<\/span>\r\n    <span class=\"o\">}<\/span>\r\n <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u5f02\u5e38\u5904\u7406\u7a0b\u5e8f<\/h3>\n<p>\u5982\u679c\u60f3\u4f7f\u7528\u7c7b\u4f3c\u4e8eGlobalException\u7684\u901a\u7528\u9519\u8bef\u5904\u7406\uff0c\u9700\u8981\u521b\u5efa\u5b83\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">@Controller<\/span>\r\n<span class=\"nd\">@RequiredArgsConstructor<\/span>\r\n<span class=\"nd\">@ControllerAdvice<\/span><span class=\"o\">(<\/span><span class=\"n\">annotations<\/span> <span class=\"o\">=<\/span> <span class=\"o\">{<\/span> <span class=\"nc\">RestController<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span> <span class=\"o\">})<\/span>\r\n<span class=\"kd\">public<\/span> <span class=\"kd\">class<\/span> <span class=\"nc\">ApiExceptionHandler<\/span> <span class=\"o\">{<\/span> \r\n    <span class=\"nd\">@ExceptionHandler<\/span><span class=\"o\">(<\/span><span class=\"nc\">Throwable<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">Object<\/span> <span class=\"nf\">handlerException<\/span><span class=\"o\">(<\/span><span class=\"nc\">HttpServletRequest<\/span> <span class=\"n\">request<\/span><span class=\"o\">,<\/span> <span class=\"nc\">HttpServletResponse<\/span> <span class=\"n\">response<\/span><span class=\"o\">,<\/span> <span class=\"nc\">Throwable<\/span> <span class=\"n\">t<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"c1\">\/\/ Throwable\u306a\u306e\u3067\u5168\u90e8\u3072\u308d\u3063\u3066\u3057\u307e\u3046<\/span>\r\n\r\n        <span class=\"c1\">\/\/ \u7a2e\u985e\u3067\u51e6\u7406\u3092\u308f\u3051\u305f\u3044\u3068\u304d<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">t<\/span> <span class=\"k\">instanceof<\/span> <span class=\"nc\">NullPointerException<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"o\">}<\/span> <span class=\"k\">else<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"o\">}<\/span>\r\n\r\n        <span class=\"c1\">\/\/ \u5171\u901a\u51e6\u7406\u3068\u304b\u66f8\u304f<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"kc\">null<\/span><span class=\"o\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    <span class=\"nd\">@ExceptionHandler<\/span><span class=\"o\">(<\/span><span class=\"nc\">NullPointerException<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">)<\/span>\r\n    <span class=\"kd\">public<\/span> <span class=\"nc\">Object<\/span> <span class=\"nf\">nullPointerException<\/span><span class=\"o\">(<\/span><span class=\"nc\">HttpServletRequest<\/span> <span class=\"n\">request<\/span><span class=\"o\">,<\/span> <span class=\"nc\">HttpServletResponse<\/span> <span class=\"n\">response<\/span><span class=\"o\">,<\/span> <span class=\"nc\">Throwable<\/span> <span class=\"n\">t<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n        <span class=\"c1\">\/\/ \u7279\u5b9a\u306e\u30a8\u30e9\u30fc\u62fe\u3044\u305f\u3044\u6642<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">RedirectView<\/span><span class=\"o\">(<\/span><span class=\"s\">\"http:\/\/localhost:8080\/nullpointer\"<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"o\">}<\/span>\r\n <span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u5b8c\u6210\u4e86\u8fd9\u4e9b\u6b65\u9aa4\uff0c\u57fa\u672c\u4e0a\u5c31\u53ef\u4ee5\u987a\u5229\u8fdb\u884c\u8f6c\u79fb\u4e86\uff0c\u4e8e\u662f\u6211\u4eec\u9700\u8981\u8c03\u6574\u4e00\u4e9b\u81ea\u884c\u5b89\u88c5\u7684\u7ec4\u4ef6\uff0c\u4ee5\u786e\u4fdd\u5176\u6b63\u5e38\u8fd0\u884c\u3002<\/p>\n<p>\u5728\u6211\u6240\u505a\u7684\u4e8b\u60c5\u4e2d\uff0c\u6709\u4e00\u4ef6\u662f\u7531\u4e8espring5\u4ee5\u540e\u5c06XMLBeans\u7684\u96c6\u6210\u7c7b\u5220\u9664\u4e86\uff0c\u6240\u4ee5\u6211\u5c06\u5176\u66ff\u6362\u4e3aXLSMapper\u5e76\u91cd\u65b0\u7f16\u5199\u4e86\u5904\u7406\u903b\u8f91\u3002\u8fd9\u4f7f\u6211\u611f\u5230\u975e\u5e38\u6cae\u4e27\u3002<\/p>\n<p>\u4e00\u65e6\u7cfb\u7edf\u5f00\u59cb\u8fd0\u884c\uff0c\u5c31\u53ef\u4ee5\u5f15\u5165\u8bf8\u5982actuator\u3001restdocs\u548cspring-boot-admin\u7b49\uff0c\u81ea\u4e3b\u5f00\u53d1\u7684\u529f\u80fd\u53ef\u4ee5\u88ab\u53d6\u6d88\uff0c\u4f7f\u5f97\u7cfb\u7edf\u7ba1\u7406\u66f4\u52a0\u65b9\u4fbf\u3002<\/p>\n<p>\u4f5c\u4e3a\u6240\u82b1\u8d39\u7684\u65f6\u95f4\uff0c\u56e0\u4e3a\u662f\u5728\u65e5\u5e38\u5de5\u4f5c\u7684\u540c\u65f6\u8fdb\u884c\u7684\uff0c\u6240\u4ee5\u5927\u7ea6\u662f\u4e00\u4e2a\u4eba\u72ec\u81ea\u5b8c\u6210\u4e86\u5c06\u8fd1\u4e24\u4e2a\u6708\u3002\u8d77\u521d\u8fde\u7f16\u8bd1\u90fd\u65e0\u6cd5\u901a\u8fc7\uff0c\u6240\u4ee5\u662f\u4e00\u573a\u5b64\u72ec\u7684\u6218\u6597\uff0c\u4f46\u6211\u76f8\u4fe1\u603b\u4f1a\u6709\u4e00\u5929\u4f1a\u8fce\u6765\u5149\u660e\uff0c\u6240\u4ee5\u6211\u5fcd\u8010\u7740\u6218\u6597\u4e0b\u53bb\u3002<\/p>\n<p>\u7531\u4e8e\u6e90\u4ee3\u7801\u5b8c\u5168\u6539\u53d8\uff0c\u6240\u4ee5\u9700\u8981\u4fee\u590d\u76f8\u5173\u7684Jenkins\u3001Shell\u7b49\u8f85\u52a9\u5de5\u5177\u3002\u8fd8\u9700\u8981\u5728\u5148\u884c\u7684\u4ee3\u7801\u4e2d\u4f7f\u7528git\u8fdb\u884c\u5408\u5e76\uff0c\u540c\u65f6\u6ce8\u610f\u6bcf\u6b21\u90fd\u8981\u5408\u5e76\u4e3b\u4ee3\u7801\u6765\u89e3\u51b3\u95ee\u9898\uff0c\u5426\u5219\u6700\u7ec8\u5408\u5e76\u4f1a\u53d8\u5f97\u56f0\u96be\u3002\u5982\u679c\u9879\u76ee\u7684\u63d0\u4ea4\u5f88\u591a\uff0c\u6216\u8005\u6709\u5f88\u591a\u4eba\u53c2\u4e0e\u5176\u4e2d\uff0c\u96be\u5ea6\u53ef\u80fd\u4f1a\u589e\u52a0\u3002<\/p>\n<h3>\u90e8\u7f72\u5305\u542b\u7684jar\u6587\u4ef6\u5230\u670d\u52a1\u5668\u3002<\/h3>\n<p>\u6211\u4f1a\u5728\u9644\u5f55\u4e2d\u5199\u4e0b\u5c06\u8981\u5e94\u7528\u5230CentOS\u670d\u52a1\u5668\u7684\u5907\u5fd8\u5f55\u3002<\/p>\n<h4>\u521b\u5efa\u6d3b\u52a8\u6587\u4ef6\u5939<\/h4>\n<pre class=\"post-pre\"><code><span class=\"nb\">sudo mkdir<\/span> <span class=\"nt\">-p<\/span> \/var\/local\/app\r\n<span class=\"nb\">sudo chown<\/span> <span class=\"nt\">-R<\/span> user:user \/var\/local\/app\r\n<\/code><\/pre>\n<p>\u65e0\u8bba\u6587\u4ef6\u5939\u5728\u54ea\u91cc\u90fd\u53ef\u4ee5\u3002\u53ea\u8981\u542f\u52a8\u7528\u6237\u53ef\u4ee5\u64cd\u4f5c\u7684\u4f4d\u7f6e\u5c31\u6ca1\u6709\u95ee\u9898\u3002<\/p>\n<h4>\u5c06\u4f7f\u7528bootJar\u521b\u5efa\u7684jar\u6587\u4ef6\u653e\u7f6e\u5728\u521b\u5efa\u7684\u6587\u4ef6\u5939\u4e2d\u3002<\/h4>\n<pre class=\"post-pre\"><code>.\/gradlew web:bootJar <span class=\"nt\">-x<\/span> <span class=\"nb\">test<\/span>\r\n<span class=\"c\"># web\/build\/libs\/web.jar\u304c\u3067\u304d\u3066\u3044\u308b\u306e\u3067spc\u3068\u304b\u3067\u3042\u3052\u308b<\/span>\r\n<\/code><\/pre>\n<h4>\u521b\u5efainit.d<\/h4>\n<pre class=\"post-pre\"><code><span class=\"nb\">sudo ln<\/span> <span class=\"nt\">-s<\/span> \/var\/local\/app\/web.jar \/etc\/init.d\/web\r\n<\/code><\/pre>\n<p>\u4f7f\u7528\u8fd9\u4e2a\u9009\u9879<br \/>\n\u5728build.gradle\u4e2d\u52a0\u5165launchScript()\u5230bootJar\uff0c\u8fd9\u6837\/etc\/init.d\/web\u5c06\u53d8\u6210\u4e00\u4e2a\u542f\u52a8\u811a\u672c\uff08\u4e8c\u8fdb\u5236\u6587\u4ef6\uff09\u7684\u91cd\u70b9\u3002<\/p>\n<h4>\u5c06conf\u6587\u4ef6\u751f\u6210\u5230\u4e0ejar\u6587\u4ef6\u76f8\u540c\u7684\u4f4d\u7f6e\u3002<\/h4>\n<pre class=\"post-pre\"><code><span class=\"nb\">cat <\/span>web.conf\r\n<span class=\"nv\">JAVA_OPTS<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"-Dspring.profiles.active=dev\"<\/span>\r\n<\/code><\/pre>\n<p>\u5c06\u4e00\u4e2a\u4e0ejar\u6587\u4ef6\u540c\u540d\u7684conf\u6587\u4ef6\u653e\u7f6e\u5728\u540c\u4e00\u6587\u4ef6\u5939\u4e2d\u3002\u867d\u7136\u6709\u5f88\u591a\u4e1c\u897f\u8981\u5199\uff0c\u4f46\u5373\u4f7f\u4f7f\u7528\u9ed8\u8ba4\u914d\u7f6e\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u6240\u4ee5\u4e0d\u9700\u8981\u6539\u53d8\u914d\u7f6e\u4e5f\u53ef\u4ee5\u3002<\/p>\n<h4>\u7ba1\u7406\u5458\u6743\u9650<\/h4>\n<pre class=\"post-pre\"><code><span class=\"nb\">sudo <\/span>visudo\r\nuser <span class=\"nv\">ALL<\/span><span class=\"o\">=(<\/span>root<span class=\"o\">)<\/span> NOPASSWD:\/etc\/init.d\/web <span class=\"k\">*<\/span>\r\n<\/code><\/pre>\n<p>\u4e3a\u4e86\u66f4\u5bb9\u6613\u542f\u52a8\uff0c\u5c06\u6743\u9650\u6dfb\u52a0\u5230visudo\u3002<\/p>\n<h4>\u52a8\u8d77\u6765<\/h4>\n<pre class=\"post-pre\"><code><span class=\"nb\">sudo<\/span> \/etc\/init.d\/web start\r\n<\/code><\/pre>\n<h4>\u8f6e\u6362<\/h4>\n<pre class=\"post-pre\"><code><span class=\"nb\">sudo <\/span>vi \/etc\/logrotate.d\/syslog\r\n\/var\/log\/web.log\r\n<\/code><\/pre>\n<p>\u7531\u4e8e\u5728\/var\/log\u76ee\u5f55\u4e0b\u751f\u6210\u65e5\u5fd7\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u8fdb\u884c\u65e5\u5fd7\u8f6e\u8f6c\u8bbe\u7f6e\u3002\u9664\u4e86\/var\/log\u4e4b\u5916\uff0c\u8fd8\u53ef\u4ee5\u901a\u8fc7log4j2\u7b49\u914d\u7f6e\u5c06\u65e5\u5fd7\u8f93\u51fa\u5230\u559c\u6b22\u7684\u4f4d\u7f6e\u3002<\/p>\n<h3>\u5bf9\u8fd9\u4e2a\u7684\u60f3\u6cd5\u6216\u8005\u770b\u6cd5<\/h3>\n<p>\u6700\u5f00\u59cb\u4ee5\u4e3a\u9700\u8981\u66f4\u591a\u65f6\u95f4\u624d\u5f00\u59cb\u7684\u5de5\u4f5c\uff0c\u6240\u4ee5\u80fd\u591f\u6bd4\u60f3\u8c61\u4e2d\u66f4\u5feb\u5b8c\u6210\u771f\u662f\u592a\u597d\u4e86\u3002<br \/>\n\u8fd9\u662f\u6700\u521d\u7684\u611f\u89c9\u3002<br \/>\n\u5bf9\u6211\u4e2a\u4eba\u6765\u8bf4\uff0cseasar2\u672c\u8eab\u5f88\u597d\u7528\uff0c\u4f46\u5f00\u53d1\u5df2\u7ecf\u7ed3\u675f\u4e86\uff0c\u8fd9\u662f\u4e00\u4e2a\u5f88\u5927\u7684\u95ee\u9898\uff0c\u4e0d\u5f97\u4e0d\u8fdb\u884c\u8fc1\u79fb\u4e86\u3002<br \/>\n\u867d\u7136\u5982\u6b64\uff0c\u4e5f\u6709\u4e00\u4e9b\u53ef\u7528\u7684\u4e1c\u897f\uff0c\u6240\u4ee5\u5728\u4e0d\u4f9d\u8d56seasar2\u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u4f1a\u79fb\u690d\u548c\u4f7f\u7528\u4e00\u4e9b\u65b9\u4fbf\u7684util\u7c7b\u5e93\u3002<\/p>\n<p>\u5728\u6211\u5feb\u901f\u8f6c\u6362\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u7acb\u5373\u559c\u6b22\u4e0a\u4e86restdocs\u3002\u73b0\u5728\u53ef\u4ee5\u5f88\u5bb9\u6613\u5730\u6309\u7167\u4ee5\u4e0b\u6d41\u7a0b\u8fdb\u884c\uff1a<br \/>\n&#8211; \u7f16\u5199\u5355\u5143\u6d4b\u8bd5<br \/>\n&#8211; \u521b\u5efa\u6d4b\u8bd5\u6570\u636e<br \/>\n&#8211; \u8fd0\u884c\u6d4b\u8bd5<br \/>\n&#8211; \u751f\u6210\u6587\u6863<br \/>\n\u8fd9\u4f7f\u5f97API\u6587\u6863\u7684\u8d28\u91cf\u66f4\u5bb9\u6613\u5f97\u5230\u4fdd\u8bc1\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8bf7\u5728\u522b\u7684\u7f51\u7ad9\u4e0a\u641c\u7d22\u3002 \u7531\u4e8e\u4e4b\u524d\u5199\u8fc7\u7684\u5185\u5bb9\u5df2\u7ecf\u5728\u67d0\u4e2a\u65f6\u95f4\u7ed3\u675f\u4e86\uff0c\u6240\u4ee5\u6211\u8f6c\u79fb\u5230\u4e86\u8fd9\u7bc7\u7b2c6\u7bc7\u6587\u7ae0\u3002\u8fd9\u662f2019\u5e7410 [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-40451","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4eceseasar2\u8fc1\u79fb\u5230spring boot2\u7cfb - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4eceseasar2\u8fc1\u79fb\u5230spring-boot2\u7cfb\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4eceseasar2\u8fc1\u79fb\u5230spring boot2\u7cfb\" \/>\n<meta property=\"og:description\" content=\"\u8bf7\u5728\u522b\u7684\u7f51\u7ad9\u4e0a\u641c\u7d22\u3002 \u7531\u4e8e\u4e4b\u524d\u5199\u8fc7\u7684\u5185\u5bb9\u5df2\u7ecf\u5728\u67d0\u4e2a\u65f6\u95f4\u7ed3\u675f\u4e86\uff0c\u6240\u4ee5\u6211\u8f6c\u79fb\u5230\u4e86\u8fd9\u7bc7\u7b2c6\u7bc7\u6587\u7ae0\u3002\u8fd9\u662f2019\u5e7410 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4eceseasar2\u8fc1\u79fb\u5230spring-boot2\u7cfb\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-01-26T08:17:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-04T02:31:21+00:00\" \/>\n<meta name=\"author\" content=\"\u5b87, \u534e\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u5b87, \u534e\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8eseasar2%e8%bf%81%e7%a7%bb%e5%88%b0spring-boot2%e7%b3%bb\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8eseasar2%e8%bf%81%e7%a7%bb%e5%88%b0spring-boot2%e7%b3%bb\/\",\"name\":\"\u4eceseasar2\u8fc1\u79fb\u5230spring boot2\u7cfb - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-01-26T08:17:51+00:00\",\"dateModified\":\"2024-05-04T02:31:21+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8eseasar2%e8%bf%81%e7%a7%bb%e5%88%b0spring-boot2%e7%b3%bb\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8eseasar2%e8%bf%81%e7%a7%bb%e5%88%b0spring-boot2%e7%b3%bb\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8eseasar2%e8%bf%81%e7%a7%bb%e5%88%b0spring-boot2%e7%b3%bb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4eceseasar2\u8fc1\u79fb\u5230spring boot2\u7cfb\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\",\"name\":\"\u5b87, \u534e\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"caption\":\"\u5b87, \u534e\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8eseasar2%e8%bf%81%e7%a7%bb%e5%88%b0spring-boot2%e7%b3%bb\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4eceseasar2\u8fc1\u79fb\u5230spring boot2\u7cfb - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4eceseasar2\u8fc1\u79fb\u5230spring-boot2\u7cfb\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4eceseasar2\u8fc1\u79fb\u5230spring boot2\u7cfb","og_description":"\u8bf7\u5728\u522b\u7684\u7f51\u7ad9\u4e0a\u641c\u7d22\u3002 \u7531\u4e8e\u4e4b\u524d\u5199\u8fc7\u7684\u5185\u5bb9\u5df2\u7ecf\u5728\u67d0\u4e2a\u65f6\u95f4\u7ed3\u675f\u4e86\uff0c\u6240\u4ee5\u6211\u8f6c\u79fb\u5230\u4e86\u8fd9\u7bc7\u7b2c6\u7bc7\u6587\u7ae0\u3002\u8fd9\u662f2019\u5e7410 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4eceseasar2\u8fc1\u79fb\u5230spring-boot2\u7cfb\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-01-26T08:17:51+00:00","article_modified_time":"2024-05-04T02:31:21+00:00","author":"\u5b87, \u534e","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u5b87, \u534e","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"10 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8eseasar2%e8%bf%81%e7%a7%bb%e5%88%b0spring-boot2%e7%b3%bb\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8eseasar2%e8%bf%81%e7%a7%bb%e5%88%b0spring-boot2%e7%b3%bb\/","name":"\u4eceseasar2\u8fc1\u79fb\u5230spring boot2\u7cfb - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-01-26T08:17:51+00:00","dateModified":"2024-05-04T02:31:21+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8eseasar2%e8%bf%81%e7%a7%bb%e5%88%b0spring-boot2%e7%b3%bb\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8eseasar2%e8%bf%81%e7%a7%bb%e5%88%b0spring-boot2%e7%b3%bb\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8eseasar2%e8%bf%81%e7%a7%bb%e5%88%b0spring-boot2%e7%b3%bb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4eceseasar2\u8fc1\u79fb\u5230spring boot2\u7cfb"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458","name":"\u5b87, \u534e","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","caption":"\u5b87, \u534e"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bb%8eseasar2%e8%bf%81%e7%a7%bb%e5%88%b0spring-boot2%e7%b3%bb\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40451","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=40451"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40451\/revisions"}],"predecessor-version":[{"id":97792,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40451\/revisions\/97792"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=40451"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=40451"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=40451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}