SSM框架,SSM框架的整合

news2024/10/25 21:16:12

SSM整合的介绍

微观:将Spring SpringMVC Mybatis框架应用到项目中

  • SpringMVC框架负责控制层
  • Spring 框架负责整体和业务层的声明式事务管理
  • MyBatis框架负责数据库访问层

宏观:Spring接管一切(将框架核心组件交给Spring进行IoC管理),代码更加简洁。

  • SpringMVC管理表述层、SpringMVC相关组件
  • Spring管理业务层、持久层、以及数据库相关(DataSource,MyBatis)的组件
  • 使用IoC的方式管理一切所需组件

实施:通过编写配置文件,实现SpringIoC容器接管一切组件。

关于整合时的ioc容器

两个ioc容器

常见的操作是创建两个ioc容器,web容器和root容器,让组件分类管理

两个ioc容器的优点:

  1. 分离关注点:通过初始化两个容器,可以将各个层次的关注点进行分离。这种分离使得各个层次的组件能够更好地聚焦于各自的责任和功能。
  2. 解耦合:各个层次组件分离装配不同的IoC容器,这样可以进行解耦。这种解耦合使得各个模块可以独立操作和测试,提高了代码的可维护性和可测试性。
  3. 灵活配置:通过使用两个容器,可以为每个容器提供各自的配置,以满足不同层次和组件的特定需求。每个配置文件也更加清晰和灵活。

它们各自负责不同的层次和功能,并通过合适的集成方式协同工作

关于两个ioc容器盛放的组件

容器名盛放组件
web容器web相关组件(controller,springmvc核心组件)
root容器业务和持久层相关组件(service,aop,tx,dataSource,mybatis,mapper等)

容器之间对应关系

  • 两个无关联的ioc容器之间的组件无法注入
  • 子ioc容器可以单向注入父ioc容器的组件

web容器和root容器之间的关系:web容器是root容器的子容器

关于配置类

建议有三个配置类:

配置名对应内容对应容器
WebJavaConfigcontroller,springmvc相关web容器
ServiceJavaConfigservice,aop,tx相关root容器
MapperJavaConfigmapper,datasource,mybatis相关root容器

在Init类中。重写的getRootConfigClasses中,指定root容器对应的配置类。在重写的getServletConfigClasses方法中指定web容器对应的配置类

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

  //指定root容器对应的配置类
  //root容器的配置类
  @Override
  protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[] { ServiceJavaConfig.class,MapperJavaConfig.class };
  }
  
  //指定web容器对应的配置类 webioc容器的配置类
  @Override
  protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[] { WebJavaConfig.class };
  }
  
  //指定dispatcherServlet处理路径,通常为 / 
  @Override
  protected String[] getServletMappings() {
    return new String[] { "/" };
  }
}

整合配置

依赖整合和添加

需要的依赖清单:

需要依赖清单分析:

spring ioc/di: 
    spring-context / 6.0.6 
    jakarta.annotation-api / 2.1.1 
    jsr250 
aop: 
    spring-aspects / 6.0.6 
tx: 
    spring-tx / 6.0.6 
    spring-jdbc / 6.0.6
springmvc:
       spring-webmvc 6.0.6
       jakarta.jakartaee-web-api 9.1.0
       jackson-databind 2.15.0
       hibernate-validator / hibernate-validator-annotation-processor 8.0.0.Final
mybatis:
        mybatis  / 3.5.11
        mysql    / 8.0.25
        pagehelper / 5.1.11
整合需要:
     加载spring容器 spring-web / 6.0.6
     整合mybatis   mybatis-spring x x
     数据库连接池    druid / x
     lombok        lombok / 1.18.26
     logback       logback/ 1.2.3

日志输出配置:(在resource目录下)

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!--指定日志输出的位置,ConsoleAppender表示输出到控制台-->
<appender name="STDOUT"
              class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
<!--日志输出的格式-->
            <!--按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体内容、换行-->
<pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

<!--设置全局日志级别。日志级别按顺序分别是:TRACE、DEBUG、INFO、WARN、ERROR -->
    <!--指定任何一个日志级别都只打印当前级别和后面级别的日志。-->
<root level="DEBUG">
<!--指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender -->
<appender-ref ref="STDOUT" />
    </root>

<!--根据特殊需求指定局部日志级别,可也是包名或全类名。-->
<logger name="com.atguigu.mybatis" level="DEBUG" />

</configuration>

springmvc层的配置

配置类WebMvcJavaConfig:

