likes
comments
collection
share

纯注解配置SSM框架整合

作者站长头像
站长
· 阅读数 89

说在前面的话

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,创建新的项目,创建好需要的目录和包。像下面的截图一样。

纯注解配置SSM框架整合

[2]配置依赖

打开POM文件,添加下面的配置

版本锁定的部分,我这里使用的spring5.2.6 你是啥打算呢?

 <!-- 版本锁定 -->
 <properties>
     <!-- spring版本 -->
     <spring.version>5.2.6.RELEASE</spring.version>
     <project.build.sourceEncoding>
         UTF-8
     </project.build.sourceEncoding>
 </properties>

添加依赖:

<dependencies>
    <!-- spring框架的jar -->
    <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>
    <!-- mysql驱动 5.1.47 -->
    <!-- 如果你的数据库是MySQL8 请更换对应的版本 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>

    <!-- MyBatisjar -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.1</version>
    </dependency>
    <!-- MyBatis和spring整合的第三方jar文件 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.2</version>
    </dependency>
    <!-- druid连接池 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.10</version>
    </dependency>
    <!-- servlet-api -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <!-- 这里的scope必须是 provided -->
        <scope>provided</scope>
    </dependency>
    <!-- 处理JSON的jar文件 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.8</version>
    </dependency>
</dependencies>

再来个插件吧:

  <build>
         <!-- 配置将main/java下的资源文件也打包 -->
         <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>
 ​
             <!-- tomcat插件控制 -->
             <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>
             <!-- maven插件控制 -->
             <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;
 ​
 /**
  * @author  戴着假发的程序员
  * 相当于spring的配置文件
  */
 @Configuration
 //  配置service的扫描包
 @ComponentScans({
         @ComponentScan("com.qidian.service") 
 })
 // 这个配置用来扫描加载所有的mapper接口和xml文件。 
 // 当然也可以使用@Bean的方式注入一个扫描器MapperScannerConfigurer来扫描
 @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(){
         // druid数据源
         DruidDataSource dataSource = new DruidDataSource();
         dataSource.setDriverClassName(driverClass);
         dataSource.setPassword(password);
         dataSource.setUsername(username);
         dataSource.setUrl(url);
         return  dataSource;
     }
     // 注入SqlSessionFactoryBean
     @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;
 ​
 /**
  * @author  戴着假发的程序员
  */
 @Configuration
 // 扫描所有的controller
 @ComponentScan("com.qidian.controller")
 // 添加SpringMVC相关配置
 @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=

看看现在情况呢:

纯注解配置SSM框架整合

[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.

纯注解配置SSM框架整合 WebApplicationContext和DispatcherServlet上下文初始化方式

在主包中添加一个初始化Web环境的类:

 package com.qidian;
 ​
 import com.qidian.config.RootConfig;
 import com.qidian.config.WebConfig;
 import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
 ​
 /**
  * @author 戴着假发的程序员
  */
 public class BankContextInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
     @Override
     protected Class<?>[] getRootConfigClasses() {
         // 根容器配置类
         return new Class[]{RootConfig.class};
     }
 ​
     @Override
     protected Class<?>[] getServletConfigClasses() {
         // web容器配置类
         return new Class[]{WebConfig.class};
     }
 ​
     @Override
     protected String[] getServletMappings() {
         // 拦截的路径
         return new String[]{"/*","*.action"};
     }
 }

看看这个类的位置:

纯注解配置SSM框架整合

[5]添加对应的mapper,service,controller进行测试了

纯注解配置SSM框架整合 浏览器访问:

纯注解配置SSM框架整合

源码下载地址:gitee.com/win-dk/SSM-…

转载自:https://juejin.cn/post/7068889782637559816
评论
请登录