SSM框架,SSM框架的整合

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[]{"/"};
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贝叶斯:最大似然估计与最大后验估计

最大似然估计 最大后验估计 《神经网络与深度学习》 Neural Networks and Deep Learning 邱锡鹏 P36-37

网康科技 NS-ASG 应用安全网关 SQL注入漏洞复现(CVE-2024-2022)

0x01 产品简介 网康科技的NS-ASG应用安全网关是一款软硬件一体化的产品,集成了SSL和IPSec,旨在保障业务访问的安全性,适配所有移动终端,提供多种链路均衡和选择技术,支持多种认证方式灵活组合,以及内置短信认证、LDAP令牌、USB KEY等多达13种认证方式。 0x02 漏洞概述 …

python+django+vue电影票订购系统dyvv4

电影院订票信息管理系统综合网络空间开发设计要求。目的是将电影院订票通过网络平台将传统管理方式转换为在网上操作&#xff0c;方便快捷、安全性高、交易规范做了保障&#xff0c;目标明确。电影院订票信息管理系统可以将功能划分为用户和管理员功能[10]。 语言&#xff1a;…

云原生基础知识:容器技术的历史

容器化的定义&#xff1a; 容器化是一种轻量级的虚拟化技术&#xff0c;将应用程序及其所有依赖项&#xff08;包括运行时、系统工具、系统库等&#xff09;打包到一个称为容器的单独单元中。容器提供了一种隔离的执行环境&#xff0c;使得应用程序可以在不同的环境中运行&…

list链表的创建,排序,插入, test ok

1. 链表的建立&#xff0c;打印 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stack> #include <iostream> #include <string.h> #include <string>using namespace std;struct node {int data;s…

一体化对账和结算平台的设计与实现

随着企业规模的扩大和业务的复杂化&#xff0c;对账和结算工作变得愈发繁琐和复杂。为了提高工作效率和降低错误率&#xff0c;许多企业开始寻求一体化对账和结算平台的解决方案。本文将探讨一体化对账和结算平台的设计原则和实施步骤&#xff0c;以及其在企业管理中的重要性。…

jdk安装,配置path系统变量

直接点击安装 不要包含空格&#xff0c;中文字符 3.找到刚刚的路径&#xff0c;看一下&#xff0c;有东西就说明安装对了 配置path winr输入sysdm.cpl点击确定 全部依次点击 确定 即可。 验证jdk是否安装成功 看java、javac是否可用看java、javac版本号是否无问题 win…

about batch[0].new(storage)的问题(VOT)

最近在处理VOT数据集时&#xff0c;遇到了一个奇怪的问题&#xff0c;特此记录。 源代码如下&#xff1a; def ltr_collate_stack1(batch):"""Puts each data field into a tensor. The tensors are stacked at dim1 to form the batch"""error…

Java多线程——synchronized、volatile 保障可见性

目录 引出synchronized、volatile 保障可见性Redis冲冲冲——缓存三兄弟&#xff1a;缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java多线程——synchronized、volatile 保障可见性 synchronized、volatile 保障可见性 原子性&#xff1a;在一次或者多次操作时…

[动态规划]---part2

前言 作者&#xff1a;小蜗牛向前冲 专栏&#xff1a;小蜗牛算法之路 专栏介绍&#xff1a;"蜗牛之道&#xff0c;攀登大厂高峰&#xff0c;让我们携手学习算法。在这个专栏中&#xff0c;将涵盖动态规划、贪心算法、回溯等高阶技巧&#xff0c;不定期为你奉上基础数据结构…

python基础第二天

世界杯小组赛成绩 注意&#xff1a; 1.循环 1.1while 1.2for 1.3 range 1.4 while else while 循环正常执行完才能执行else语句

算法竞赛基础:树状数组

算法竞赛基础&#xff1a;树状数组 是什么&#xff1f; 树状数组虽然语义上是树状&#xff0c;但是实际上还是一个数组。 树状数组的功能就是单点和区间的修改和查询。 例如&#xff0c;如果想增加一个点的值&#xff0c;那么你需要让其上方所有能对齐的树状数组c全部增加相同…

流畅的Python(十七)-使用future处理并发

一、核心要义 主要以三个模拟网络下载的代码-分别是依序下载、使用concurrent.futures模块中的Executor.map方法、以及使用该模块的executor.submit和futures.as_completed方法&#xff0c;来展示Python实现并发编程的其中一种方式。 二、代码示例 1、依序下载的脚本 #!/us…

JS数组,if等结构语序

目录 浏览器的断点调试&#xff1a; 流程控制&#xff1a; 顺序流程控制&#xff1a;流程代码会逐行向下进行。 分支流程控制&#xff1a; IF语句&#xff1a; Switch语句&#xff1a; Switch和if的区别&#xff1a; 三元表达式&#xff1a; 循环&#xff1a; for循环…

XSS漏洞--概念、类型、实战--分析与详解[结合靶场pikachu]

目录 一、XSS概念简述 1、XSS简介&#xff1a; 2、XSS基本原理&#xff1a; 3、XSS攻击流程&#xff1a; 4、XSS漏洞危害&#xff1a; 二、XSS类型&#xff1a; 1、反射型XSS&#xff1a; 2、存储型XSS&#xff1a; 3、DOM型XSS&#xff1a; 三、靶场漏洞复现(pikach…

数据结构之顺序表及其实现!

目录 ​编辑 1. 顺序表的概念及结构 2. 接口的实现 2.1 顺序表的初始化 2.2 检查顺序表容量是否已满 2.3 顺序表的尾插 ​编辑 2.4 顺序表的尾删 2.5 顺序表的头插 2.6 顺序表的头删 2.7 顺序表在pos位置插入 2.8 顺序表在pos位置删除 2.9 顺序表的查找 2.10 顺…

喜报|3DCAT成为国内首批适配Vision Pro内容开发者

近日&#xff0c;苹果在上海总部举办了国内首场 Apple Vision Pro 开发者实验室活动&#xff0c;3DCAT作为国内领先的实时渲染云平台参与了此次活动&#xff0c;成为国内首批适配 Vision Pro 的内容开发者之一。 Vision Pro是苹果于2023年6月发布的首个空间计算设备&#xff0…

Vue+SpringBoot打造超市账单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3.3 后端设计在这里插入图片描述 四、系统展示五、核心代码5.1 查询供应商5.2 查询商品5.3 新增超市账单5.4 编辑超市账单5.5 查询超市账单 六、免责说明 一、摘要 1.1 项目介绍 基于…

Redis的三种集群模式(图解)

主从复制模式 一个主节点和多个从节点。主节点提供写入和读取功能&#xff0c;但是从属节点只提供读取功能。 主从复制的数据同步过程如下&#xff1a; &#xff08;1&#xff09;首先主节点启动&#xff0c;然后从属节点启动&#xff0c;从属节点会连接主节点并发送SYNC命令以…

JAVA WEB案例-登录校验-日志记录

一 前言 在现代社会中&#xff0c;随着互联网的快速发展&#xff0c;WEB应用的安全性问题变得越来越突出。作为一名程序员&#xff0c;我们不仅要注重WEB应用的功能实现&#xff0c;还需要重视安全性问题。在实际开发中&#xff0c;登录校验是非常重要的安全措施&#xff0c;能…