/**
 *要加入其中的组件
* 1.controller
 * 2.全局异常处理器
* 3.handlerMapping handlerAdapter
 * 4.静态资源处理
* 5.jsp视图解析器前后缀
* 6.json转化器
* 7.拦截器
*/
@Configuration
@ComponentScan({"com.ergou.controller","com.ergou.error"})
@EnableWebMvc
public class WebMvcJavaConfig implements WebMvcConfigurer {
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views","jsp");
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
//        registry.addInterceptor(new xxx()).addPathPatterns();
}

}

service和aop以及tx的配置

ServiceJavaConfig配置类:

/**
 * 业务层配置类:service,aop,tx
 * 1.service
 * 2.开启aop注解的支持
 * 3.tx声明式事务管理:对应事务管理器的实现,开启事务注解支持
 * 4.声明包扫描注解
 * 5.配置事务管理器
 */
@Configuration
@ComponentScan("com.ergou.service")
@EnableAspectJAutoProxy
@EnableTransactionManagement
public class ServiceJavaConfig {
    @Bean
    public TransactionManager transactionManager(DataSource dataSource){
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource);
        return dataSourceTransactionManager;
    }
}

Mybatis整合配置方式

mybatis整合思路:

  • 需要将SqlSessionFactory和Mapper实例加入到IoC容器
    • sqlSessionFactory的ioc配置交给SqlSessionFactoryBean来创建
    • Mapper的配置交给MapperScannerConfigurer进行mapper的包扫描
  • 使用mybatis整合包提供的FactoryBean快速整合

配置方式一(保留mybatis-config.xml)

依然保留mybatis的外部配置文件,将数据库连接信息交给Druid连接池配置

DataSource的配置不要和mybatis的配置放在一个文件中,否则DaraSource的@Value注解会晚于mybatis的配置生效,会显示DataSource的配置信息为空,应该将DataSource的配置放在另一个文件中进行

MapperJavaConfig:

@Configuration
@PropertySource("classpath:jdbc.properties")
public class MapperJavaConfig {

//sqlSessionFactory加入ioc容器,使用SqlSessionFactoryBean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
//指定配置文件等信息
//指定数据库连接池对象
sqlSessionFactoryBean.setDataSource(dataSource);
//指定外部的mybatis配置文件
//Resource用的org.springframework.core.io包下的
Resource resource = new ClassPathResource("mybatis-config.xml");
        sqlSessionFactoryBean.setConfigLocation(resource);
        return sqlSessionFactoryBean;
    }
//mapper代理对象加入到ioc
public MapperScannerConfigurer mapperScannerConfigurer(){
//指定包,会将包下的mapper的代理对象加入到ioc容器中
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.ergou.mapper");//指定mapper接口和mapper.xml所在的共同的包名
return mapperScannerConfigurer;
    }
}

DataSourceJavaConfig:

@Configuration
@PropertySource("classpath:jdbc.properties")
public class DataSourceJavaConfig {
    @Value("${jdbc.user}")
    private String user;
    @Value("${jdbc.password}")
    private String password;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.driver}")
    private String driver;
    @Bean
    public DataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driver);
        return dataSource;
    }
}

配置方式二(完全类配置)

不保留mybatis的外部配置文件(xml), 所有配置信息(settings、插件、别名等)全部在声明SqlSessionFactoryBean的代码中指定!数据库信息依然使用DruidDataSource实例替代

DataSourceJavaConfig的配置类上同。

MapperJavaConfig:

@Configuration
@Import(DataSourceJavaConfig.class)
public class MapperJavaConfig {

/**
     *配置SqlSessionFactoryBean,指定连接池对象和外部配置文件即可
* @paramdataSource需要注入连接池对象
* @return工厂Bean
     */
@Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
//实例化SqlSessionFactory工厂
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();

//设置连接池
sqlSessionFactoryBean.setDataSource(dataSource);

//TODO:替代xml文件的java配置
/*

            <settings>
                <!--开启驼峰式映射-->
                <setting name="mapUnderscoreToCamelCase" value="true"/>
                <!--开启logback日志输出-->
                <setting name="logImpl" value="SLF4J"/>
                <!--开启resultMap自动映射 -->
                <setting name="autoMappingBehavior" value="FULL"/>
            </settings>

            <typeAliases>
                <!--给实体类起别名 -->
                <package name="com.ergou.pojo"/>
            </typeAliases>

            <plugins>
                <plugin interceptor="com.github.pagehelper.PageInterceptor">
                    <!--
                        helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。
                        你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:
                        oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
(完整内容看 PageAutoDialect) 特别注意:使用 SqlServer2012数据库时,
                        <https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md#%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E5%BA%93%E6%96%B9%E8%A8%80>
                     -->
                    <property name="helperDialect" value="mysql"/>
                </plugin>
            </plugins>

         */

