摘要: 在Spring 3.0之前,我们工程中常用Bean都是通过XML形式的文件注解的,少了还可以,但是数量多,关系复杂到后期就很难维护了,所以在3.x之后Spring官方推荐使用Java Config方式去替换以前冗余的XML格式文件的配置方式;
在开始之前,我们需要注意一下,要基于Java Config实现无web.xml的配置,我们的工程的Servlet必须是3.0及其以上的版本;
1、我们要实现无web.xml的配置,只需要关注实现WebApplicationInitializer这个接口,以下为Spring源码:
public interfaceWebApplicationInitializer {/*** Configure the given {@linkServletContext} with any servlets, filters, listeners
* context-params and attributes necessary for initializing this web application. See
* examples {@linkplainWebApplicationInitializer above}.
*@paramservletContext the {@codeServletContext} to initialize
*@throwsServletException if any call against the given {@codeServletContext}
* throws a {@codeServletException}*/
void onStartup(ServletContext servletContext) throwsServletException;
}
2、我们这里先不讲他的原理,只要我们工程中实现这个接口的类,Spring容器在启动时候就会监听到我们所实现的这个类,从而读取我们的配置,就如读取web.xml一样,我们的实现类如下所示:
public class WebProjectConfigInitializer implementsWebApplicationInitializer {
@Overridepublic voidonStartup(ServletContext container) {
initializeSpringConfig(container);
initializeLog4jConfig(container);
initializeSpringMVCConfig(container);
registerServlet(container);
registerListener(container);
registerFilter(container);
}private voidinitializeSpringConfig(ServletContext container) {//Create the 'root' Spring application context
AnnotationConfigWebApplicationContext rootContext = newAnnotationConfigWebApplicationContext();
rootContext.register(AppConfiguration.class);//Manage the life cycle of the root application context
container.addListener(newContextLoaderListener(rootContext));
}private voidinitializeSpringMVCConfig(ServletContext container) {//Create the spring rest servlet's Spring application context
AnnotationConfigWebApplicationContext dispatcherContext = newAnnotationConfigWebApplicationContext();
dispatcherContext.register(RestServiceConfiguration.class);//Register and map the spring rest servlet
ServletRegistration.Dynamic dispatcher = container.addServlet("SpringMvc",newDispatcherServlet(dispatcherContext));
dispatcher.setLoadOnStartup(2);
dispatcher.setAsyncSupported(true);
dispatcher.addMapping("/springmvc/*");
}private voidinitializeLog4jConfig(ServletContext container) {//Log4jConfigListener
container.setInitParameter("log4jConfigLocation", "file:${rdm.home}/log4j.properties");
container.addListener(Log4jConfigListener.class);
PropertyConfigurator.configureAndWatch(System.getProperty("rdm.home") + "/log4j.properties", 60);
}private voidregisterServlet(ServletContext container) {
initializeStaggingServlet(container);
}private voidregisterFilter(ServletContext container) {
initializeSAMLFilter(container);
}private voidregisterListener(ServletContext container) {
container.addListener(RequestContextListener.class);
}private voidinitializeSAMLFilter(ServletContext container) {
FilterRegistration.Dynamic filterRegistration= container.addFilter("SAMLFilter", DelegatingFilterProxy.class);
filterRegistration.addMappingForUrlPatterns(null, false, "/*");
filterRegistration.setAsyncSupported(true);
}private voidinitializeStaggingServlet(ServletContext container) {
StaggingServlet staggingServlet= newStaggingServlet();
ServletRegistration.Dynamic dynamic= container.addServlet("staggingServlet", staggingServlet);
dynamic.setLoadOnStartup(3);
dynamic.addMapping("*.stagging");
}
}
3、以上的Java Config等同于如下web.xml配置:
contextClass
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
contextConfigLocation
com.g360.configuration.AppConfiguration
org.springframework.web.context.ContextLoaderListener
log4jConfigLocation
file:${rdm.home}/log4j.properties
org.springframework.web.util.Log4jConfigListener
staggingServlet
staggingServlet
staggingServlet
com.g360.bean.interfaces.StaggingServlet
staggingServlet
*.stagging
SpringMvc
org.springframework.web.servlet.DispatcherServlet
contextClass
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
contextConfigLocation
com.g360.configuration.RestServiceConfiguration
1
true
SpringMvc
/springmvc/*
SAMLFilter
org.springframework.web.filter.DelegatingFilterProxy
true
SAMLFilter
/*
org.springframework.web.context.request.RequestContextListener
login.jsp
4、我们分类解读,在web.xml配置里面我们配置的Web Application Context
contextClass
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
contextConfigLocation
com.g360.configuration.AppConfiguration
org.springframework.web.context.ContextLoaderListener
就等价于Java Config中的
private voidinitializeSpringConfig(ServletContext container) {//Create the 'root' Spring application context
AnnotationConfigWebApplicationContext rootContext = newAnnotationConfigWebApplicationContext();
rootContext.register(AppConfiguration.class);//Manage the life cycle of the root application context
container.addListener(newContextLoaderListener(rootContext));
}
如此推断,在web.xml配置里面我们配置的log4j
log4jConfigLocation
file:${rdm.home}/log4j.properties
org.springframework.web.util.Log4jConfigListener
就等价于Java Config的
private voidinitializeLog4jConfig(ServletContext container) {//Log4jConfigListener
container.setInitParameter("log4jConfigLocation", "file:${rdm.home}/log4j.properties");
container.addListener(Log4jConfigListener.class);
PropertyConfigurator.configureAndWatch(System.getProperty("rdm.home") + "/log4j.properties", 60);
}
类此,在web.xml配置里面我们配置的Spring Web(Spring Restful)
SpringMvc
org.springframework.web.servlet.DispatcherServlet
contextClass
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
contextConfigLocation
com.g360.configuration.RestServiceConfiguration
1
true
SpringMvc
/springmvc/*
就等价于Java Config中的
private voidinitializeSpringMVCConfig(ServletContext container) {//Create the spring rest servlet's Spring application context
AnnotationConfigWebApplicationContext dispatcherContext = newAnnotationConfigWebApplicationContext();
dispatcherContext.register(RestServiceConfiguration.class);//Register and map the spring rest servlet
ServletRegistration.Dynamic dispatcher = container.addServlet("SpringMvc",newDispatcherServlet(dispatcherContext));
dispatcher.setLoadOnStartup(2);
dispatcher.setAsyncSupported(true);
dispatcher.addMapping("/springmvc/*");
}
再此,在web.xml配置里面我们配置的servlet
staggingServlet
staggingServlet
staggingServlet
com.g360.bean.interfaces.StaggingServlet
staggingServlet
*.stagging
就等价于Java Config中的
private voidinitializeStaggingServlet(ServletContext container) {
StaggingServlet staggingServlet= newStaggingServlet();
ServletRegistration.Dynamic dynamic= container.addServlet("staggingServlet", staggingServlet);
dynamic.setLoadOnStartup(3);
dynamic.addMapping("*.stagging");
}
后面以此类推,在这里不加详述了;
5、如上面所说的,我们对Web 工程的整体配置都依赖于AppConfiguration这个配置类,下面是使用@Configuration 配置类注解的,大家使用过的,以此类推,都比较清楚,
这里就不加赘述了;
@Configuration
@EnableTransactionManagement
@EnableAsync
@EnableAspectJAutoProxy
@EnableScheduling
@Import({ RestServiceConfiguration.class, BatchConfiguration.class, DatabaseConfiguration.class, ScheduleConfiguration.class})
@ComponentScan({"com.service", "com.dao", "com.other"})public classAppConfiguration
{private Logger logger = LoggerFactory.getLogger(AppConfiguration.class);/****/
publicAppConfiguration ()
{//TODO Auto-generated constructor stub
logger.info("[Initialize application]");
Locale.setDefault(Locale.US);
}
}
还有就是对Spring Web配置的类RestServiceConfiguration ,个人可根据自己的实际项目需求在此配置自己的视图类型以及类型转换等等
@Configuration
@EnableWebMvc
@EnableAspectJAutoProxy(proxyTargetClass= true)
@ComponentScan(basePackages= { "com.bean"})public class RestServiceConfiguration extendsWebMvcConfigurationSupport {
@BeanpublicRequestMappingHandlerAdapter requestMappingHandlerAdapter() {
RequestMappingHandlerAdapter handlerAdapter= super.requestMappingHandlerAdapter();returnhandlerAdapter;
}
@BeanpublicLocaleChangeInterceptor localeChangeInterceptor() {return newLocaleChangeInterceptor();
}
@BeanpublicLogAspect logAspect() {return newLogAspect();
}
}
至此,我们的 web.xml使用Java Config零配置就完了
https://my.oschina.net/521cy/blog/702864