当前位置: 首页 > news >正文

JavaEE简单示例——基于注解的SSM整合

基于注解的SSM整合

在之前我们进行了基于XML配置文件的整合,这次我们介绍基于注解的SSM框架的整合。基于注解的含义是将我们之前所有的配置文件用java类来代替,也就是我们会在Java类中编写之前我们之前在配置文件中编写的内容。 首先我们将之前我们编写的基于XML的SSM整合复制一份,我们基于这个项目去改造成基于注解的SSM整合最终我们的效果是要将resources文件夹下面的所有的配置文件都用Java类去代替

MyBatis的注解转换

首先还是从MyBatis开始,我们之前是基于XML配置文件开始的,而我们用到的是application-dao.xml配置文件,在这个文件中,我们配置了SqlSessionFactory和Mapper以及我们的数据源,那么现在,我们就把这些配置文件搬到Java类中。 我们首先打开我们的application-dao.xml文件查看里面的内容,在这个文件里面我们做了三件事:1.声明了数据源。2.配置SqlSessionFactory。3.配置dao层接口映射文件。那么我们就依次将这些配置文件搬出来。 首先,我们创建一个软件包叫做com.spring.config用来存放我们Java类的配置文件,然后创建第一个配置类叫做JdbcConfig,这个类用来配置数据源信息。 之前我们的数据源对象是通过一个类去帮我们代理,这个类叫做com.alibaba.druid.pool.DruidDataSource,现在我们继续使用这个类来代理我们的数据源对象,如果要使用第三方Bean时候,我们要使用@Bean注解,声明这是我们引用的Bean,并将其注册到IoC容器中。 在之前的XML配置文件中,我们要获取一个类的对象,我们需要用class指定类的全路径,然后我们就可以获取到这个类的对象。我们在类中定义一个方法,这个方法的返回值就是我们想要的对象的类型,比如现在我需要一个dataSource,那么我就把我的方法的返回值设置成dataSource,这样我们就可以在IoC容器中注册进一个dataSource类型的对象。 这个地方需要去理解一下,注意我们方法的返回值的类型即可。

package com.spring.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;public class JdbcConfig {@Value("jdbc:mysql://localhost:3306/mybatis")private String url;@Value("com.mysql.cj.jdbc.Driver")private String driver;@Value("root")private String username;@Value("@gaoyang1")private String password;@Beanpublic DruidDataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setUsername(username);dataSource.setUrl(url);dataSource.setPassword(password);dataSource.setDriverClassName(driver);return dataSource;}
}

数据源配置完成之后,我们就正式的开始配置MyBatis的配置类,我们继续在config软件包下面创建一个文件叫做MyBatisConfig。要把一个普通的类转换成Spring的配置类,我们需要在类名上添加@Configuration注解。 然后,我们需要添加SqlSessionFactory对象,根据之前我们的经验,我们要使用跟SqlSessionFactory有关的类,那么Spring整合MyBatis包里面专门为我们准备一个用于管理SqlSessionFactory的类,叫做org.mybatis.spring.SqlSessionFactoryBean,那么根据我们之前所说的,我们现在就要定义一个方法,它的返回值就是SqlSessionFactoryBean,并且我们要在方法中对SqlSessionFactory做一些配置。 对于SqlSessionFactory的配置主要就是配置我们之前就已经配置好的数据源对象。 要在一个Bean中引入另一个Bean,我们只需要在方法的参数中声明被引入的Bean的类型的对象即可,在程序运行的时候,IoC会帮我们自动将类型相同的Bean进行自动装配 比如说我现在正在编写SqlSessionFactory类,此时我们需要引入之前写好的dataSource类,那么我们就可以在SqlSessionFactoryBean方法的形参中声明一个参数,它的类型就是dataSource,我们可以在方法中正常的去使用这个类。

配置完SqlSessionFactoryBean之后,剩下的就是配置dao层接口扫描类,这个类的作用是扫描我们包下的接口,自动的帮我们为每一个接口创建一个实现类,我们只需要声明接口而不用去创建接口的实现类以及将实现类注册进IoC的过程。

