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

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<context-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.g360.configuration.AppConfiguration</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>file:${rdm.home}/log4j.properties</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener> <servlet>
<description>staggingServlet</description>
<display-name>staggingServlet</display-name>
<servlet-name>staggingServlet</servlet-name>
<servlet-class>com.g360.bean.interfaces.StaggingServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>staggingServlet</servlet-name>
<url-pattern>*.stagging</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>SpringMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.g360.configuration.RestServiceConfiguration</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMvc</servlet-name>
<url-pattern>/springmvc/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>SAMLFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>SAMLFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener> <welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>

4、我们分类解读,在web.xml配置里面我们配置的Web Application Context

    <context-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.g360.configuration.AppConfiguration</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

就等价于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

<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>file:${rdm.home}/log4j.properties</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

就等价于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)

    <servlet>
<servlet-name>SpringMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.g360.configuration.RestServiceConfiguration</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMvc</servlet-name>
<url-pattern>/springmvc/*</url-pattern>
</servlet-mapping>

就等价于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

    <servlet>
<description>staggingServlet</description>
<display-name>staggingServlet</display-name>
<servlet-name>staggingServlet</servlet-name>
<servlet-class>com.g360.bean.interfaces.StaggingServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>staggingServlet</servlet-name>
<url-pattern>*.stagging</url-pattern>
</servlet-mapping>

就等价于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

 




												

Spring Web工程web.xml零配置即使用Java Config + Annotation的更多相关文章

  1. Spring整合Hibernate的XML文件配置,以及web.xml文件配置

    利用Spring整合Hibernate时的XML文件配置 applicationContext.xml <?xml version="1.0" encoding=" ...

  2. java web工程web.xml介绍

    转载自:http://blog.csdn.net/believejava/article/details/43229361 Web.xml详解: 1.web.xml加载过程(步骤) 首先简单讲一下,w ...

  3. spring-第十七篇之spring AOP基于注解的零配置方式

    1.基于注解的零配置方式 Aspect允许使用注解定义切面.切入点和增强处理,spring框架可以识别并根据这些注解来生成AOP代理.spring只是用了和AspectJ 5一样的注解,但并没有使用A ...

  4. [spring]Bean注入——在XML中配置

    Bean注入的方式有两种: 一.在XML中配置 属性注入 构造函数注入 工厂方法注入 二.使用注解的方式注入@Autowired,@Resource,@Required 本文首先讲解在XML中配置的注 ...

  5. java web 3.1-web.xml文件配置

    <?xml version="1.0" encoding="UTF-8" ?> <web-app xmlns:xsi="http:/ ...

  6. Spring AOP基于注解的“零配置”方式实现

    为了在Spring中启动@AspectJ支持,需要在类加载路径下新增两个AspectJ库:aspectjweaver.jar和aspectjrt.jar.除此之外,Spring AOP还需要依赖一个a ...

  7. myeclipse中从svn下载的web工程,到工作空间却显示成Java工程

    转载自:https://blog.csdn.net/u011217058/article/details/57970587 右键工程,properties-> Project Facets-&g ...

  8. Spring JdbcTemplate + transactionTemplate 简单示例 (零配置)

    jdbcTemplate简介 Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中. JdbcTempla ...

  9. 0077 web.xml中配置Spring MVC时,Servlet-name上报Servlet should have a mapping的错误

    这次是手工建立的web工程目录,在配置webapp/WEB-INF/web.xml的Spring MVC的DispatcherServlet时,在servlet-name上报错:Servlet sho ...

随机推荐

  1. 苹果IOS与谷歌 android系统的UI设计原则

    一.苹果为IOS的界面设计提出了六大原则: 1.整体美学 整体美学指的是一个应用的表现和行为与它的功能完美集成,传达连贯的信息. 人们关心一个应用是否提供它承诺的功能,但他们也被应用的外观和行为强烈影 ...

  2. ASCII码表(常用)

       

  3. iOS在GitHub Top 前100 简介

    主要对当前 GitHub 排名前 100 的项目做一个简单的简介, 方便初学者快速了解到当前 Objective-C 在 GitHub 的情况. 项目名称 项目信息 1. AFNetworking 作 ...

  4. linu下C语言之BMP图片操作编程(上)

    BMP文件格式,也被称为位图图像文件或与设备无关的位图文件格式(DIB)或者只是一个位图,是 一个光栅图形 图像文件格式使用 来存储位图,数字,图片,独立的显示设备. 微软已经定义了一个特定的表示颜色 ...

  5. Android实训案例(一)——计算器的运算逻辑

    Android实训案例(一)--计算器的运算逻辑 应一个朋友的邀请,叫我写一个计算器,开始觉得,就一个计算器嘛,很简单的,但是写着写着发现自己写出来的逻辑真不严谨,于是搜索了一下,看到mk(没有打广告 ...

  6. PS 滤镜算法原理——浮雕效果

    clc; clear all; Image=imread('4.jpg');Image=double(Image);p=3;  %% 控制浮雕的强度 %% 控制浮雕的方向 H=[0 0 p      ...

  7. 【Android 应用开发】Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  8. 面试之路(16)-归并排序详解(MergeSort)递归和非递归实现

    归并排序的概念及定义 归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并排序是建立 ...

  9. c++ list 合并操作函数实例

    #include <list> #include <iostream> using namespace std; //list 链表的打印 void print(list< ...

  10. OpenCV手写数字字符识别(基于k近邻算法)

    摘要 本程序主要参照论文,<基于OpenCV的脱机手写字符识别技术>实现了,对于手写阿拉伯数字的识别工作.识别工作分为三大步骤:预处理,特征提取,分类识别.预处理过程主要找到图像的ROI部 ...