Spring MVC 的 Java Config ( 非 XML ) 配置方式

2018-06-18 00:56:45来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

索引:

开源Spring解决方案--lm.solution

参看代码 GitHub:

solution/pom.xml

web/pom.xml

web.xml

WebInitializer.java

WebConfig.java

RootConfig.java

一、引入必要类库

  spring-context

  spring-context-support

  spring-webmvc:引入该包后,maven 会自动解析依赖,引入 spring-web 等包。

  1.solution/pom.xml

  1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3     <modelVersion>4.0.0</modelVersion>
  4 
  5     <groupId>lm.solution</groupId>
  6     <artifactId>solution</artifactId>
  7     <version>1.0-SNAPSHOT</version>
  8     <modules>
  9         <module>webapi</module>
 10         <module>web</module>
 11         <module>common</module>
 12         <module>service</module>
 13         <module>mapper</module>
 14         <module>pojo</module>
 15         <module>console</module>
 16         <module>webservice</module>
 17     </modules>
 18     <packaging>pom</packaging>
 19 
 20     <name>solution</name>
 21     <url>http://maven.apache.org</url>
 22 
 23     <properties>
 24         <!--编译字符集-->
 25         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 26         <!-- spring -->
 27         <spring.version>4.3.13.RELEASE</spring.version>
 28         <!-- log4j -->
 29         <slf4j.version>1.7.7</slf4j.version>
 30         <log4j.version>1.2.17</log4j.version>
 31         <!-- jackson -->
 32         <jackson.version>2.9.4</jackson.version>
 33         <!-- junit -->
 34         <junit.version>4.12</junit.version>
 35         <!-- aspectj -->
 36         <aspectj.version>1.8.13</aspectj.version>
 37         <!-- cglib -->
 38         <cglib.version>3.1</cglib.version>
 39         <!-- mybatis -->
 40         <mybatis.version>3.4.5</mybatis.version>
 41         <!-- mybatis-spring -->
 42         <mybatisSpring.version>1.3.1</mybatisSpring.version>
 43         <!--mysql-connector-->
 44         <mysql.version>5.1.34</mysql.version>
 45         <!--druid-->
 46         <druid.version>1.0.5</druid.version>
 47         <!--javax.servlet-->
 48         <javaxServlet.version>3.0.1</javaxServlet.version>
 49         <!--jsp-api-->
 50         <jspApi.version>2.2</jspApi.version>
 51         <!--jstl-->
 52         <jstl.version>1.2</jstl.version>
 53         <!--json-lib-->
 54         <jsonLib.version>2.1</jsonLib.version>
 55         <!--jackson old-->
 56         <jacksonOld.version>1.9.13</jacksonOld.version>
 57         <!--dom4j-->
 58         <dom4j.version>1.6.1</dom4j.version>
 59         <!--ehcache core-->
 60         <ehcacheCore.version>2.6.9</ehcacheCore.version>
 61         <!--ehcache web-->
 62         <ehcacheWeb.version>2.0.4</ehcacheWeb.version>
 63         <!--commons-fileupload-->
 64         <commonsFileupload.version>1.3.1</commonsFileupload.version>
 65         <!--commons-io-->
 66         <commonsIo.version>2.4</commonsIo.version>
 67         <!--commons-codec-->
 68         <commonsCodec.version>1.9</commonsCodec.version>
 69         <!--commons-collections4-->
 70         <commonsCollections4.version>4.0</commonsCollections4.version>
 71         <!--commons-beanutils-->
 72         <commonsBeanutils.version>1.7.0</commonsBeanutils.version>
 73         <!--freemarker-->
 74         <freemarker.version>2.3.19</freemarker.version>
 75         <!-- poi  poi-ooxml -->
 76         <poi.version>3.9</poi.version>
 77         <!--org.apache.httpcomponents-->
 78         <httpcore.version>4.4.8</httpcore.version>
 79         <httpclient.version>4.5.4</httpclient.version>
 80         <!-- jaxws-rt -->
 81         <jaxwsRt.version>2.3.0</jaxwsRt.version>
 82         <!-- jedis -->
 83         <jedis.version>2.9.0</jedis.version>
 84         <!-- rabbitmq -->
 85         <amqpClient.version>5.1.2</amqpClient.version>
 86         <!--fastjson-->
 87         <fastjson.version>1.2.46</fastjson.version>
 88         <!-- jsr250 -->
 89         <jsr250.version>1.0</jsr250.version>
 90     </properties>
 91 
 92     <dependencies>
 93         <!--单元测试依赖 -->
 94         <dependency>
 95             <groupId>junit</groupId>
 96             <artifactId>junit</artifactId>
 97             <version>RELEASE</version>
 98             <!--test 说明这个包的存活是在test周期,也就是发布时将不包含这个jar包-->
 99             <scope>test</scope>