package com.spring.config;import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;@Configuration
public class MyBatisConfig {
//    创建第三方Bean管理SqlSessionFactory@Beanpublic SqlSessionFactoryBean sessionFactoryBean(DataSource dataSource){SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();sessionFactoryBean.setDataSource(dataSource);return sessionFactoryBean;}
//    创建第三方Bean管理接口文件映射@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();mapperScannerConfigurer.setBasePackage("com.spring.dao");return mapperScannerConfigurer;}
}

配置完之后,我们就完成了MyBatisConfig类的配置,现在这个类就相当于是我们的application-dao.xml配置文件,那么接下来,我们就要开始搬运application-service.xml文件里面的配置了 在application-service.xml中我们只做了一件事,那就是扫描Service包下面的注解,并将注解对应的类注册进IoC容器中。那么我们首先先把这个做了 在Config包下面创建一个类叫做SpringConfig配置文件,并且在类上添加@Configuration注解将他变成一个配置类。 然后就是实现扫描包的功能,实现在配置文件中扫描包,需要添加@ComponentScan注解,注解中使用字符串配置要扫描的包的全限定路径。 在将application-service.xml文件中的基础配置搬运过来之后,我们还需要做一个动作,就是将两个配置文件整合一下,现在我们还是只是两个分散的配置文件,互相之间没有联系,我们要让他们形成一个完整的系统,就要在SpringConfig中引入MyBatis的两个配置文件,分别是JdbcConfig和MyBatisConfig。 在一个配置类中引入外部的配置文件,我们需要使用到@Import注解。 这个注解的值是一个数组,里面可以存放我们的配置文件的class文件,这样我们就完成了Spring和MyBatis的整合。

package com.spring.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;@Configuration
@ComponentScan("com.spring.service")
@Import({MyBatisConfig.class, JdbcConfig.class})
public class SpringConfig {
}

然后我们就开始修改SpringMVC的配置文件的内容,首先我们来看跟SpringMVC有关的内容都有什么,一个SpringMVC的容器配置文件,一个web.xml配置文件。我们首先来看SpringMVC的配置文件。在这个文件中我们做了三件事,首先是包扫描,扫描controller包下面的Bean并将他们注册到IoC容器中。以及配置了一个注解驱动。 我们首先创建一个配置类,叫做SpringMVCConfig文件,然后开始将我们刚才说到的两个步骤搬运到我们的配置类中。 首先是转换配置类的注解是@Configuration,以及包扫描的注解是@ComponentScan,那么注解驱动器怎么配置呢?在SpringMVC的注解驱动的配置需要添加@EnableWebMvc注解去完成这个注解只需要存在就可以了,不需要有任何的值传入。 这样我们之前的SpringMVC的配置文件中的内容就已经全部转移到配置类中了。 

package com.spring.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;@Configuration
@ComponentScan("com.spring.controller")
@EnableWebMvc
public class springMVCConfig {}

然后我们再来看web.xml文件,在这个文件中,我们主要就是配置了一个前端控制器,并且完成了一些初始化的操作,那么我们的Spring就提供了一个抽象类去完成这一系列的动作,既可以完成前端控制器的配置,还能完成我们两个容器,也就是Spring容器和SpringMVC子容器的容器初始化的动作。 任何继承AbstractAnnotationConfigDispatcherServletInitializer的类都会在项目启动的时候自动配置DispatchServlet、初始化SpringMVC容器和Spring容器 这是Spring官网的原话,也就是我们只需要创建一个类去继承他的AbstractAnnotationConfigDispatcherServletInitializer类,就可以完成上述的三个动作。 那么我们现在就在config包下面创建一个类叫做ServletContainersInitConfig,这个类去继承AbstractAnnotationConfigDispatcherServletInitializer。 可以看到,我们在继承这个类之后,他会提示我们需要重写三个方法,那么这三个方法就是对应我们刚才说的三个动作,我么现在开始简单介绍一个这三个方法对应的功能

  • getRootConfigClasses:将Spring配置类的信息加载到Spring容器中
  • getServletConfigClasses:将SpringMVC配置类的信息加载到SpringMVC容器中
  • getServletMappings:可以指定DispatchServlet的拦截路径,一般就是“/”这个值,拦截所有就可以了 
