说在前面的话
SSM:Spring+SpringMVC+MyBatis。
? SSM框架组合已经是现在最热门的后端框架组合了。本篇我要说的就是使用纯注解整合这三大框架。当然了SpringMVC本身就是spring的一部分。也谈不上整合。所以SSM有时我叫SM。(其实不用在意叫法,好听就行)。
? 当然了我们都知道现在有SpringBoot可以轻松完成这些框架整合配置。所以这篇文章是给学习中的学子们准备的,已经熟练使用SpringBoot的大佬请绕行。
tips:后面有源码下载地址。
嗨!直接开打吧
你需要准备的武器
- 学习过Spring,SpringMVC和MyBatis框架
- 最好使用xml的方式整合过SSM框架
- 当然也必须知道Maven是个啥,肯定也必须会使用Mavne
- 要有一份对技术不断追求的心
- 要热爱我的民族,热爱我们的祖国_
不说了,开整吧
整合思路
? 首先我们要有明确的整合思路,所谓SSM整合其实就是将MyBatis整合到Spring中。这时就要考虑MyBatis中都有什么要整的呢??
? 经过考虑,整体思路大概如下:
- MyBatis 需要的数据源要交给spring,也就是在spring中注册数据源。
- MyBatis的Mapper要交给spring使用动态代理生成。嗯…SqlSessionFactory的配置…
- spring的RootContent和WebContent要合并…嗯…
OK!动手
[1]创建项目
打开你的idea,配置好Maven,创建新的项目,创建好需要的目录和包。像下面的截图一样。
[2]配置依赖
打开POM文件,添加下面的配置
版本锁定的部分,我这里使用的spring5.2.6 你是啥打算呢?
<properties>
<spring.version>5.2.6.RELEASE</spring.version>
<project.build.sourceEncoding>
UTF-8
</project.build.sourceEncoding>
</properties>
添加依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</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-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
再来个插件吧:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.*</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.*</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
[3]两个配置类
添加一个RootConfig配置,这个配置类主要用来创建根容器。
这个类就相当使用XML配置文件整合时的spring的配置文件applicationContext.xml
package com.qidian.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.*;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
@Configuration
@ComponentScans({
@ComponentScan("com.qidian.service")
})
@MapperScan("com.qidian.mapper")
@PropertySource("classpath:db.properties")
public class RootConfig {
@Value("${jdbc.driver}")
private String driverClass;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setPassword(password);
dataSource.setUsername(username);
dataSource.setUrl(url);
return dataSource;
}
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(){
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource());
bean.setTypeAliasesPackage("com.qidian.bank.pojo");
return bean;
}
@Bean
public TransactionManager transactionManager(){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource());
return transactionManager;
}
}
添加配置类WebConfig 这个类可以继承WebMvcConfigurer,可以通过父类的API添加视图解析器,静态资源映射,拦截器等等。
这个配置主要用来配置web相关的内容,扫描controller等。
package com.qidian.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@ComponentScan("com.qidian.controller")
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**/*.html").addResourceLocations("/");
registry.addResourceHandler("/**/*.css").addResourceLocations("/");
registry.addResourceHandler("/**/*.js").addResourceLocations("/");
registry.addResourceHandler("/**/*.png").addResourceLocations("/");
registry.addResourceHandler("/**/*.jpg").addResourceLocations("/");
registry.addResourceHandler("/lib/**/*.*").addResourceLocations("/lib/");
registry.addResourceHandler("/**/*.json").addResourceLocations("/");
}
}
当然不要忘记在resources中添加db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/bank?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=
看看现在情况呢:
[4]RootWebApplicationContext和DispatcherServletWebApplicationContext
? 以下简称RootWebApplicationContext为:RootContext,DispatcherServletWebApplicationContext为:DispatcherServletContext。
? WebApplicationContext扩展了ApplicationContext,代表的Spring Web的应用上下文,RootContext由ContextLoaderListener创建,其中存放了各种注册到Spring的非Web组件的bean(比如service)。RootContext初始化完成后将其存储到ServletContext中,便于获取。在源码中你可以看到这样的代码:servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
接着是DispatcherServletContext的初始化,它会以RootContext为父上下文(在DispatcherServletContext中可以引用RootContext中的非web组件,而反过来不行。),然后初始化Web相关组件,比如控制器,视图解析器等。DispatcherServletContext初始化完毕后将自身存入ServletContext.
WebApplicationContext和DispatcherServlet上下文初始化方式
在主包中添加一个初始化Web环境的类:
package com.qidian;
import com.qidian.config.RootConfig;
import com.qidian.config.WebConfig;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class BankContextInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/*","*.action"};
}
}
看看这个类的位置:
[5]添加对应的mapper,service,controller进行测试了
浏览器访问:
源码下载地址:https://gitee.com/win-dk/SSM-annotation-demo
|