基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置
经过《基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理》和《基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - 静态资源、视图和消息器》两篇博文的介绍,我们已经配置好了Spring所需的基本配置。在这边博文中,我们将介绍怎么使用这些配置到实际项目中,并将web.xml文件替换为一个Java类。
我们使用Java代码来配置Spring,目的就是使我们的这些配置能够复用,对于这些配置的复用,我们采用继承和引入来实现。我们同样提供两个类在项目中配置Spring容器。首先提供一个AppConfig类来配置Spring容器,源码如下:
package com.kiiwow; import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement; import com.kiiwow.framework.config.context.spring.rest.RestSpringContextConfig;
import com.kiiwow.framework.config.context.spring.rest.dbconfig.C3p0DataSourceDBConfig; @Configuration
@EnableAspectJAutoProxy
@EnableTransactionManagement
@ComponentScan(basePackages = {"com.kiiwow.*"})
@Import({SpringContextConfig.class, C3p0DataSourceDBConfig.class})
@PropertySource({"classpath:kiiwow.properties"})
public class AppConfig { }
上面的代码使用到了很多注解,我们逐一解释其作用:
@Configuration,用于表示这个类是一个配置类,用于配置Spring的相关信息
@EnableAspectJAutoProxy,启用切面自动代理,用于AOP
@EnableTransactionManagement,启用注解事务,即可以使用@Transactional注解来控制事务
@ComponentScan,组件扫描,在basePackages指定的目录下扫描被@Controller、@Service、@Component等注解注册的组件
@Import,引入指定的配置类,我们引入了Spring容器配置类和数据源事务配置类
@PropertySource,加载指定的配置文件,配置文件内容会加载入Environment中等待调用
这样我们就把Spring容器所需要的配置完成了,接下来我们提供一个WebConfig类来配置Web子容器的相关内容,源码如下:
package com.kiiwow; import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import com.kiiwow.framework.config.context.spring.WebContextConfig; @Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.kiiwow.*"})
@PropertySource({"classpath:kiiwow.properties"})
public class WebConfig extends WebContextConfig { @Override
public void addInterceptors(InterceptorRegistry registry) {
//注册自定义监听器
} }
@EnableWebMvc注解用于启用SpringMVC,我们让WebConfig继承自我们已经设计好的Web子容器配置类WebContextConfig,这样WebConfig就已经拥有了所需要的基本配置。
由于WebContextConfig本身继承了org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter,所以我们可以直接重写void addInterceptors(InterceptorRegistry registry)方法来注册自定义的监听器。
至此,我们基于Java代码对于Spring的基本配置就全部完成了。
但是我们知道,SpringMVC要运行起来还需要在web.xml中配置相关的Servlet,不过既然我们对Spring都采用了全Java配置,那我们也不妨用Java代码来代替web.xml配置。我们提供一个KiiwowInitializer类来替代web.xml,这个类实现了org.springframework.web.WebApplicationInitializer接口,接口中有一个方法void onStartup(ServletContext container) throws ServletException,这个方法的方法体就是web容器启动时需要做的动作,也就是我们以前在web.xml中配置的信息。源码如下:
package com.kiiwow; import java.util.EnumSet; import javax.servlet.DispatcherType;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic; import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.DispatcherServlet; import com.kiiwow.framework.platform.sqlmapping.SQLMappingInitListener; /**
* 用于替代web.xml的web容器配置类
* 在这里配置过滤器、监听器、Servlet
*
* @author leon.gan
*
*/
public class KiiwowInitializer implements WebApplicationInitializer { @Override
public void onStartup(ServletContext container) throws ServletException {
//配置Spring提供的字符编码过滤器
javax.servlet.FilterRegistration.Dynamic filter = container.addFilter("encoding", new CharacterEncodingFilter());
//配置过滤器的过滤路径
filter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/"); //基于注解配置的Spring容器上下文
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
//注册Spring容器配置类
rootContext.register(AppConfig.class);
container.addListener(new ContextLoaderListener(rootContext));
//SQL配置文件监听器
container.addListener(new SQLMappingInitListener()); //基于注解配置的Web容器上下文
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
//注册Web容器配置类
context.register(WebConfig.class);
Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(context));
//配置映射路径
servlet.addMapping("/");
//启动顺序
servlet.setLoadOnStartup(1);
} }
我们首先将Spring提供的字符编码过滤器注册进容器,然后创建基于注解配置的Spring容器上下文,这个context用于注册对Spring容器进行配置的配置类,即刚才我们配置的AppConfig,然后将这个context加入容器的监听器中,使其生命周期与web容器的生命周期一致,然后添加一系列自定义的监听器。接着我们创建基于注解配置的Web容器上下文,这个上下文用于注册对SpringWeb容器进行配置的配置类,即我们刚才定义的WebConfig,然后基于这个上下文创建org.springframework.web.servlet.DispatcherServlet.DispatcherServlet用于拦截和转发请求。
至此,我们所有的配置都已经完成,这个时候我们项目中对于配置这一块就不会再存在XML文件了。另外,如果我们是使用Maven管理项目,这个时候Maven找不到我们项目中的web.xml文件就会在POM文件报错,并且也无法进行打包操作。这时我们需要在POM文件中添加一个WAR包插件用于抑制这个错误,源码如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
经过三篇博文,我们介绍了基于纯Java代码的Spring容器和Web容器零配置的方法,希望能够在Spring的使用
http://my.oschina.net/devleon/blog/530953
基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置的更多相关文章
- 在Android中用纯Java代码布局
感谢大佬:https://www.jianshu.com/p/7aedea560f16 在Android中用纯Java代码布局 本文的完成了参考了一篇国外的教程,在此表示感谢. Android中的界面 ...
- Android 使用纯Java代码布局
java布局 java代码布局和xml布局的区别 1.Java纯布局更加的灵活,比如自定义控件或一些特殊要求时,使用java代码布局 2.常用的xml布局是所见即所得的编写方式,以及xml本身拥有一些 ...
- DataX通过纯Java代码启动
DataX是阿里巴巴团队开发的一个很好开源项目,但是他们对如何使用只提供了python命令启动方式,这种方式对于只是想简单的用下DataX的人来说很是友好,仅仅需要几行代码就可以运行,但是如果你需要在 ...
- 帧动画的创建方式 - 纯Java代码方式
废话不多说,先看东西 帧动画的创建方式主要以下2种: * 用xml创建动画: * 纯Java代码创建动画: 本文内容主要关注 纯java代码创建帧动画 的方式: 用xml创建帧动画:http:// ...
- spring源码研究之IoC容器在web容器中初始化过程
转载自 http://ljbal.iteye.com/blog/497314 前段时间在公司做了一个项目,项目用了spring框架实现,WEB容器是Tomct 5,虽然说把项目做完了,但是一直对spr ...
- Spring Boot 嵌入式Web容器
目录 前言 1.起源 2.容器启动流程解析 2.1.获取应用类型 2.2.容器启动流程 3.加载 Web 容器工厂 4.总结 前言 最近在学习Spring Boot相关的课程,过程中以 ...
- IOC容器在web容器中初始化——(一)两种配置方式
参考文章http://blog.csdn.net/liuganggao/article/details/44083817,http://blog.csdn.net/u013185616/article ...
- Stripes视图框架实现纯Java代码控制表现层参考文档
https://blog.csdn.net/boonya/article/details/14101477 Stripes是一个开放源码的Web应用程序框架的基础上的模型 - 视图 - 控制器(MVC ...
- Android Studio编写运行测试纯java代码可带main()函数
问题 小伙伴们在做安卓项目的时候,是不是有时候会忘记某些api的使用方法,不太确定他们的结果是怎样的,需要写一些测试代码,验证看看我们的写法是否正确.刚开始的时候我是在页面上写一个Button,添加点 ...
随机推荐
- BZOJ 1416: [NOI2006]神奇的口袋( 高精度 )
把x1~xn当成是1~n, 答案是不会变的. 然后直接模拟就行了...... P.S 双倍经验... BZOJ1416 && BZOJ1498 -------------------- ...
- [重写库函数]atoi
算法分析 1. 若字符串开头是空格,则跳过所有空格,到第一个非空格字符,如果没有,则返回0. 2. 若第一个非空格字符是符号+/-,则标记isPositive的真假,这道题还有个局限性,那就是在c++ ...
- codeforces 659F . Polycarp and Hay 搜索
题目链接 遍历每个点, 如果这个点的值能被k整除并且k/a[i][j]后小于等于n*m, 那么就对这个点进行搜索. 将这个点加入队列, 将周围的所有大于等于这个点的值的点也加入队列. 不断重复, 直到 ...
- python3.5之输出HTML实体字符
出 关① 徐兰 凭山俯海古边州, 旆②影风翻见戍楼. 马后桃花马前雪,出关争得不回头? [注]关,指居庸关.②旆(pèi),旌旗. 刚刚学习用python写爬虫,实战一下. 抓取出一个网页的内容 ...
- 概率法求解三阶幻方[C语言]
#include <stdio.h> #include <string.h> ]={,,,,,,,,}; ]; ][]; int sum(int su[]) { ; ;su[i ...
- FAQ:Python环境变量配置
Python安装安装成,需要配置环境变量: 默认情况下,在windows下安装python之后,系统并不会自动添加相应的环境变量.此时不能在命令行直接使用python命令. 1. 首先需要在系统中注册 ...
- CentOS和Redhat发行版linux内核版本的对应关系
由于Redhat和CentOS的发行版本现在众多,所以我们应该知道CentOS和Redhat及linux内核之间版本的对应关系对维护系统还是很有帮助的.对应的列表如下: Redhat 9.0————— ...
- MFC的命令行
一个程序,我们通过输入不同的命令行参数,就可以实现一个可执行文件,多种功能,通过命令行来控制它的行为,例如,我们在控制台的时候,就是遇到最多的,如一个exe程序,加入为test..exe,我们可以设置 ...
- nodejs项目中的路由写法
//两种路由写法,一种封装成函数,返回结果,此种方法可以传递参数, "use strict"; var _ = require("lodash"); var e ...
- android高仿微信拍照、多选、预览、删除(去除相片)相冊功能
先声明授人与鱼不如授人与渔,仅仅能提供一个思路,当然须要源代码的同学能够私下有偿问我要源代码:QQ:508181017 工作了将近三年时间了,一直没正儿八经的研究系统自带的相冊和拍照,这回来个高仿微信 ...