webconfig.java_Spring Web工程web.xml零配置即使用Java Config + Annotation

摘要: 在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值