一开始自己学习ssm框架的时候,花了很多时间看网上的博客,还有自己购买的书籍,但是很少有说明白的,多数原因是因为版本不同导致的一些不兼容问题,使得框架整合失败。故今天自己整理一下SSM整合的思路。虽然这样的文章有很多人写了,但自己还是写一下,算是记录自己的学习路程吧,同时也是我在简书上的第一篇文章。
ssm的整合,其实本质上就是spring与mybatis的整合,因为springmvc就是spring的一部分,一个模块而已,但mybatis并不是,所以关键在于如何集成mybatis到spring。mybatis的初始化工厂是这个类:
org.apache.ibatis.session.SqlSessionFactory
而mybatis-spring项目中,会使用这个类来替代它:
org.mybatis.spring.SqlSessionFactoryBean
通过配置这个类的实例bean就可以将mybatis成功集成到spring当中;由于spring控制反转的思想,我们在spring项目开发过程中都是使用依赖注入来获取dao实例,所以要把dao层接口全部转换为spring的bean,通过这个注解配置就可以实现mapper的自动扫描:
org.mybatis.spring.annotation.MapperScan
也可以通过配置这个bean来实现这个注解的功能:
org.mybatis.spring.mapper.MapperScannerConfigurer
如此便实现了spring与mybatis的集成。
我使用的版本为spring5 + mybatis3。spring的版本会不断变化,一些老旧的语法也会随着版本的更迭不断被新的方式替代,所以我们要掌握的是这个框架的配置思想,而不是照着代码按键盘组合键。
其实现在的新项目大家都开始用spring-boot了,约定大于配置的开发原则使得程序员构建项目非常方便,但其实它的本质就是自己内部约定一套默认配置而已。我们在学习的过程中还是最好学习一下每个框架单独的配置。而且一定要学会看代码的文档注释。idea用ctrl + q而eclipse直接鼠标悬停即可出现方法的文档注释。虽然是英文的不过还是很好懂的,配合上翻译app效果更佳哟。O(∩_∩)O
最后也给出我的ssm集成方式的代码:
- dbinfo.properties
# 全部采用注解配置,唯一使用到的配置文件就一个dbinfo.properties
datasource.driver = com.mysql.jdbc.Driver
datasource.url = jdbc:mysql://127.0.0.1:3306/chat?useSSL=false
datasource.user = root
datasource.password = root
- ApplicationInitializer.java
package cn.edu.cqut.chat;
import cn.edu.cqut.chat.config.SpringConfig;
import cn.edu.cqut.chat.config.SpringMvcConfig;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
/**
* 通过继承这个抽象类并实现三个抽象方法就可以取代web.xml配置springmvc的方式
*/
public class ApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { SpringConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { SpringMvcConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
- SpringConfig.java
package cn.edu.cqut.chat.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.Import;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
//
@Configuration
@Import(OrmConfig.class)
@ComponentScan(basePackages = "cn.edu.cqut.chat", excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = EnableWebMvc.class))
public class SpringConfig {
}
- SpringMvcConfig.java
package cn.edu.cqut.chat.config;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.thymeleaf.spring5.ISpringTemplateEngine;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ITemplateResolver;
import java.nio.charset.Charset;
import java.util.List;
@Configuration
@EnableWebMvc
@ComponentScan("cn.edu.cqut.chat.restful")
public class SpringMvcConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
converter.setDefaultCharset(Charset.defaultCharset());
converters.add(converter);
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH")
.maxAge(3600);
}
@Bean
public ViewResolver thymeleafViewResolver(ISpringTemplateEngine engine) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(engine);
resolver.setCharacterEncoding("UTF-8");
return resolver;
}
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
templateEngine.setEnableSpringELCompiler(true);
return templateEngine;
}
@Bean
public SpringResourceTemplateResolver templateResolver( ) {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setPrefix("/WEB-INF/views/");
templateResolver.setSuffix(".html");
templateResolver.setCharacterEncoding("UTF-8");
templateResolver.setOrder(1);
templateResolver.setTemplateMode(TemplateMode.HTML);
templateResolver.setCacheable(false);
return templateResolver;
}
}
- OrmConfig.java
package cn.edu.cqut.chat.config;
import com.alibaba.druid.pool.DruidDataSource;
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.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Repository;
import javax.sql.DataSource;
@Configuration
@PropertySource(value = "classpath:dbinfo.properties", encoding = "UTF-8")
@MapperScan(basePackages = "cn.edu.cqut.chat.dao", annotationClass = Repository.class)
public class OrmConfig {
@Value("${datasource.driver}")
String driver;
@Value("${datasource.url}")
String url;
@Value("${datasource.user}")
String user;
@Value("${datasource.password}")
String password;
@Bean
public DataSource dataSource() {
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(user);
ds.setPassword(password);
return ds;
}
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setTypeAliasesPackage("cn.edu.cqut.chat.entity");
factoryBean.setDataSource(dataSource);
return factoryBean;
}
}
为了实现完全的注解配置,我把sql写到了dao的注解上,可以参考一下mybatis的provider注解语法。
以上配置只是基本配置,集成了mybatis + spring + thymeleaf,实际项目开发中需要用到的技术会更多,用spring-boot的话会减少很多工作,但一定要懂原理。
网友评论