package com.spring.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;public class ServletContainersInitConfig extendsAbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{springMVCConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}

至此我们就完成了基于注解的SSM的整合,在整个的过程中,我们要明确的认识配置类和配置文件的关系,只要搞清楚了注解和配置之间的关系,我们对于两个模式之间的转化就会非常的得心应手

相关文章:

JavaEE简单示例——基于注解的SSM整合

基于注解的SSM整合 在之前我们进行了基于XML配置文件的整合&#xff0c;这次我们介绍基于注解的SSM框架的整合。基于注解的含义是将我们之前所有的配置文件用java类来代替&#xff0c;也就是我们会在Java类中编写之前我们之前在配置文件中编写的内容。 首先我们将之前我们编写…...

EFBG-06-250双比例阀放大器

EFBG-06-250双比例阀放大器特点&#xff1a; 1.本阀系仅供应驱动元件所需最低的压力及流量的入口节流式节能阀。 2.本阀可使油泵及马达侧的压力随时维持大于负载压0.6-0.9MPa的压差&#xff0c;因而可节省能耗。 3.外置比例放大器参数可调&#xff0c;维修更换简单。...

初级算法-栈与队列

主要记录算法和数据结构学习笔记&#xff0c;新的一年更上一层楼&#xff01; 初级算法-栈与队列一、栈实现队列二、队列实现栈三、有效的括号四、删除字符串中的所有相邻重复项五、逆波兰表达式求值六、滑动窗口最大值七、前K个高频元素栈先进后出&#xff0c;不提供走访功能…...

菜鸟教程之Android学习笔记Service

Service初步 一、StartService启动Service的调用顺序 MainActivity.java package com.example.test2;import androidx.appcompat.app.AppCompatActivity;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View;…...

半个月狂飙1000亿,ChatGPT概念股凭什么?

ChatGPT 掀起了AI股历史上最疯狂的一轮市值狂飙。 自春节后至今&#xff0c;ChatGPT概念股开始了暴走模式&#xff0c;短短半月时间&#xff0c;海天瑞声、开普云等ChatGPT概念股市值累计增加了近1400亿。 如此的爆炸效应&#xff0c;得益于ChatGPT所展现出商业化落地的巨大潜…...

linux使用systemctl

要使用 systemd 来控制 frps&#xff0c;需要先安装 systemd&#xff0c;然后在 /etc/systemd/system 目录下创建一个 frps.service 文件 安装systemd # yum yum install systemd # apt apt install systemd创建并编辑 frps.service 文件 [Unit] DescriptionFrp Server Serv…...

交换机和VLAN简介

一.二层设备&#xff08;交换机和网桥&#xff09;的区别简介 1.交换机&#xff1a; 2.网桥&#xff1a; 二.交换机原理介绍 三.VLAN概念介绍 1.VLAN将一个物理区域LAN划分为多个区域 2.作用&#xff1a; 3.标识方式VLAN ID 4.VLAN配置下MAC地址表的三元素 5.交换中的…...

想要拯救丢失的海康威视硬盘录像数据?可采用这三种恢复方法

海康威视作为全球领先的视频监控产品及解决方案提供商&#xff0c;其硬盘录像机可用于对大型公共场所、企事业单位及个人住宅等场所的安全监控。然而在实际使用中&#xff0c;有时会发生硬盘录像数据丢失的情况&#xff0c;这将对用户带来不小的损失和困扰。 硬盘录像数据丢失…...

每周一算法:高精度乘法(一)大整数乘整数

高精度乘法 乘法是我们在比赛中常用到运算之一,但在利用C++进行乘方或者阶乘计算时,由于其结果的增长速度很快,很容易就溢出了。例如: 13 ! = 6 , 227 , 020 , 800 13!=6,227,020,800 13!=6...

c++华为od面经

