博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Web工程web.xml零配置即使用Java Config + Annotation
阅读量:7113 次
发布时间:2019-06-28

本文共 10905 字,大约阅读时间需要 36 分钟。

摘要: 在Spring 3.0之前,我们工程中常用Bean都是通过XML形式的文件注解的,少了还可以,但是数量多,关系复杂到后期就很难维护了,所以在3.x之后Spring官方推荐使用Java Config方式去替换以前冗余的XML格式文件的配置方式;

在开始之前,我们需要注意一下,要基于Java Config实现无web.xml的配置,我们的工程的Servlet必须是3.0及其以上的版本;

1、我们要实现无web.xml的配置,只需要关注实现WebApplicationInitializer这个接口,以下为Spring源码:

public interface WebApplicationInitializer {    /**     * Configure the given {
@link ServletContext} with any servlets, filters, listeners * context-params and attributes necessary for initializing this web application. See * examples {
@linkplain WebApplicationInitializer above}. * @param servletContext the {
@code ServletContext} to initialize * @throws ServletException if any call against the given {
@code ServletContext} * throws a {
@code ServletException} */ void onStartup(ServletContext servletContext) throws ServletException;}

 

2、我们这里先不讲他的原理,只要我们工程中实现这个接口的类,Spring容器在启动时候就会监听到我们所实现的这个类,从而读取我们的配置,就如读取web.xml一样,我们的实现类如下所示:

public class WebProjectConfigInitializer implements WebApplicationInitializer {    @Override    public void onStartup(ServletContext container) {        initializeSpringConfig(container);        initializeLog4jConfig(container);        initializeSpringMVCConfig(container);        registerServlet(container);        registerListener(container);        registerFilter(container);    }    private void initializeSpringConfig(ServletContext container) {        // Create the 'root' Spring application context        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();        rootContext.register(AppConfiguration.class);        // Manage the life cycle of the root application context        container.addListener(new ContextLoaderListener(rootContext));    }    private void initializeSpringMVCConfig(ServletContext container) {        // Create the spring rest servlet's Spring application context        AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();        dispatcherContext.register(RestServiceConfiguration.class);        // Register and map the spring rest servlet        ServletRegistration.Dynamic dispatcher = container.addServlet("SpringMvc",                new DispatcherServlet(dispatcherContext));        dispatcher.setLoadOnStartup(2);        dispatcher.setAsyncSupported(true);        dispatcher.addMapping("/springmvc/*");    }    private void initializeLog4jConfig(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 void registerServlet(ServletContext container) {        initializeStaggingServlet(container);    }    private void registerFilter(ServletContext container) {        initializeSAMLFilter(container);    }    private void registerListener(ServletContext container) {        container.addListener(RequestContextListener.class);    }    private void initializeSAMLFilter(ServletContext container) {        FilterRegistration.Dynamic filterRegistration = container.addFilter("SAMLFilter", DelegatingFilterProxy.class);        filterRegistration.addMappingForUrlPatterns(null, false, "/*");        filterRegistration.setAsyncSupported(true);    }    private void initializeStaggingServlet(ServletContext container) {        StaggingServlet staggingServlet = new StaggingServlet();        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 void initializeSpringConfig(ServletContext container) {        // Create the 'root' Spring application context        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();        rootContext.register(AppConfiguration.class);        // Manage the life cycle of the root application context        container.addListener(new ContextLoaderListener(rootContext));}

如此推断,在web.xml配置里面我们配置的log4j

log4jConfigLocation
file:${rdm.home}/log4j.properties
org.springframework.web.util.Log4jConfigListener

就等价于Java Config的

private void initializeLog4jConfig(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 void initializeSpringMVCConfig(ServletContext container) {        // Create the spring rest servlet's Spring application context        AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();        dispatcherContext.register(RestServiceConfiguration.class);        // Register and map the spring rest servlet        ServletRegistration.Dynamic dispatcher = container.addServlet("SpringMvc",                new DispatcherServlet(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 void initializeStaggingServlet(ServletContext container) {        StaggingServlet staggingServlet = new StaggingServlet();        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 class AppConfiguration{  private Logger logger = LoggerFactory.getLogger(AppConfiguration.class);  /**   *    */  public AppConfiguration ()  {    // 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 extends WebMvcConfigurationSupport {        @Bean    public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {        RequestMappingHandlerAdapter handlerAdapter = super.requestMappingHandlerAdapter();        return handlerAdapter;    }    @Bean    public LocaleChangeInterceptor localeChangeInterceptor() {        return new LocaleChangeInterceptor();    }    @Bean    public LogAspect logAspect() {        return new LogAspect();    }}

至此,我们的 web.xml使用Java Config零配置就完了

https://my.oschina.net/521cy/blog/702864

 
 
 
 
 
 

 

转载地址:http://ytghl.baihongyu.com/

你可能感兴趣的文章
使用meta实现页面的定时刷新或跳转
查看>>
[华为机试练习题]3.分解字符串
查看>>
OSGi 理论: 模块元数据 (Bundle's manifest file)
查看>>
Android fragment笔记整理
查看>>
velocity的一些优化记录
查看>>
Oracle---使用PL/SQL Developer连接Oracle12C(64位)版本
查看>>
④云上场景:浙江网商银行,三层金融云实践
查看>>
mongoDB VS PostgreSQL dml performance use python (pymongo & py-postgresql)
查看>>
Github上的star和fork是什么
查看>>
说说 ParcelJS
查看>>
2018.03.08、View的事件分发机制笔记
查看>>
基于ubuntu16.04快速构建Hyperledger Fabric网络
查看>>
前端异常处理最佳实践
查看>>
# 基于VirtualApk的Android手游SDK插件化架构(一)
查看>>
jvm类加载机制
查看>>
让更多人知道你——给开源库提交 pr
查看>>
使用ipmi调节r410的风扇转速
查看>>
Spring Cloud超简单十分钟入门实例
查看>>
Linux环境Apache2.4+mysql5.7+php5.6快速安装mysql
查看>>
MySql 日常指导,及大表优化思路
查看>>