前言
Spring有两个容器,与Web有关的bean我们一般放在SpringMVC容器中
而与服务层和Mapper有关的bean我们放在SpringRoot容器中
关系
正如上图,他们存放的东西大致能分开,而SpringRoot是SpringMVC的父容器,其实很多情况下SpringRoot容器很多程序员都不用,其实也对,该容器的最大作用是Spring和其他框架搭配使用比如Struse啊这种,让Spring的IOC容器统一管理其他实体类的这么一种存在
代码
我贴一下带着日志,模板引擎乱七八糟一整套的双容器和web.xml的代码吧,方便以后大家和我搭载工程
👇SpringRoot.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<context:component-scan base-package="com.etoak">
<!-- 不排除@Service、@Repository -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Repository" />
<!-- 排除@Controller、@RestController @ControllerAdvice -->
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
<context:exclude-filter type="annotation"
expression="org.springframework.web.bind.annotation.RestController" />
<context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
<!-- 导入db.preperties -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</bean>
<!-- SqlSessionFactoryBean -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="com.etoak.bean" />
<!-- mappers -->
<property name="mapperLocations" value="classpath:mapper/*.xml" />
<property name="plugins">
<list>
<bean class="com.github.pagehelper.PageInterceptor"></bean>
</list>
</property>
</bean>
<!-- MapperScannerConfigurer: 扫描指定包下的Mapper接口, 为接口创建代理对象,并代理对象注册到Spring容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.etoak.mapper" />
</bean>
<!--事务管理-->
<tx:annotation-driven/>
</beans>
SpringRoot java版-rootConfig
@Configuration
@ComponentScan(basePackages = {"com.etoak"},
excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class, RestController.class, ControllerAdvice.class,EnableWebMvc.class}),
},
includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class, Repository.class})})
@PropertySource(value = "classpath:db.properties")//该注解只能引入properties文件
@MapperScan(basePackages = "com.etoak.mapper")//MapperScannerConfigurer
@EnableTransactionManagement //<tx:annotation-driven>
public class RootConfig {
/*读取配置文件*/
@Value("${db.driver}")
private String driverClassName;
@Value("${db.url}")
private String url;
@Value("${db.username}")
private String username;
@Value("${db.password}")
private String password;
/*
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</bean>
*/
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setInitialSize(10);//初始化10个连接
dataSource.setMaxActive(30);
return dataSource;
}
/*
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="com.etoak.bean" />
<!-- mappers -->
<property name="mapperLocations" value="classpath:mapper/*.xml" />
<property name="plugins">
<list>
<bean class="com.github.pagehelper.PageInterceptor"></bean>
</list>
</property>
</bean>
*/
@Bean
public SqlSessionFactoryBean sessionFactoryBean(){
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(this.dataSource());
sessionFactoryBean.setTypeAliasesPackage("com.etoak.bean");
PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
try {
sessionFactoryBean.setMapperLocations(patternResolver.getResources("classpath:mapper/*.xml"));
} catch (Exception e) {
e.printStackTrace();
}
PageInterceptor interceptor = new PageInterceptor();
Properties properties = new Properties();
properties.setProperty("reasonable","true");
interceptor.setProperties(properties);
sessionFactoryBean.setPlugins(new Interceptor[]{interceptor});
return sessionFactoryBean;
}
/*事务管理器 注解事务*/
@Bean
public DataSourceTransactionManager transactionManager(){
return new DataSourceTransactionManager(dataSource());
}
}
👇SpringMVC xml版
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<context:component-scan base-package="com.etoak">
<!-- 扫描@Controller、@RestController @ControllerAdvice-->
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
<context:include-filter type="annotation"
expression="org.springframework.web.bind.annotation.RestController" />
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
<!-- 排除@Service、@Repository -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Repository" />
</context:component-scan>
<!--启动器 @ResponseBody @RequestBody @PathValiable @RequestParam @ExceptionHandle...注解主要靠它-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--静态资源加载-->
<mvc:default-servlet-handler />
<mvc:resources location="file:d:/upload/et2009/"
mapping="/pic/**" />
<!-- InternalResourceViewResolver 视图解析器和模板引擎冲突 选择一个使用 -->
<!-- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/jsps/"
/> <property name="suffix" value=".jsp" /> </bean> -->
<!-- SpringResourceTemplateResolver 根据Controller返回的字符串去找到 文件->对象-->
<bean id="templateResolver" class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- prefix:页面放置位置 -->
<property name="prefix" value="calsspath:/templates/" />
<!-- suffix:页面后缀名 -->
<property name="suffix" value=".html" />
<!-- 模板类型 -->
<property name="templateMode" value="HTML" />
<!-- 页面编码 -->
<property name="characterEncoding" value="UTF-8" />
<!-- cacheable:是否缓存页面,在开发换下不缓存 -->
<property name="cacheable" value="false" />
</bean>
<!-- SpringTemplateEngine 我们可以使用thymeleaf模版来生产html文件 处理渲染结果-->
<bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver" ref="templateResolver" />
</bean>
<!-- ThymeleafViewResolver 根据逻辑view名字,找到找到thymeleaf模板view(对象)-->
<bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="templateEngine" ref="templateEngine" />
<!-- 页面内容编码 -->
<property name="characterEncoding" value="UTF-8" />
</bean>
<!-- 文件上传解析器CommonsMultipartResolver -->
<!-- id必须是multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 最大上传大小为1MB -->
<property name="maxUploadSize" value="1048576" />
</bean>
<!--页面跳转不需要携带数据的情况下可以这么写 删除原本的jsp文件 根路径下会跳转到resources/templetes/index.html-->
<mvc:view-controller path="/" view-name="index"/>
</beans>
SpringMVC容器 java版-MvcConfig👇我注释里是两者的对照
@Configuration
@ComponentScan(basePackages = {"com.etoak"},includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class, RestController.class, ControllerAdvice.class,EnableWebMvc.class}),
},excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class, Repository.class})})
@EnableWebMvc//<mvc:annotation-driven />
public class MvcConfig implements WebMvcConfigurer {
/*<mvc:default-servlet-handler />*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
/*
* <bean id="templateResolver" class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- prefix:页面放置位置 -->
<property name="prefix" value="calsspath:/templates/" />
<!-- suffix:页面后缀名 -->
<property name="suffix" value=".html" />
<!-- 模板类型 -->
<property name="templateMode" value="HTML" />
<!-- 页面编码 -->
<property name="characterEncoding" value="UTF-8" />
<!-- cacheable:是否缓存页面,在开发换下不缓存 -->
<property name="cacheable" value="false" />
</bean>
* */
@Bean
public SpringResourceTemplateResolver templateResolver(){
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setPrefix("classpath:/templates/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
templateResolver.setCharacterEncoding("UTF-8");
templateResolver.setCacheable(false);
return templateResolver;
}
/*
<!-- SpringTemplateEngine 我们可以使用thymeleaf模版来生产html文件 处理渲染结果-->
<bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver" ref="templateResolver" />
</bean>
*/
@Bean
public SpringTemplateEngine templateEngine(@Qualifier("templateResolver") SpringResourceTemplateResolver templateResolver){
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
return templateEngine;
}
/*
* <bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="templateEngine" ref="templateEngine" />
<!-- 页面内容编码 -->
<property name="characterEncoding" value="UTF-8" />
</bean>
* */
@Bean
public ThymeleafViewResolver viewResolver(@Qualifier("templateEngine") SpringTemplateEngine templateEngine){
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine);
viewResolver.setCharacterEncoding("UTF-8");
return viewResolver;
}
}
👇web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<!-- Spring通过ContextLoaderListener加载Spring父容器,
默认加载/WEB-INF/applicationContext.xml,
可以使用context-param指定父容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-root.xml</param-value>
</context-param>
<!-- POST请求编码过滤器 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- HiddenHttpMethodFilter:用于将表单的post请求转换成delete或put请求 -->
<filter>
<filter-name>rest</filter-name>
<filter-class>
org.springframework.web.filter.HiddenHttpMethodFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>rest</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--监听器-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- DispatcherServlet -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
java版web.xml
//相当于web.xml
public class MvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/*
* SpringRoot
* */
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
/*
* SpringMVC
* */
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{MvcConfig.class};
}
/*
* DispatcherServlet拦截路径
* */
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
/*
* 配置过滤器,解决前端请求中的中文乱码
* */
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("UTF-8");
return new Filter[]{encodingFilter};
}
}
一个基本的SpringMVC需要的依赖 帮助快速启动工程
Pom.xml👇
<dependencies>
<!-- servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!-- commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.14</version>
</dependency>
<!--fastJson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.70</version>
</dependency>
<!-- jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
<!-- 整合Thymeleaf 自选-->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<!--
========================Spring整合MyBatis=========================================
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
<!-- logback-classic 自选-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- commons-fileupload 自选-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!--
==============================aop=====================================
-->
<!-- spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!-- aspectjrt -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.2</version>
</dependency>
<!-- aopalliance -->
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<!-- cglib 动态代理-->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
总结
今天主要就向阐明上面那一张图,然后方便大家快速启动工程
java版目录结构
xml目录结构