        //settings [包裹到一个configuration对象,切记别倒错包]
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.setLogImpl(Slf4jImpl.class);
        configuration.setAutoMappingBehavior(AutoMappingBehavior.FULL);
        sqlSessionFactoryBean.setConfiguration(configuration);

//typeAliases
sqlSessionFactoryBean.setTypeAliasesPackage("com.ergou.pojo");

//分页插件配置
PageInterceptor pageInterceptor = new PageInterceptor();

        Properties properties = new Properties();
        properties.setProperty("helperDialect","mysql");
        pageInterceptor.setProperties(properties);
        sqlSessionFactoryBean.addPlugins(pageInterceptor);

        return sqlSessionFactoryBean;
    }
/**
     *配置Mapper实例扫描工厂,配置<mapper <package对应接口和mapperxml文件所在的包
* @return
     */
@Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
//设置mapper接口和xml文件所在的共同包
mapperScannerConfigurer.setBasePackage("com.ergou.mapper");
        return mapperScannerConfigurer;
    }
}

配置类的初始化

初始化类:

public class SpringIoCInit extends AbstractAnnotationConfigDispatcherServletInitializer {
//rootIoc容器的指定
@Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{DataSourceJavaConfig.class, MapperJavaConfig.class, ServiceJavaConfig.class};
    }
//webIoc容器的指定
@Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebMvcJavaConfig.class};
    }
//dispatcherServlet的拦截路径
@Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1497415.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++_程序流程结构_跳转语句_break

break 作用 用于跳出选择结构或循环结构 break使用的时机 出现在switch条件语句中&#xff0c;作用是终止case并跳出switch出现在循环语句中&#xff0c;作用是跳出当前的循环语句出现在嵌套循环中&#xff0c;跳出最近的内层循环语句 示例1 示例2 示例3

Java单元测试实战

简介 在开发中&#xff0c;发现很多人并不理解什么是单元测试&#xff0c;容易和集成测试混淆&#xff0c;所以专门写一章来讲解&#xff0c;再拓展一下如果获得代码测试覆盖率。我们通常可以将测试分为两大类&#xff0c;一种是集成测试&#xff0c;一种是单元测试。 集成测…

5G与智慧文旅的融合发展:推动旅游业转型升级与可持续发展

随着5G技术的飞速发展和广泛应用&#xff0c;其与智慧文旅的融合发展正成为推动旅游业转型升级与可持续发展的重要力量。5G技术以其高速率、低时延、大连接的特性&#xff0c;为智慧文旅注入了新的活力&#xff0c;助力旅游业实现更高效、更智能、更绿色的发展。本文将深入探讨…

Bert Encoder和Transformer Encoder有什么不同

前言&#xff1a;本篇文章主要从代码实现角度研究 Bert Encoder和Transformer Encoder 有什么不同&#xff1f;应该可以帮助你&#xff1a; 深入了解Bert Encoder 的结构实现深入了解Transformer Encoder的结构实现 本篇文章不涉及对注意力机制实现的代码研究。 注&#xff1a;…

快来查看!你的简历亮点在哪里?还有精美模板等你来下载!

一、个人简历写作指南 编写个人简历是展示自己专业技能、工作经历和教育背景的重要方式。以下是一些个人简历写作的指南&#xff0c;希望对你有所帮助&#xff1a; 1. 简明扼要 简洁清晰&#xff1a;简历内容应该简明扼要&#xff0c;突出重点信息&#xff0c;避免冗长。易读性…

J8 - Inception v1算法

目录 理论知识Inception卷积计算 模型结构模型实现inception 结构GoogLeNet模型打印模型结构 模型效果总结与心得体会 理论知识 GoogLeNet首次出现就在2014年的ILSVRC比赛中获得冠军&#xff0c;最初的版本为InceptionV1。共有22层深&#xff0c;参数量5M。 可以达到同时期VGG…

FreeROTS day2

总结DMA空闲中断接收数据的使用方法 首先要要选择串口然后配置串口的参数&#xff0c;配置MDA通道选择接受数据&#xff0c;配置空闲中断&#xff0c;定义一个数据接收的容器&#xff0c;启动MDA传输当串口收到数据时MDA将数据传输到容器中,MDA会一直检测是否有数据当有数据并…

Node 旧淘宝源 HTTPS 过期处理

今天拉取老项目更新依赖&#xff0c;出现 urlshttps%3A%2F%2Fregistry.npm.taobao.org%2Fegg-logger%2Fdownload%2Fegg-logger-2.6.1.tgz: certificate has expired 类似报错。即使删除 node_modules 重新安装&#xff0c;问题依然无法解决。 一、问题演示 二、原因分析 1、淘…

泰克P6139B TektronixP6139B无源探头

