使用@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. 附件
6080

被折叠的 条评论
为什么被折叠?



