使用@Configuration注解配置类,实现spring MVC无web.xml配置.
1. project环境
IDE: eclipse
JDK: 1.7
Server: tomcat7.0
2. 使用maven创建webapp, project Web Module 3.0
3. project的pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.homeway</groupId> <artifactId>testPrj</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>testPrj Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <spring.version>4.1.5.RELEASE</spring.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.8.3</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.1</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> </dependencies> <build> <finalName>testPrj</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </build> </project>
4. 编写类, 实现WebApplicationInitializer接口. 这个动作就相当于配置web.xml
这个类的主要作用包含:
(1) 获取spring的配置信息,等同于web.xml中为ContextLoaderListener配置spring的applicationContext.xml
(2) 配置servlet和filter. 如配置spring的DispatcherServlet
package org.homeway.testPrj.springmvc;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
public class WebInit implements WebApplicationInitializer {
Logger logger = LoggerFactory.getLogger(WebInit.class);
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
/*
* ContextLoaderListener is added to ServletContext –
* the purpose of this is to 'glue' WebApplicationContext
* to the lifecycle of ServletContext
*/
WebApplicationContext context = getContext();
servletContext.addListener(new ContextLoaderListener(context));
/*
* DispatcherServlet is created and initialized with
* WebApplicationContext we have created, and it's
* mapped to "/*" URLs and set to eagerly load on
* application startup.
*/
ServletRegistration.Dynamic dispatcher =
servletContext.addServlet("DispatcherServlet",
new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
private AnnotationConfigWebApplicationContext getContext() {
/*
* AnnotationConfigWebApplicationContext is created.
* It's WebApplicationContext implementation that
* looks for Spring configuration in classes annotated
* with @Configuration annotation.
* setConfigLocation() method gets hint in which
* package(s) to look for them.
*/
AnnotationConfigWebApplicationContext context =
new AnnotationConfigWebApplicationContext();
context.scan("org.homeway.testPrj.springmvc.config");
return context;
}
}
5. 编写类, 配置spring
这个类包含了:
(1) bean的实例化与注入
(2) ComponentScan的配置
如何配置与读取porperties文件, 参考代码.
package org.homeway.testPrj.springmvc.config;
import javax.annotation.Resource;
import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.servlet.view.UrlBasedViewResolver;
/*
* The main AppConfig configuration class doesn't do anything
* but hits Spring on where to look for its components through
* @ComponentScan annotation.
*/
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "org.homeway.testPrj")
@PropertySource("classpath:application.properties")
public class AppConfig {
@Resource
Environment env;
@Bean(name="viewResolver")
public UrlBasedViewResolver setupViewResolver() {
UrlBasedViewResolver viewResolver = new UrlBasedViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
viewResolver.setViewClass(JstlView.class);
viewResolver.setOrder(0);
return viewResolver;
}
@Bean(name="dataSource")
public BasicDataSource setupDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(env.getProperty("db.driver"));
dataSource.setUrl(env.getProperty("db.url"));
dataSource.setUsername(env.getProperty("db.user"));
dataSource.setPassword(env.getProperty("db.pwd"));
return dataSource;
}
@Bean(name="jdbcTemplate")
public JdbcTemplate setupJdbcTemplate(
@Qualifier("dataSource")BasicDataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name="dataSourceTransactionManager")
public DataSourceTransactionManager setDataSourceTransactionManager(BasicDataSource dataSource){
DataSourceTransactionManager tm = new DataSourceTransactionManager();
tm.setDataSource(dataSource);
return tm;
}
}
6. 编写类, 继承WebMvcConfigurerAdapter类.
这个类提供了许多void方法,复写这些方法以实现具体的配置
package org.homeway.testPrj.springmvc.config;
import java.util.List;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/*
* WebMvcConfig class enables Spring MVC with @EnableWebMvc annotation.
* It extends WebMvcConfigurerAdapter, which provides empty methods
* that can be overridden to customize default configuration of Spring
* MVC. We will stick to default configuration at this time, but it’s
* advised for you to see what the possibilities are.
*/
@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//<mvc:resources mapping="/resources/**" location="/public-resources/"/>
registry.addResourceHandler("resources/**").addResourceLocations("/public-resources");
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
super.addInterceptors(registry);
}
@Override
public void addArgumentResolvers(
List<HandlerMethodArgumentResolver> argumentResolvers) {
// TODO Auto-generated method stub
super.addArgumentResolvers(argumentResolvers);
}
@Override
public void addFormatters(FormatterRegistry registry) {
// TODO Auto-generated method stub
super.addFormatters(registry);
}
@Override
public void addReturnValueHandlers(
List<HandlerMethodReturnValueHandler> returnValueHandlers) {
// TODO Auto-generated method stub
super.addReturnValueHandlers(returnValueHandlers);
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// TODO Auto-generated method stub
super.addViewControllers(registry);
}
@Override
public void configureMessageConverters(
List<HttpMessageConverter<?>> converters) {
// TODO Auto-generated method stub
super.configureMessageConverters(converters);
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
// TODO Auto-generated method stub
super.extendMessageConverters(converters);
}
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
// TODO Auto-generated method stub
super.configureAsyncSupport(configurer);
}
@Override
public void configureContentNegotiation(
ContentNegotiationConfigurer configurer) {
// TODO Auto-generated method stub
super.configureContentNegotiation(configurer);
}
@Override
public void configureDefaultServletHandling(
DefaultServletHandlerConfigurer configurer) {
// TODO Auto-generated method stub
super.configureDefaultServletHandling(configurer);
}
@Override
public void configureHandlerExceptionResolvers(
List<HandlerExceptionResolver> exceptionResolvers) {
// TODO Auto-generated method stub
super.configureHandlerExceptionResolvers(exceptionResolvers);
}
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
// TODO Auto-generated method stub
super.configurePathMatch(configurer);
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// TODO Auto-generated method stub
super.configureViewResolvers(registry);
}
}
7. 编写测试代码
(略)
8. 附件