特征&#xff1a; 500 MHz 探头带宽 探头尖端的大输入阻抗 10 MOhm&#xff0c;8 pF 补偿范围&#xff1a;8 pF 至 18 pF 电缆长度&#xff1a;1.3M 10X 衰减系数 300 V CAT II 输入电压 用于探测小几何电路元件的紧凑型探头 用于增强被测设备可见性的小型探头主体 可更换的探…

leetcode 3.6

Leetcode hot 100 一.矩阵1.旋转图像 二.链表1. 相交链表2.反转链表3.回文链表4.环形链表5.环形链表 II 一.矩阵 1.旋转图像 旋转图像 观察规律可得&#xff1a; matrix[i][j] 最终会被交换到 matrix [j][n−i−1]位置&#xff0c;最初思路是直接上三角交换&#xff0c;但是会…

CTP-API开发系列之五:SimNow环境介绍

CTP-API开发系列之五&#xff1a;SimNow环境介绍 CTP-API开发系列之五&#xff1a;SimNow环境介绍SimNow模拟测试环境第一套第二套登录关键字段可视化终端常见问题 CTP-API开发系列之五&#xff1a;SimNow环境介绍 如果你要研发一套国内期货程序化交易系统&#xff0c;从模拟测…

AI嵌入式CanMV-K230项目(1)-简介

文章目录 前言一、嘉楠的产品体系二、开发板介绍三、应用领域总结 前言 前一些列文章我们介绍了K210的使用方法&#xff0c;近期嘉楠科技发布了最新一版的K230芯片&#xff0c;下面我们来了解下这款芯片&#xff0c;后续我们将介绍该款芯片开发板的使用方法。 一、嘉楠的产品体…

ant-desgin charts双轴图DualAxes,柱状图无法立即显示,并且只有在调整页面大小(放大或缩小)后才开始显示

摘要 双轴图表中&#xff0c;柱状图无法立即显示&#xff0c;并且只有在调整页面大小&#xff08;放大或缩小&#xff09;后才开始显示 官方示例代码 在直接复制&#xff0c;替换为个人数据时&#xff0c;出现柱状图无法显示问题 const config {data: [data, data],xFiel…

Cobalt Strike 4.9.1(已更新,文章图片没换)

Cobalt Strike 4.9.1 1. 工具介绍1.1. 工具添加1.2. 工具获取 2. 工具使用2.1. 添加权限并运行2.2. 连接服务端2.3. 连接成功 3. 安全性自查 1. 工具介绍 CS 是Cobalt Strike的简称&#xff0c;是一款渗透测试神器&#xff0c;常被业界人称为CS神器。Cobalt Strike已经不再使用…

类和对象周边知识

再谈构造函数 前几期我们把六个默认成员函数一一说明后&#xff0c;构造函数还有一些周边知识。 初始化列表 我们在没有了解初始化列表的时候一般都是使用构造函数初始化或者在声明哪里给予缺省值&#xff0c;那么为什么好药存在初始化列表呢&#xff1f;是因为①.有些值必须…

GAN 网络的损失函数介绍代码

文章目录 GAN的损失函数介绍1.L1 losses2.mse loss3.smooth L14.charbonnier_loss5.perceptual loss (content and style losses)6.Gan损失7.WeightedTVLoss8.完整代码方便使用,含训练epoch代码。 GAN的损失函数介绍 1.L1 losses pixel_opt: type: L1Loss loss_weight: 1.0 r…

Linux Ubuntu部署SVN服务端结合内网穿透实现客户端公网访问

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

2024.3.7

大端存储&#xff1a;高存低&#xff0c;低存高&#xff1b; 小端存储&#xff1a;高存高&#xff0c;低存低&#xff1b; sizeof 用于获取数据类型或变量的大小&#xff0c;strlen 用于获取字符串的长度。 不能改变常量字符串&#xff0c; char *arr"hello"; *ar…

外汇天眼:伦敦金属交易所宣布新的高级领导任命

伦敦金属交易所&#xff08;LME&#xff09;今日宣布了多项高级领导职务任命和组织设计变更。 LME的任命将于2024年4月1日生效。 苏珊斯莫尔被任命为总法律顾问&#xff0c;负责监督LME及LME Clear的法律职能。斯莫尔女士将于6月加入&#xff0c;并将向LME及LME Clear的首席执…

JEDEC标准介绍及JESD22全套下载

JEDEC标准 作为半导体相关的行业的从业者&#xff0c;或多或少会接触到JEDEC标准。标准对硬件系统的设计、应用、验证&#xff0c;调试等有着至关重要的作用。 JEDEC&#xff08;全称为 Joint Electron Device Engineering Council&#xff09;是一个电子组件工程标准制定组织…