100         </dependency>
101         <!--spring单元测试依赖 -->
102         <dependency>
103             <groupId>org.springframework</groupId>
104             <artifactId>spring-test</artifactId>
105             <version>${spring.version}</version>
106             <scope>test</scope>
107         </dependency>
108         <!-- spring -->
109         <dependency>
110             <groupId>org.springframework</groupId>
111             <!-- 因依赖 会自动引入 spring-aop spring-beans spring-core spring-expression 四个包 -->
112             <artifactId>spring-context</artifactId>
113             <version>${spring.version}</version>
114         </dependency>
115         <dependency>
116             <groupId>org.springframework</groupId>
117             <artifactId>spring-context-support</artifactId>
118             <version>${spring.version}</version>
119         </dependency>
120         <dependency>
121             <groupId>org.springframework</groupId>
122             <artifactId>spring-aspects</artifactId>
123             <version>${spring.version}</version>
124         </dependency>
125         <dependency>
126             <groupId>org.springframework</groupId>
127             <artifactId>spring-tx</artifactId>
128             <version>${spring.version}</version>
129         </dependency>
130         <dependency>
131             <groupId>org.springframework</groupId>
132             <artifactId>spring-jdbc</artifactId>
133             <version>${spring.version}</version>
134         </dependency>
135         <!-- aspectj AOP -->
136         <dependency>
137             <groupId>org.aspectj</groupId>
138             <artifactId>aspectjrt</artifactId>
139             <version>${aspectj.version}</version>
140         </dependency>
141         <dependency>
142             <groupId>org.aspectj</groupId>
143             <artifactId>aspectjweaver</artifactId>
144             <version>${aspectj.version}</version>
145         </dependency>
146         <!-- 映入JSON jackson -->
147         <dependency>
148             <groupId>com.fasterxml.jackson.core</groupId>
149             <artifactId>jackson-annotations</artifactId>
150             <version>${jackson.version}</version>
151         </dependency>
152         <dependency>
153             <groupId>com.fasterxml.jackson.core</groupId>
154             <artifactId>jackson-databind</artifactId>
155             <version>${jackson.version}</version>
156         </dependency>
157         <dependency>
158             <groupId>com.fasterxml.jackson.core</groupId>
159             <artifactId>jackson-core</artifactId>
160             <version>${jackson.version}</version>
161         </dependency>
162         <dependency>
163             <groupId>com.fasterxml.jackson.dataformat</groupId>
164             <artifactId>jackson-dataformat-xml</artifactId>
165             <version>${jackson.version}</version>
166         </dependency>
167         <!-- 日志文件管理包 -->
168         <dependency>
169             <groupId>log4j</groupId>
170             <artifactId>log4j</artifactId>
171             <version>${log4j.version}</version>
172         </dependency>
173         <dependency>
174             <groupId>org.slf4j</groupId>
175             <artifactId>slf4j-api</artifactId>
176             <version>${slf4j.version}</version>
177         </dependency>
178         <dependency>
179             <groupId>org.slf4j</groupId>
180             <artifactId>slf4j-log4j12</artifactId>
181             <version>${slf4j.version}</version>
182         </dependency>
183     </dependencies>
184 
185     <dependencyManagement>
186         <dependencies>
187             <!--spring web-->
188             <dependency>
189                 <groupId>org.springframework</groupId>
190                 <artifactId>spring-web</artifactId>
191                 <version>${spring.version}</version>
192             </dependency>
193             <dependency>
194                 <groupId>org.springframework</groupId>
195                 <artifactId>spring-webmvc</artifactId>
196                 <version>${spring.version}</version>
197             </dependency>
198             <!--cglib-->
199             <dependency>
200                 <groupId>cglib</groupId>
201                 <artifactId>cglib</artifactId>
202                 <version>${cglib.version}</version>
203             </dependency>
204             <!-- mybatis -->
205             <dependency>
206                 <groupId>org.mybatis</groupId>
207                 <artifactId>mybatis</artifactId>
208                 <version>${mybatis.version}</version>
209             </dependency>
210             <dependency>
211                 <groupId>org.mybatis</groupId>
212                 <artifactId>mybatis-spring</artifactId>
213                 <version>${mybatisSpring.version}</version>
214             </dependency>
215             <!-- Mysql数据库驱动包 -->
216             <dependency>
217                 <groupId>mysql</groupId>
218                 <artifactId>mysql-connector-java</artifactId>
219                 <version>${mysql.version}</version>
220             </dependency>
221             <!-- connection pool -->
222             <dependency>
223                 <groupId>com.alibaba</groupId>
224                 <artifactId>druid</artifactId>
225                 <version>${druid.version}</version>
226                 <!--<scope>runtime</scope>-->
227             </dependency>
228             <!--servlet-->
229             <dependency>
230                 <groupId>javax.servlet</groupId>
231                 <artifactId>javax.servlet-api</artifactId>
232                 <version>${javaxServlet.version}</version>
233                 <scope>provided</scope>
234             </dependency>
235             <dependency>
236                 <groupId>javax.servlet.jsp</groupId>
237                 <artifactId>jsp-api</artifactId>
238                 <version>${jspApi.version}</version>
239                 <scope>provided</scope>
240             </dependency>
241             <dependency>
242                 <groupId>javax.servlet</groupId>
243                 <artifactId>jstl</artifactId>
244                 <version>${jstl.version}</version>
245             </dependency>
246             <!-- 映入JSON lib -->
247             <dependency>
248                 <groupId>net.sf.json-lib</groupId>
249                 <artifactId>json-lib</artifactId>
250                 <version>${jsonLib.version}</version>
251                 <classifier>jdk15</classifier>
252             </dependency>
253             <!-- jackson old -->
254             <dependency>
255                 <groupId>org.codehaus.jackson</groupId>
256                 <artifactId>jackson-core-asl</artifactId>
257                 <version>${jacksonOld.version}</version>
258             </dependency>
259             <dependency>
260                 <groupId>org.codehaus.jackson</groupId>
261                 <artifactId>jackson-mapper-asl</artifactId>
262                 <version>${jacksonOld.version}</version>
263             </dependency>
264             <!-- 用dom4j解析xml文件 -->
265             <dependency>
266                 <groupId>dom4j</groupId>
267                 <artifactId>dom4j</artifactId>
268                 <version>${dom4j.version}</version>
269             </dependency>
270             <!-- ehcache -->
271             <dependency>
272                 <groupId>net.sf.ehcache</groupId>
273                 <artifactId>ehcache-core</artifactId>
274                 <version>${ehcacheCore.version}</version>
275             </dependency>
276             <dependency>
277                 <groupId>net.sf.ehcache</groupId>
278                 <artifactId>ehcache-web</artifactId>
279                 <version>${ehcacheWeb.version}</version>
280             </dependency>
281             <!-- 上传组件包 -->
282             <dependency>
283                 <groupId>commons-fileupload</groupId>
284                 <artifactId>commons-fileupload</artifactId>
285                 <version>${commonsFileupload.version}</version>
286             </dependency>
287             <dependency>
288                 <groupId>commons-io</groupId>
289                 <artifactId>commons-io</artifactId>
290                 <version>${commonsIo.version}</version>
291             </dependency>
292             <dependency>
293                 <groupId>commons-codec</groupId>
294                 <artifactId>commons-codec</artifactId>
295                 <version>${commonsCodec.version}</version>
296             </dependency>
297             <dependency>
298                 <groupId>org.apache.commons</groupId>
299                 <artifactId>commons-collections4</artifactId>
300                 <version>${commonsCollections4.version}</version>
301             </dependency>
302             <dependency>
303                 <groupId>org.apache.commons</groupId>
304                 <artifactId>commons-lang3</artifactId>
305                 <version>3.3.2</version>
306             </dependency>
307             <!-- commons-beanutils -->
308             <dependency>
309                 <groupId>commons-beanutils</groupId>
310                 <artifactId>commons-beanutils</artifactId>
311                 <version>${commonsBeanutils.version}</version>
312                 <exclusions>
313                     <exclusion>
314                         <groupId>commons-logging</groupId>
315                         <artifactId>commons-logging</artifactId>
316                     </exclusion>
317                 </exclusions>
318             </dependency>
319             <!-- freemarker -->
320             <dependency>
321                 <groupId>org.freemarker</groupId>
322                 <artifactId>freemarker</artifactId>
323                 <version>${freemarker.version}</version>
324             </dependency>
325             <!-- poi -->
326             <dependency>
327                 <groupId>org.apache.poi</groupId>
328                 <artifactId>poi</artifactId>
329                 <version>${poi.version}</version>
330             </dependency>
331             <dependency>
332                 <groupId>org.apache.poi</groupId>
333                 <artifactId>poi-ooxml</artifactId>
334                 <version>${poi.version}</version>
335             </dependency>
336             <!-- org.apache.httpcomponents -->
337             <dependency>
338                 <groupId>org.apache.httpcomponents</groupId>
339                 <artifactId>httpcore</artifactId>
340                 <version>${httpcore.version}</version>
341             </dependency>
342             <dependency>
343                 <groupId>org.apache.httpcomponents</groupId>
344                 <artifactId>httpclient</artifactId>
345                 <version>${httpclient.version}</version>
346             </dependency>
347             <!-- com.sun.xml.ws/jaxws-rt -->
348             <dependency>
349                 <groupId>com.sun.xml.ws</groupId>
350                 <artifactId>jaxws-rt</artifactId>
351                 <version>${jaxwsRt.version}</version>
352             </dependency>
353             <!-- redis.clients/jedis -->
354             <dependency>
355                 <groupId>redis.clients</groupId>
356                 <artifactId>jedis</artifactId>
357                 <version>${jedis.version}</version>
358             </dependency>
359             <!-- com.rabbitmq/amqp-client -->
360             <dependency>
361                 <groupId>com.rabbitmq</groupId>
362                 <artifactId>amqp-client</artifactId>
363                 <version>${amqpClient.version}</version>
364             </dependency>
365             <!-- com.alibaba/fastjson -->
366             <dependency>
367                 <groupId>com.alibaba</groupId>
368                 <artifactId>fastjson</artifactId>
369                 <version>${fastjson.version}</version>
370             </dependency>
371             <!-- javax.annotation/jsr250-api -->
372             <dependency>
373                 <groupId>javax.annotation</groupId>
374                 <artifactId>jsr250-api</artifactId>
375                 <version>${jsr250.version}</version>
376             </dependency>
377         </dependencies>
378     </dependencyManagement>
379 
380     <build>
381         <plugins>
382             <!-- java编译插件 -->
383             <plugin>
384                 <groupId>org.apache.maven.plugins</groupId>
385                 <artifactId>maven-compiler-plugin</artifactId>
386                 <version>3.2</version>
387                 <configuration>
388                     <source>1.8</source>
389                     <target>1.8</target>
390                     <encoding>UTF-8</encoding>
391                 </configuration>
392             </plugin>
393         </plugins>
394 
395         <pluginManagement>
396             <plugins>
397                 <!-- 配置Tomcat插件 -->
398                 <plugin>
399                     <groupId>org.apache.tomcat.maven</groupId>
400                     <artifactId>tomcat8-maven-plugin</artifactId>
401                     <version>3.0-r1756463</version>
402                 </plugin>
403             </plugins>
404         </pluginManagement>
405     </build>
406 
407 </project>

  2.web/pom.xml

  1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3     <parent>
  4         <artifactId>solution</artifactId>
  5         <groupId>lm.solution</groupId>
  6         <version>1.0-SNAPSHOT</version>
  7     </parent>
  8     <modelVersion>4.0.0</modelVersion>
  9     <groupId>lm.solution</groupId>
 10     <artifactId>web</artifactId>
 11     <packaging>war</packaging>
 12     <version>1.0-SNAPSHOT</version>
 13     <name>web Maven Webapp</name>
 14     <url>http://maven.apache.org</url>
 15     <dependencies>
 16         <!--Module-->
 17         <dependency>
 18             <groupId>lm.solution</groupId>
 19             <artifactId>service</artifactId>
 20             <version>1.0-SNAPSHOT</version>
 21         </dependency>
 22         <dependency>
 23             <groupId>lm.solution</groupId>
 24             <artifactId>common</artifactId>
 25             <version>1.0-SNAPSHOT</version>
 26         </dependency>
 27 
 28         <!--Libary-->
 29         <!--spring mvc-->
 30         <dependency>
 31             <groupId>org.springframework</groupId>
 32             <artifactId>spring-webmvc</artifactId>
 33         </dependency>
 34         <!--cglib-->
 35         <dependency>
 36             <groupId>cglib</groupId>
 37             <artifactId>cglib</artifactId>
 38         </dependency>
 39         <!-- mybatis核心包 -->
 40         <dependency>
 41             <groupId>org.mybatis</groupId>
 42             <artifactId>mybatis</artifactId>
 43         </dependency>
 44         <!--mybatis spring 插件 -->
 45         <dependency>
 46             <groupId>org.mybatis</groupId>
 47             <artifactId>mybatis-spring</artifactId>
 48         </dependency>
 49         <!-- Mysql数据库驱动包 -->
 50         <dependency>
 51             <groupId>mysql</groupId>
 52             <artifactId>mysql-connector-java</artifactId>
 53         </dependency>
 54         <!-- connection pool -->
 55         <dependency>
 56             <groupId>com.alibaba</groupId>
 57             <artifactId>druid</artifactId>
 58             <!--<scope>runtime</scope>-->
 59         </dependency>
 60         <!--servlet-->
 61         <dependency>
 62             <groupId>javax.servlet</groupId>
 63             <artifactId>javax.servlet-api</artifactId>
 64             <scope>provided</scope>
 65         </dependency>
 66         <dependency>
 67             <groupId>javax.servlet.jsp</groupId>
 68             <artifactId>jsp-api</artifactId>
 69             <scope>provided</scope>
 70         </dependency>
 71         <dependency>
 72             <groupId>javax.servlet</groupId>
 73             <artifactId>jstl</artifactId>
 74         </dependency>
 75         <!-- 映入JSON lib -->
 76         <dependency>
 77             <groupId>net.sf.json-lib</groupId>
 78             <artifactId>json-lib</artifactId>
 79             <classifier>jdk15</classifier>
 80         </dependency>
 81         <!-- 用dom4j解析xml文件 -->
 82         <dependency>
 83             <groupId>dom4j</groupId>
 84             <artifactId>dom4j</artifactId>
 85         </dependency>
 86         <!-- ehcache -->
 87         <dependency>
 88             <groupId>net.sf.ehcache</groupId>
 89             <artifactId>ehcache-core</artifactId>
 90         </dependency>
 91         <dependency>
 92             <groupId>net.sf.ehcache</groupId>
 93             <artifactId>ehcache-web</artifactId>
 94         </dependency>
 95         <!-- 上传组件包 -->
 96         <dependency>
 97             <groupId>commons-fileupload</groupId>
 98             <artifactId>commons-fileupload</artifactId>
 99         </dependency>
