基于纯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

 

时间: 2024-09-22 22:25:54

基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置的相关文章

天气预报执行计划及完成程度+简单而又不简单获取当前时间和解析农历时间的纯JAVA代码

1. insert into weather_android_info (select * from weather_info); insert into weather_android_now_info (select * from weather_now_info); update weather_android_info set weather_temp1="0℃" where weather_temp1='null'; update weather_android_info s

纯Java代码实现流星划过天空_java

废话不多说了,直接给大家贴java代码了. import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import javax.swing.JFrame; import javax.swing.JPanel; public class MeteorFly extends JFrame { final int MAX = ; // (~)流星的个数 final int SLEEP =

Spring源代码解析(二):IOC容器在web容器中的启动

以下引用自博客:http://jiwenke-spring.blogspot.com/ 上面我们分析了IOC容器本身的实现,下面我们看看在典型的web环境中,Spring IOC 容器是怎样被载入和起作用的. 简单的说,在web容器中,通过ServletContext为Spring的IOC容器提供宿主环境,对 应的建立起一个IOC容器的体系.其中,首先需要建立的是根上下文,这个上下文持有的 对象可以有业务对象,数据存取对象,资源,事物管理器等各种中间层对象.在这个上下 文的基础上,和web MV

Java ,单实例 多线程 ,web容器,servlet与struts1-2.x系列,线程安全的解决

1.Servlet是如何处理多个请求同时访问呢? 回答:servlet是默认采用单实例,多线程的方式进行.只要webapp被发布到web容器中的时候,servlet只会在发布的时候实例化一次,servlet在其生命周期中只有在将项目给移除或服务器stop的时候才会销毁,那么一个web项目从发布到运行只存在一个servlet的实例.     servlet等一些web容器中有线程池ThreadPool.此处先贴出tomcat7.0.3中的server.xml里面的代码: 1

Spring学习笔记1——IOC: 尽量使用注解以及java代码(转)

在实战中学习Spring,本系列的最终目的是完成一个实现用户注册登录功能的项目. 预想的基本流程如下: 1.用户网站注册,填写用户名.密码.email.手机号信息,后台存入数据库后返回ok.(学习IOC,mybatis,SpringMVC的基础知识,表单数据验证,文件上传等) 2.服务器异步发送邮件给注册用户.(学习消息队列) 3.用户登录.(学习缓存.Spring Security) 4.其他. 边学习边总结,不定时更新.项目环境为Intellij + Spring4.   一.准备工作. 1

Android 在Java代码中设置style属性(以ProgressBar为例)

在andriod开发中,很大一部分都要与资源打交道,比如说:图片,布局文件,字符串,样式等等.这给我们想要开发一些公共的组件带来很大的困难,因为公共的组件可能更愿意以jar包的形式出现.但是java的jar包中只允许出现java代码而不能出现资源. 当我们想要以jar包的形式提供我们自己开发的公共组件时,我们就需要把以代码的形式创建资源. 下面提供一个使用全Java代码的形式创建一个ProgressBar. ProgressBar默认的样式是一个圈圈,我们要想其显示为进度条的样式可以在布局文件中

【整理】WEB 容器、WEB服务和应用服务器的区别与联系

对于一个不了解 WEB 开发的人来说,下面的概念是为了免于被别人鄙视和忽悠的~~  [web 容器]  何为容器:       容器是一种服务调用规范框架,J2EE 大量运用了容器和组件技术来构建分层的企业级应用.在 J2EE 规范中,相应的有 WEB Container 和 EJB Container 等.        WEB 容器给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使 JSP,SERVLET 直接跟容器中的环境变量交互,不必关注其它系统问题(从这个角度来说,we

浅析Java的Spring框架中IOC容器容器的应用_java

Spring容器是Spring框架的核心.容器将创建对象,它们连接在一起,配置它们,并从创建到销毁管理他们的整个生命周期.在Spring容器使用依赖注入(DI)来管理组成应用程序的组件.这些对象被称为Spring Beans. 容器获得其上的哪些对象进行实例化,配置和组装通过阅读提供的配置元数据的说明.配置元数据可以通过XML,Java注释或Java代码来表示.下面的图是Spring如何工作的高层次图. Spring IoC容器是利用Java的POJO类和配置元数据的产生完全配置和可执行的系统或

基于Java代码实现支付充值的通用流程_java

废话不多说了,直接给大家贴java代码了. 具体代码如下所示: /*支付流程*/ /****Controller.java 代码如下:*/ @RequestMapping(value = "/paySubmit.htm", method = RequestMethod.POST) public ModelAndView paySubmit(HttpServletRequest request, HttpServletResponse response, @RequestParam Ma