全注解开发、删除web.xml、删除xml方式ioc配置
- 【配置DispatcherServlet】
方式一:
实现WebApplicationInitializer接口,重写onStartup方法
方式二:
继承AbstractAnnotationConfigDispatcherServletInitializer
区别:方式二需要配置Root容器
-【如何配置Filter:以上面的方式二为例】
实现getServletFilters()方法
-【配置servlet WebApplicationContext(springmvc的容器[xml配置文件])】
说明如下:
实现WebMvcConfigurer接口
@Configuration
相当于文件的根元素
@ComponentScan
相当于<context:component-scan />
@EnableWebMvc
相当于<mvc:annotation-driven />
@Bean
相当于在xml中配置标签,方法名默认是bean的id
@Qualifier
表示引用容器那个id的bean
@Qualifier(“et1812DataSource”)
configureDefaultServletHandling方法:
相当于<mvc:default-servlet-handler />
addResourceHandlers方法:
相当于<mvc:resources mapping="" location="" />
addInterceptors方法:
用于配置拦截器
package com.etoak.config;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.RestController;
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.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;
import com.etoak.interceptor.EtoakInterceptor;
/**
* 1.这个相当于之前讲的spring-mvc.xml<BR>
* 2.Configuration注解:相当于文件的根元素<beans></beans> <BR>
* 3.ComponentScan注解:相当于<context:component-scan /> <BR>
* 4.EnableWebMvc注解:相当于<mvc:annotation-driven /> <BR>
* 5.configureDefaultServletHandling方法:相当于<mvc:default-servlet-handler /> <BR>
* 6.addResourceHandlers方法:相当于<mvc:resources mapping="" location="" /> <BR>
* 7.addInterceptors方法:用于配置拦截器 <BR>
* 8..Bean注解:相当于在xml中配置<bean>标签,方法名默认是bean的id <BR>
*
*
* @author 姓名 工号
* @version [版本号, 2019年4月10日]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.etoak"}, //
excludeFilters = {@Filter(type = FilterType.ANNOTATION, //
value = {Service.class})}, //
includeFilters = {@Filter(type = FilterType.ANNOTATION, //
value = {EnableWebMvc.class, Controller.class, //
RestController.class, ControllerAdvice.class//
})})
public class MvcConfig implements WebMvcConfigurer {
/**
* 静态文件交给Servlet处理 <BR>
* <mvc:default-servlet-handler />
*
* @param configurer
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
/**
* 配置静态资源等<BR>
* <mvc:resources mapping="/static/**" location="/static/" />
*
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")//
.addResourceLocations("/static/");
registry.addResourceHandler("/pics/**")//
.addResourceLocations("file:d:/upload/");
}
/**
* 配置模板解析器
*
* @return
* @see [类、类#方法、类#成员]
*/
@Bean
public SpringResourceTemplateResolver templateResolver() {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setPrefix("/templates/");
resolver.setSuffix(".html");
resolver.setTemplateMode(TemplateMode.HTML);
resolver.setCharacterEncoding("utf-8");
resolver.setCacheable(false);
return resolver;
}
/**
* 配置模板引擎
*
* @return
* @see [类、类#方法、类#成员]
*/
@Bean("templateEngine")
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(this.templateResolver());
return engine;
}
/**
* 配置Thymeleaf视图解析器
*
* @param templateEngine
* @return
* @see [类、类#方法、类#成员]
*/
@Bean
public ThymeleafViewResolver viewResolver(//
@Qualifier("templateEngine") //
SpringTemplateEngine templateEngine) {
ThymeleafViewResolver view = new ThymeleafViewResolver();
view.setTemplateEngine(templateEngine);
view.setCharacterEncoding("UTF-8");
return view;
}
/**
* 配置拦截器
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new EtoakInterceptor())//
.addPathPatterns("/**")//
.excludePathPatterns("/hello/hello2");
}
}
**
-【配置Root WebApplicationContext(父容器)】
**
这里主要配置了数据源
@PropertySource
用于读取properties文件
@Value
获取properties文件中值
@MapperScan
相当于MapperScannerConfigurer
package com.etoak.config;
import java.io.IOException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.ibatis.plugin.Interceptor;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import com.alibaba.druid.pool.DruidDataSource;
import com.github.pagehelper.PageInterceptor;
import lombok.extern.slf4j.Slf4j;
/**
* 父容器
*
* @author 姓名 工号
* @version [版本号, 2019年4月10日]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
@Configuration
@ComponentScan(basePackages = {"com.etoak"}, //
includeFilters = {@Filter(type = FilterType.ANNOTATION, //
value = {Service.class})}, //
excludeFilters = {@Filter(type = FilterType.ANNOTATION, //
value = {EnableWebMvc.class, Controller.class, //
RestController.class, ControllerAdvice.class})})
@PropertySource("classpath:mybatis-jdbc.properties")
@MapperScan(basePackages = {"com.etoak.mapper"}, //
sqlSessionFactoryRef = "sqlSessionFactoryBean")
@Slf4j
public class RootConfig {
@Value("${druid.driverClassName}")
private String driverClassName;
@Value("${druid.url}")
private String url;
@Value("${druid.username}")
private String username;
@Value("${druid.password}")
private String password;
@Value("${mybatis.mapperLocations}")
private String mapperLocations;
@Value("${mybatis.typeAliasesPackage}")
private String typeAliasesPackage;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setInitialSize(5);
return dataSource;
}
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean() {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
// 1.设置数据源
factory.setDataSource(this.dataSource());
// 2.设置mapperLocations
PathMatchingResourcePatternResolver resourceResolver //
= new PathMatchingResourcePatternResolver();
try {
Resource[] resources = resourceResolver.getResources(mapperLocations);
factory.setMapperLocations(resources);
} catch (IOException e) {
log.error("读取mapper配置文件异常....", e);
}
// 3.设置typeAliasesPackage
factory.setTypeAliasesPackage(typeAliasesPackage);
// 4.设置分页插件
PageInterceptor page = new PageInterceptor();
Properties props = new Properties();
props.setProperty("reasonable", "true");
page.setProperties(props);
factory.setPlugins(new Interceptor[] {page});
return factory;
}
}
过滤器
package com.etoak.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class EtoakFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("EtoakFilter init");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
log.info("EtoakFilter doFilter");
HttpServletRequest req = (HttpServletRequest)request;
log.info(req.getRequestURI());
chain.doFilter(req, response);
}
@Override
public void destroy() {
log.info("EtoakFilter destroy");
}
}
拦截器
package com.etoak.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class EtoakInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("==========preHandle=========");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("==========postHandle=========");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("==========afterCompletion=========");
}
}