100         <dependency>
101             <groupId>commons-io</groupId>
102             <artifactId>commons-io</artifactId>
103         </dependency>
104         <!-- common others -->
105         <dependency>
106             <groupId>commons-codec</groupId>
107             <artifactId>commons-codec</artifactId>
108         </dependency>
109         <dependency>
110             <groupId>org.apache.commons</groupId>
111             <artifactId>commons-collections4</artifactId>
112         </dependency>
113         <dependency>
114             <groupId>org.apache.commons</groupId>
115             <artifactId>commons-lang3</artifactId>
116         </dependency>
117         <!-- commons-beanutils -->
118         <dependency>
119             <groupId>commons-beanutils</groupId>
120             <artifactId>commons-beanutils</artifactId>
121             <exclusions>
122                 <exclusion>
123                     <groupId>commons-logging</groupId>
124                     <artifactId>commons-logging</artifactId>
125                 </exclusion>
126             </exclusions>
127         </dependency>
128         <!-- freemarker -->
129         <dependency>
130             <groupId>org.freemarker</groupId>
131             <artifactId>freemarker</artifactId>
132         </dependency>
133         <!-- org.apache.httpcomponents -->
134         <dependency>
135             <groupId>org.apache.httpcomponents</groupId>
136             <artifactId>httpcore</artifactId>
137         </dependency>
138         <dependency>
139             <groupId>org.apache.httpcomponents</groupId>
140             <artifactId>httpclient</artifactId>
141         </dependency>
142         <!-- redis.clients/jedis -->
143         <dependency>
144             <groupId>redis.clients</groupId>
145             <artifactId>jedis</artifactId>
146         </dependency>
147         <!-- com.rabbitmq/amqp-client -->
148         <dependency>
149             <groupId>com.rabbitmq</groupId>
150             <artifactId>amqp-client</artifactId>
151         </dependency>
152         <!-- com.alibaba/fastjson -->
153         <dependency>
154             <groupId>com.alibaba</groupId>
155             <artifactId>fastjson</artifactId>
156         </dependency>
157     </dependencies>
158     <build>
159         <finalName>web</finalName>
160 
161         <plugins>
162             <plugin>
163                 <groupId>org.apache.tomcat.maven</groupId>
164                 <artifactId>tomcat8-maven-plugin</artifactId>
165             </plugin>
166         </plugins>
167     </build>
168 </project>

