纯注解整合SSM框架

x33g5p2x  于2022-02-28 转载在 其他  
字(9.5k)|赞(0)|评价(0)|浏览(333)

说在前面的话

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版本 -->
    <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=

看看现在情况呢:

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

/**
 * @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"};
    }
}

看看这个类的位置:

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

浏览器访问:

源码下载地址:https://gitee.com/win-dk/SSM-annotation-demo

相关文章