从xml到Java

Spring的配置文件有三种方式:

  1. 使用xml
  2. 使用注解
  3. 使用Java代码

其中:使用xml可以把第三方类(jar包中的)声明为Spring IoC的组件,因为你无法直接在他人的代码中加入Controller,Service,Repository,等注解;使用注解可以很方便的声明自定义的组件到容器中,仅仅通过包扫描就可以使用了.

到后来JavaConfig的方式继承了XML配置的优点,同时使用Java代码还能保证配置的准确性,因为XML如果不借助编辑工具(如IDEA)的检查,很可能出现书写错误的情况,同时JavaConfig的方式还能在装配Bean时,进行更加灵活的配置;

web.xml的转换

先换个话题,探讨web.xml转换为JavaConfig的实现方式,这种方式也是SpringBoot的实现方式,SpringBoot可以把web项目打包成jar,然后直接运行jar,即可打开一个web工程,这里面就可以使用Java代码的方式书写web.xml;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.yuda.config;

import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import javax.servlet.*;

/**
* @auther ${user}
* Create on 2017/11/3 22:30.
* Project_name : testdemo1
* Package_name : com.yuda.config
* Description : TODO
*/
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
//相当与配置Spirng-Dao.xml,Spirng-Service.xml,Spring-*.xml等等
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
//相当与配置Spirng-MVC.xml
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
//相当于映射DispatcherServlet到"/"
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
//自定义注册
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
//配置下载缓存地址
registration.setMultipartConfig(
new MultipartConfigElement("/tmp/uploads"));
}
//配置过滤器
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("utf-8");
encodingFilter.setForceEncoding(true);
return new Filter[]{encodingFilter};
}

}

还有很多配置,后面持续更新

WebConfig.java

Spring-mvc.xml ======> WebConfig.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Configuration//这是个配置类
@EnableWebMvc//相当于 <mvc:annotation-driven />
@ComponentScan("com.yuda.web")//相当于扫描包<context:component-scan base-package="com.yuda.web"/>
@ImportResource(value = {"classpath*:mvc-dispatcher-servlet.xml"})//使用javaConfig同时还可以使用xml
public class WebConfig extends WebMvcConfigurerAdapter{ //继承WebMvcConfigurerAdapter,可以引用一些配置

//JSP视图解析器
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
viewResolver.setExposeContextBeansAsAttributes(true);
return viewResolver;
}
//默认的静态资源的处理
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
//自定义静态映射(灵活)
//网络路径resources下的所有请求都被映射到classpath下的test包中
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/test/");
}
}

还有很多配置,后面持续更新

RootConfig.java

Spring-*.xml ======> RootConfig.java

1
2
3
4
5
6
7
8
@Configuration		//配置类需要的
@ComponentScan(basePackages = {"com.yuda"}, //包扫描
excludeFilters = { //排除EnableWebMvc扫描到的注解
@ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)
})
@ImportResource(value = {"classpath*:applicationContext.xml"}) //导入xml文件
public class RootConfig {
}

还有很多配置,后面持续更新

总结

使用JavaConfig方式,代码的灵活性变的更高了,推荐使用,后续将持续更新本文档,总结自己感觉很有用的注解或者配置.