二、web 配置

  在 java config 配置方式中,我们就不需要在 web.xml 中配置监听及servlet 等节点了,这里我们仍然使用 servlet 3.0 API 。

  1.web.xml

 1 <!DOCTYPE web-app PUBLIC
 2         "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 3         "http://java.sun.com/dtd/web-app_2_3.dtd" >
 4 
 5 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 6          xmlns="http://java.sun.com/xml/ns/javaee"
 7          xsi:schemaLocation="
 8             http://java.sun.com/xml/ns/javaee
 9             http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
10          id="WebApp_ID"
11          version="3.0">
12 </web-app>

三、用 JavaConfig 替代 web.xml 中 servlet 配置及监听配置

  public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer:  

    WebInitializer继承关系链:

    WebInitializer -->AbstractAnnotationConfigDispatcherServletInitializer -->AbstractDispatcherServletInitializer -->

    AbstractContextLoaderInitializer -->WebApplicationInitializer

    实现 WebApplicationInitializer 接口,就等同于 web.xml 配置

    @Override public void onStartup :

      web.xml 核心的相关配置,可再此方法中重写 自定义的配置 ,如:<filter> 可用 FilterRegistration.Dynamic encodingFilter 此种方式来配置。

    @Override protected Class<?>[] getRootConfigClasses :

      重写此方法,以替代 spring-context.xml ,在这个方法中返回的 类类型数组 可配置上下文中需要的 bean ,如数据库,缓存 等等。

    @Override protected Class<?>[] getServletConfigClasses:

      重写此方法,以替代 spring-mvc.xml ,在这个方法中返回的类型数组 可配置 spring 中 视图解析器,http message converter 等框架需要的 bean。

    @Override protected String[] getServletMappings :      

      重写此方法,就相当于 <servlet-mapping> 节点等同的功能,可指定 站点根路径。

  public class WebConfig extends WebMvcConfigurerAdapter :

    @EnableWebMvc:注解会开启一些默认配置,如:ViewResolver MessageConverter 等,若无此注解,重写 WebMvcConfigurerAdapter 方法无效。

    @ComponentScan:会扫描指定包中的类,根据注解,将特定类初始化为 上下文中需要的 bean 。

    @Override public void addViewControllers :

      重写 addViewControllers 简化页面快捷转向,这样就可以不用配置 Controller 了(就是那些仅返回一个页面路径的简单 controller )。

    @Bean public InternalResourceViewResolver viewResolver :

      配置JSP视图解析器

    @Bean public MultipartResolver multipartResolver :

      配置springMVC处理上传文件的信息

    @Override public void addResourceHandlers :

      配置静态文件处理

  1.WebInitializer.java

 1 package lm.solution.web.config;
 2 
 3 import lm.solution.web.config.configs.RootConfig;
 4 import lm.solution.web.config.configs.WebConfig;
 5 import org.springframework.web.filter.CharacterEncodingFilter;
 6 import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
 7 
 8 import javax.servlet.*;
 9 