手撕代码&#xff1a; 力扣1004 最大连续1的个数 给定一个二进制数组 nums 和一个整数 k&#xff0c;如果可以翻转最多 k 个 0 &#xff0c;则返回 数组中连续 1 的最大个数 。 输入&#xff1a;nums [1,1,1,0,0,0,1,1,1,1,0], K 2 输出&#xff1a;6 解释&#xff1a;[1,1,1…...

【郭东白架构课 模块二:创造价值】18|节点一:架构活动中为什么要做环境搭建?

你好&#xff0c;我是郭东白。在第 16、17 讲&#xff0c;我们讲解了架构师在架构活动中要起的作用&#xff0c;主要有达成共识、控制风险、保障交付和沉淀知识这四个方面。这是从架构师创造价值的维度来拆解的。 那么从这节课开始&#xff0c;我将从架构活动生命周期的维度上…...

15个awk的经典实战案例

目录 一、插入几个新字段 二、格式化个空白 三、筛选IPV4地址 命令及结果 第一种查询方式 第二种查询方式 第三种查询方式 四、读取.ini配置文件中的某段 命令及结果 第一种查询方式 第二种查询方式 五、根据某字段去重 命令及结果 第一种方式 第二种方式 六、…...

【JAVA】本地代码获取路径乱码

本地代码获取路径乱码 获取resources下资源乱码 解决方法&#xff1a; 获取路径后把返回值decode下就可以了. 用utf-8编码 String path this.getClass().getResource("").getPath();...

自然机器人最新发布:智能流程助手,与GPT深度融合

ChatGPT自2022年11月上线后就受到现象级地广泛关注&#xff0c;5天时间用户就已经突破百万&#xff0c;仅2个月时间月活用户就突破1亿&#xff0c;成为史上增速最快的消费级应用&#xff0c;远超TikTok、Facebook、Google等全球应用。它展现了类似人类的语言理解和对话交互能力…...

【Mybatis】4—动态SQL

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 如果文章对你有所帮助&#xff0c;可以点赞&#x1f44d;…...

事务传播特性和隔离级别

事务的四大特性 1.原子性&#xff08;Atomicity&#xff09;&#xff1a;事务不可再分&#xff0c;要么都执行&#xff0c;要么都不执行。 2.一致性&#xff08;Consistency&#xff09;&#xff1a;事务执行前后&#xff0c;数据的完整性保持一致&#xff0c;即修改前后数据总…...

socket网络编程

端口 &#xff1a;主机上一个应用程序的代号&#xff08;端口不变&#xff09; 为什么不用PID来表示一个应用 因为PID会变化&#xff0c;而端口是不变的 套接字进程间通信——跨越主机 1、主机字节序列和网络字节序列 主机字节序列分为大端字节序和小端字节序&#xff0c;不同…...

IO多路复用机制详解

高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型&#xff0c;常见的IO模型有四种&#xff1a; &#xff08;1&#xff09;同步阻塞IO&#xff08;Blocking IO&#xff09;&#xff1a;即传统的IO模型。 &#xff08;2&#xff09;同步非阻塞IO&#xff08;Non-blo…...

选择一款好用的营销项目管理可以更好帮您解决任何问题

营销项目管理软件哪个好用&#xff1f;使用Zoho Projects营销项目管理软件&#xff0c;您可以从营销活动中获得最佳结果&#xff0c;并获得可执行的见解。Zoho Projects的营销项目管理软件可让您和您的团队全面了解您的所有活动。监控您的社交渠道、跟踪结果并在一处进行交流。…...

计算机网络(第八版)第三章知识总结(期末复习可用)

本笔记来源于博主上课所记笔记整理&#xff0c;可能不全&#xff0c;欢迎大家批评指正&#xff0c;如果觉得有用记得点个赞&#xff0c;给博主点个关注...该笔记将会持续更新...整理不易&#xff0c;希望大家多多点赞。 第一章 第三章 数据链路层 数据链路层属于计算机网络的低…...

视频音频去掉开头结尾 视频去掉前n秒后n秒 电视剧去掉开头歌曲