10 /**
11  * WebInitializer继承关系链:
12  * WebInitializer -->
13  * AbstractAnnotationConfigDispatcherServletInitializer  -->
14  * AbstractDispatcherServletInitializer  -->
15  * AbstractContextLoaderInitializer  -->
16  * WebApplicationInitializer
17  * 实现 WebApplicationInitializer 接口,就等同于 web.xml 配置
18  * */
19 public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
20 
21     @Override
22     public void onStartup(ServletContext servletContext)
23             throws ServletException{
24 
25         /**
26          * super 中已设置 servlet.setLoadOnStartup(1)
27          * */
28         super.onStartup(servletContext);
29 
30         //
31         ServletRegistration servletRegistration =servletContext.getServletRegistration("dispatcher");
32 
33         // spring 字符过滤
34         FilterRegistration.Dynamic encodingFilter=servletContext.addFilter("encoding-filter",CharacterEncodingFilter.class);
35         encodingFilter.setInitParameter("encoding","UTF-8");
36         encodingFilter.setInitParameter("forceEncoding","true");
37         encodingFilter.setAsyncSupported(true);
38         encodingFilter.addMappingForUrlPatterns(null,true,"/*");
39 
40 
41     }
42 
43     // root配置类初始化
44     // 指定 Root WebApplicationContext 类,这个类必须@Configuration来注解,从而代替XML配置文件
45     @Override
46     protected Class<?>[] getRootConfigClasses() {
47 
48         return new Class<?>[]{RootConfig.class};
49 
50     }
51 
52     // web配置类初始化
53     // 指定 Servlet WebApplicationContext 类,这个类必须@Configuration来注解,从而代替XML配置文件
54     @Override
55     protected Class<?>[] getServletConfigClasses() {
56 
57         return new Class<?>[]{WebConfig.class};
58 
59     }
60 
61     // 映射根路径初始化
62     // 指定 Servlet mappings
63     @Override
64     protected String[] getServletMappings() {
65 
66         return new String[]{"/"};
67 
68     }
69 
70     @Override
71     protected Filter[] getServletFilters() {
72 
73         return null;
74 
75     }
76 
77     @Override
78     protected void customizeRegistration(ServletRegistration.Dynamic registration){
79 
80         // 让404作为异常抛出 不使用tomcat默认的
81         registration.setInitParameter("throwExceptionIfNoHandlerFound","true");
82 
83     }
84 
85 }

  2.WebConfig.java

  1 package lm.solution.web.config.configs;
  2 
  3 import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
  4 import lm.solution.common.web.messageconverter.CustomMessageConverter;
  5 import lm.solution.web.config.beans.TimerInterceptor;
  6 import org.springframework.context.annotation.Bean;
  7 import org.springframework.context.annotation.ComponentScan;
  8 import org.springframework.context.annotation.Configuration;
  9 import org.springframework.http.MediaType;
 10 import org.springframework.http.converter.HttpMessageConverter;
 11 import org.springframework.web.multipart.MultipartResolver;
 12 import org.springframework.web.multipart.commons.CommonsMultipartResolver;
 13 import org.springframework.web.servlet.config.annotation.*;
 14 import org.springframework.web.servlet.view.InternalResourceViewResolver;
 15 import org.springframework.web.servlet.view.JstlView;
 16 
 17 import java.util.ArrayList;
 18 import java.util.List;
 19 
 20 @Configuration
 21 /**
 22  * @EnableWebMvc 注解会开启一些默认配置,如:ViewResolver MessageConverter 等,
 23  * 若无此注解,重写 WebMvcConfigurerAdapter 方法无效
 24  * */
 25 @EnableWebMvc
 26 @ComponentScan(value = {
 27         "lm.solution.web",
 28         "lm.solution.service.mysql",
 29         "lm.solution.service.webtest"
 30 })
 31 /**
 32  * 继承 WebMvcConfigurerAdapter 类,重写其方法可对 spring mvc 进行配置
 33  * */
 34 public class WebConfig extends WebMvcConfigurerAdapter {
 35 
 36     // 重写 addViewControllers 简化页面快捷转向,这样就可以不用配置 Controller 了
 37     @Override
 38     public void addViewControllers(ViewControllerRegistry registry) {
 39 
 40         registry.addViewController("/").setViewName("index");
 41         registry.addViewController("/error").setViewName("error/error");
 42         registry.addViewController("/excel").setViewName("excel/excel");
 43         // 文件上传下载
 44         registry.addViewController("/upload").setViewName("fileupload/upload");
 45         registry.addViewController("/ImageValidateCodeLogin").setViewName("login/imageValidateCodeLogin");
 46         registry.addViewController("/restfulapi").setViewName("restful/user");
 47         registry.addViewController("/jaxwsri").setViewName("jaxwsri/wsri");
 48         registry.addViewController("/redis").setViewName("redis/jedis");
 49         registry.addViewController("/mybatisPage").setViewName("db/mybatis");
 50         registry.addViewController("/messageconverter").setViewName("httpmessageconverter/customconverter");
 51         registry.addViewController("/sse").setViewName("serverpushmessage/sse");
 52 
 53     }
 54 
 55     // 配置JSP视图解析器
 56     @Bean
 57     public InternalResourceViewResolver viewResolver() {
 58         InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
 59         /**
 60          * views 在 /resources/ 下
 61          * */
 62         // 前缀
 63         viewResolver.setPrefix("/WEB-INF/classes/views/");
 64         // 后缀
 65         viewResolver.setSuffix(".jsp");
 66         viewResolver.setViewClass(JstlView.class);
 67         viewResolver.setContentType("text/html");
 68         // 可以在JSP页面中通过${}访问beans
 69         viewResolver.setExposeContextBeansAsAttributes(true);
 70         return viewResolver;
 71     }
 72 
 73     // 配置springMVC处理上传文件的信息
 74     @Bean
 75     public MultipartResolver multipartResolver() {
 76         CommonsMultipartResolver resolver = new CommonsMultipartResolver();
 77         resolver.setDefaultEncoding("UTF-8");
 78         resolver.setMaxUploadSize(10485760000L);
 79         resolver.setMaxInMemorySize(40960);
 80         return resolver;
 81     }
 82 
 83     // 配置静态文件处理
 84     @Override
 85     public void addResourceHandlers(ResourceHandlerRegistry registry){
 86 
 87         /**
 88          * addResourceHandler 指的是对外暴露的访问路径
 89          * addResourceLocations 指的是文件放置的目录
 90          * */
 91         registry.addResourceHandler("/assets/**")
 92                 .addResourceLocations("classpath:/assets/");
 93 
 94         // href 链接方式 下载文件
 95         registry.addResourceHandler("/files/**")
 96                 .addResourceLocations("classpath:/files/");
 97 
 98         /**
 99          * 解决 No handler found for GET /favicon.ico 异常
100          * */
101         registry.addResourceHandler("/favicon.ico")
102                 .addResourceLocations("classpath:/favicon.ico");
103 
104     }
105 
106     // 重写 configurePathMatch ,改变路径参数匹配
107     @Override
108     public void configurePathMatch(PathMatchConfigurer configurer) {
109 
110         /**
111          * Spring mvc 默认 如果路径参数后面带点,如 “/mm/nn/xx.yy” 后面的yy值将被忽略
112          * 加入下面的配置,就不会忽略“.”后面的参数了
113          * */
114         configurer.setUseSuffixPatternMatch(false);
115 
116     }
117 
118 //
119 //    // 负责读取二进制格式的数据和写出二进制格式的数据;
120 //    @Bean
121 //    public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() {
122 //
123 //        return new ByteArrayHttpMessageConverter();
124 //
125 //    }
126 //
127 //    // 负责读取字符串格式的数据和写出字符串格式的数据;
128 //    @Bean
129 //    public StringHttpMessageConverter stringHttpMessageConverter() {
130 //
131 //        StringHttpMessageConverter messageConverter = new StringHttpMessageConverter();
132 //        messageConverter.setDefaultCharset(Charset.forName("UTF-8"));
133 //        return messageConverter;
134 //
135 //    }
136 //
137 //    // 负责读取资源文件和写出资源文件数据;
138 //    @Bean
139 //    public ResourceHttpMessageConverter resourceHttpMessageConverter() {
140 //
141 //        return new ResourceHttpMessageConverter();
142 //
143 //    }
144 //
145 //    /**
146 //     * 负责读取form提交的数据
147 //     * 能读取的数据格式为 application/x-www-form-urlencoded,
148 //     * 不能读取multipart/form-data格式数据;
149 //     * 负责写入application/x-www-from-urlencoded和multipart/form-data格式的数据;
150 //     */
151 //    @Bean
152 //    public FormHttpMessageConverter formHttpMessageConverter() {
153 //
154 //        return new FormHttpMessageConverter();
155 //
156 //    }
157 //
158 //    // 负责读取和写入json格式的数据;
159 //    /**
160 //     * 配置 fastjson 中实现 HttpMessageConverter 接口的转换器
161 //     * FastJsonHttpMessageConverter 是 fastjson 中实现了 HttpMessageConverter 接口的类
162 //     */
163 //    @Bean(name = "fastJsonHttpMessageConverter")
164 //    public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
165 //        //
166 //        String txtHtml = "text/html;charset=UTF-8";
167 //        String txtJson = "text/json;charset=UTF-8";
168 //        String appJson = "application/json;charset=UTF-8";
169 //
170 //        // 这里顺序不能反,一定先写 text/html,不然 IE 下会出现下载提示
171 //        List<MediaType> mediaTypes = new ArrayList<>();
172 //        mediaTypes.add(MediaType.parseMediaType(txtHtml));
173 //        mediaTypes.add(MediaType.parseMediaType(txtJson));
174 //        mediaTypes.add(MediaType.parseMediaType(appJson));
175 //
176 //        // 加入支持的媒体类型,返回 contentType
177 //        FastJsonHttpMessageConverter fastjson = new FastJsonHttpMessageConverter();
178 //        fastjson.setSupportedMediaTypes(mediaTypes);
179 //        return fastjson;
180 //
181 //    }
182 //
183 //    // 负责读取和写入 xml 中javax.xml.transform.Source定义的数据;
184 //    @Bean
185 //    public SourceHttpMessageConverter sourceHttpMessageConverter() {
186 //
187 //        return new SourceHttpMessageConverter();
188 //
189 //    }
190 //
191 //    // 负责读取和写入xml 标签格式的数据;
192 //    @Bean
193 //    public Jaxb2RootElementHttpMessageConverter jaxb2RootElementHttpMessageConverter() {
194 //
195 //        return new Jaxb2RootElementHttpMessageConverter();
196 //
197 //    }
198 //
199 //    // 注册消息转换器
200 //    /**
201 //     * 重写 configureMessageConverters 会覆盖掉 spring mvc 默认注册的多个 HttpMessageConverter
202 //     * 所以 推荐使用 extendMessageConverter
203 //     * */
204 //    /**
205 //     * Error:
206 //     * 400:(错误请求) 服务器不理解请求的语法。
207 //     * 415:(不支持的媒体类型) 请求的格式不受请求页面的支持。
208 //     */
209 //    @Override
210 //    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
211 //
212 //        converters.add(this.byteArrayHttpMessageConverter());
213 //        converters.add(this.stringHttpMessageConverter());
214 //        converters.add(this.resourceHttpMessageConverter());
215 //        converters.add(this.formHttpMessageConverter());
216 //        converters.add(this.fastJsonHttpMessageConverter());
217 //        converters.add(this.sourceHttpMessageConverter());
218 //        converters.add(this.jaxb2RootElementHttpMessageConverter());
219 //
220 //    }
221 
222     // 自定义 HttpMessageConverter
223     @Bean
224     public CustomMessageConverter customMessageConverter(){
225 
226         return new CustomMessageConverter();
227 
228     }
229 
230     // 负责读取和写入json格式的数据;
231     /**
232      * 配置 fastjson 中实现 HttpMessageConverter 接口的转换器
233      * FastJsonHttpMessageConverter 是 fastjson 中实现了 HttpMessageConverter 接口的类
234      */
235     @Bean(name = "fastJsonHttpMessageConverter")
236     public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
237         //
238         String txtHtml = "text/html;charset=UTF-8";
239         String txtJson = "text/json;charset=UTF-8";
240         String appJson = "application/json;charset=UTF-8";
241 
242         // 这里顺序不能反,一定先写 text/html,不然 IE 下会出现下载提示
243         List<MediaType> mediaTypes = new ArrayList<>();
244         mediaTypes.add(MediaType.parseMediaType(txtHtml));
245         mediaTypes.add(MediaType.parseMediaType(txtJson));
246         mediaTypes.add(MediaType.parseMediaType(appJson));
247 
248         // 加入支持的媒体类型,返回 contentType
249         FastJsonHttpMessageConverter fastjson = new FastJsonHttpMessageConverter();
250         fastjson.setSupportedMediaTypes(mediaTypes);
251         return fastjson;
252 
253     }
254 
255     /**
256      * 重写 extendMessageConverters 方法,仅添加自定义 HttpMessageConverter
257      * 不覆盖默认注册的 HttpMessageConverter
258      * */
259     @Override
260     public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
261 
262         converters.add(customMessageConverter());
263         converters.add(fastJsonHttpMessageConverter());
264 
265     }
266 
267     // 拦截器 bean
268     @Bean
269     public TimerInterceptor timerInterceptor(){
270 
271         return new TimerInterceptor();
272 
273     }
274 
275     // 重写 addInterceptors 注册拦截器
276     @Override
277     public void addInterceptors(InterceptorRegistry registry) {
278 
279         registry.addInterceptor(timerInterceptor());
280 
281     }
282 
283 }

  3.RootConfig.java

 1 package lm.solution.web.config.configs;
 2 
 3 import lm.solution.web.config.beans.MySqlBean;
 4 import lm.solution.web.config.beans.RedisBean;
 5 import org.springframework.context.annotation.Configuration;
 6 import org.springframework.context.annotation.Import;
 7 import lm.solution.web.config.beans.HandlerBean;
 8 
 9 @Configuration
10 @Import({
11         RedisBean.class,
12         MySqlBean.class,
13         HandlerBean.class
14 })
15 public class RootConfig {
16     /**
17      * 此处管理 Beans
18      * */
19 }

 

 

 

 

                                         蒙

                                    2018-05-20 23:46 周日

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Java堆和栈的区别和介绍,JVM的堆和栈

下一篇:多线程同步查找包含特定内容的文件