视频音频去掉开头结尾 视频去掉前n秒后n秒 视频音频去掉开头结尾 视频去掉前n秒后n秒 电视剧去掉开头歌曲 如果你有一些视频或者音频&#xff0c;你想去掉开头或结尾的几秒钟&#xff0c;那么你可以尝试一下这个工具&#xff0c;首先&#xff0c;我们来看一下&#xff0c;我们以…...

实验四:图像灰度处理

实验四 图像处理实验报告 目录 实验目的实验内容 原理描述Verilog HDL设计源代码Testbench仿真代码及仿真结果XDC文件配置下板测试 实验体会实验照片 实验目的 在实验三的基础上&#xff0c;将图片显示在显示器上&#xff0c;并进行灰度处理。 实验内容 原理描述 1. 图片的…...

1. Web网络基础 - IP地址核心知识解析

深入解析IP地址与ipconfig命令&#xff1a;网络工程师的必备技能 在网络世界中&#xff0c;IP地址是设备通信的基石。本文将全面解析IP地址的核心概念&#xff0c;并通过ipconfig命令实战演示如何获取关键网络配置信息。 一、IP地址核心知识解析 1. IP地址的本质 定义&#x…...

uni-app学习笔记二十九--数据缓存

uni.setStorageSync(KEY,DATA) 将 data 存储在本地缓存中指定的 key 中&#xff0c;如果有多个key相同&#xff0c;下面的会覆盖掉原上面的该 key 对应的内容&#xff0c;这是一个同步接口。数据可以是字符串&#xff0c;可以是数组。 <script setup>uni.setStorageSyn…...

web端rtmp推拉流测试、抽帧识别计数,一键式生成巡检报告

本文旨在实现无人机城市交通智慧巡检中的一个模块——无人机视频实时推拉流以及识别流并在前端展示&#xff0c;同时&#xff0c;统计目标数量以及违停数量&#xff0c;生成结果评估&#xff0c;一并发送到前端展示。对于本文任何技术上的空缺&#xff0c;可在博主主页前面博客…...

电脑商城--用户注册登录

用户注册 1 用户-创建数据表 1.使用use命令先选中store数据库。 USE store; 2.在store数据库中创建t_user用户数据表。 CREATE TABLE t_user (uid INT AUTO_INCREMENT COMMENT 用户id,username VARCHAR(20) NOT NULL UNIQUE COMMENT 用户名,password CHAR(32) NOT NULL COMME…...

【NLP中向量化方式】序号化,亚编码,词袋法等

1.序号化 将单词按照词典排序&#xff0c;给定从0或者1或者2开始的序号即可&#xff0c;一般情况有几 个特征的单词: PAD表示填充字符&#xff0c;UNK表示未知字符 在这个例子中&#xff0c;我们可以看到我们分别将3个文本分为了4个token&#xff0c;每个token用左侧的词典表示…...

现代简约壁炉:藏在极简线条里的温暖魔法

走进现在年轻人喜欢的家&#xff0c;你会发现一个有趣的现象&#xff1a;家里东西越来越少&#xff0c;颜色也越看越简单&#xff0c;却让人感觉特别舒服。这就是现代简约风格的魅力 —— 用最少的元素&#xff0c;打造最高级的生活感。而在这样的家里&#xff0c;现代简约风格…...

在C++中,头文件(.h或.hpp)的标准写法

目录 1.头文件保护&#xff08;Include Guards&#xff09;2.包含必要的标准库头文件3.前向声明&#xff08;Forward Declarations&#xff09;4.命名空间5.注释示例1&#xff1a;基础头文件示例2&#xff1a;包含模板和内联函数的头文件示例3&#xff1a;C11风格的枚举类头文件…...

【华为云学习与认证】以华为云物联网为基座的全栈开发(从物联网iot平台模块到应用展示、数据分析、机器学习、嵌入式开发等)的系统性学习与认证路线

总目标 学习以华为云物联网为基座的全栈开发&#xff08;从物联网iot平台模块到应用展示、数据分析、机器学习、嵌入式开发等&#xff09;的系统性学习与认证路线。计划包含阶段学习、技术文档、实操实际操作、开发路径与考证规划&#xff0c;提供职业生涯基础性规划。 注意&…...