SSM 注解配置方式整合

news2025/1/23 10:32:37

文章目录

  • Bean注解
  • 使用注解方式代替 web.xml 文件
  • Spring注解方式整合Mybatis
  • 事务管理器配置
  • 请求与响应
  • @EnableWebMvc 注解
  • REST 风格
  • RestController
  • ComponentScan
  • 静态资源放行
  • 表现层数据封装
  • @EnableAspectJAutoProxy(AOP注解方式)
  • AOP 通知获取数据(参数,返回值,异常)
  • 异常处理器
  • 项目异常处理
  • 拦截器
  • Maven 相关
    • 分模块开发
    • 依赖传递
    • 可选依赖与排除依赖
    • 依赖冲突
    • 聚合
    • 继承
    • 属性
    • 配置文件加载属性
    • 版本管理
    • 多环境开发
    • 跳过测试
    • 私服


Bean注解

用户自定义的类可以用 @Service、@Controller 等注解将其标注,使用注解扫描方式使得 Spring 去创建这些 bean 对象。
Q:第三方的类如何使用注解方式使 Spring 去创建呢?
A:@Bean 注解声明

DataSourceConfiguration.java

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

    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Bean("dataSource")
    public DataSource getDataSource(User user) throws PropertyVetoException {
        System.out.println("-----加载数据源-------");
        System.out.println(user);
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(username);
        dataSource.setPassword(password);
        return dataSource;
    }

}

SpringConfiguration.java

@Configuration
@ComponentScan("com.xmu")
@Import({DataSourceConfiguration.class})
public class SpringConfiguration {
}

第三方 bean 依赖注入

  • 引用类型:方法形参
    在这里插入图片描述

  • 简单类型:成员变量

在这里插入图片描述

使用注解方式代替 web.xml 文件

ServletContainersInitConfig.java

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMVCConfig.class};
    }

    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }
}

pom.xml 中导入插件

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.1</version>
      <configuration>
        <port>8080</port>
        <path>/</path>
      </configuration>
    </plugin>
  </plugins>
</build>

在这里插入图片描述

Spring注解方式整合Mybatis

DataSourceConfig.java

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

    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Bean("dataSource")
    public DataSource getDataSource() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(username);
        dataSource.setPassword(password);
        return dataSource;
    }
	// 事务管理器
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource){
        DataSourceTransactionManager ds = new DataSourceTransactionManager();
        ds.setDataSource(dataSource);
        return ds;
    }
}

使用注解方式使 Spring 容器去产生 Mapper 类的对象
MybatisConfig.java

public class MybatisConfig {

    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
        SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
        ssfb.setTypeAliasesPackage("com.xmu.domain");
        ssfb.setDataSource(dataSource);
        return ssfb;
    }

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.xmu.mapper");
        return msc;
    }

}

事务管理器配置

首先在 SpringConfig 上加 @EnableTransactionManagement 注解
在这里插入图片描述

配置 事务管理器的 Bean
在这里插入图片描述
接口上加 @Transactional
在这里插入图片描述

请求与响应

请求体中有数据,转换成 Java 对象,Controller 层方法形参 ➕ @RequestBody;
请求参数中有数据,转换成 Java 对象,Controller 层方法形参 ➕ @RequestParam;

@RequestMapping("/addUsers")
public void addUsers(@RequestBody List<User> userList){
}

@RequestMapping("/addNames")
public void addNames(@RequestParam List<String> nameList){
}

@EnableWebMvc 注解

注意:SpringMvcSupport 继承 WebMvcConfigurationSupport 与 @EnableWebMvc 同时使用会失效
在这里插入图片描述

@EnableWebMvc:可以开启由 json 数据 转换成对象的开关
eth:请求体中是 Json 数据,而 Controller 层方法形参是 Java 对象

@Configuration
@ComponentScan("com.xmu.controller")
@EnableWebMvc  // 可以开启由 json 数据 转换成对象的开关
public class SpringMVCConfig {

    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/pages/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }
}

REST 风格

@RequestMapping("/user/{id}")
public void method(@PathVariable Integer id){}

在这里插入图片描述

RestController

@RestController = @Controller + @ResponseBody

ComponentScan

@ComponentScan(value = "com.xmu",
    excludeFilters = @ComponentScan.Filter(
        type = FilterType.ANNOTATION,
        classes = Controller.class
    )
)

静态资源放行

注意:SpringMvcSupport 继承 WebMvcConfigurationSupport 与 @EnableWebMvc 同时使用会失效
在这里插入图片描述
其它方式解决

SpringMVCConfig 去实现WebMvcConfigure 接口的方法,这样就不用 SpringMvcSupport 继承 WebMvcConfigurationSupport,而且也不用扫描 config
在这里插入图片描述

步骤:
在这里插入图片描述
在这里插入图片描述

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 静态资源放行
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
    }
}

表现层数据封装

后端响应格式
在这里插入图片描述

设置统一数据返回结果类
在这里插入图片描述
在这里插入图片描述

设置统一数据返回结果编码在这里插入图片描述

Controller 层根据操作结果返回 Result
在这里插入图片描述

@EnableAspectJAutoProxy(AOP注解方式)

启动 AOP注解开发
在这里插入图片描述
在这里插入图片描述

AOP 通知获取数据(参数,返回值,异常)

获取切入点参数
在这里插入图片描述
在这里插入图片描述

这里 proceed 的 args 可以不传递(效果一致),但是如果要对参数修改的话,传递的时候一定要传 args 参数

在这里插入图片描述

获取返回值
returning 参数指定接收返回值的对象名称,一般这里的对象用 Object 类型接收,此处的 JoinPoint 参数可写可不写,写的话要放在前面的位置。

在这里插入图片描述

获取异常

在这里插入图片描述
在这里插入图片描述

异常处理器

在这里插入图片描述

  1. 声明这个类是做异常处理的(@RestControllerAdvice)
  2. 在这个类中实现一个方法处理异常(@ExceptionHandler(异常类型))

在这里插入图片描述
在这里插入图片描述

项目异常处理

1. 自定义异常类

在这里插入图片描述

2. 自定义异常编码

在这里插入图片描述

3. 触发自定义异常

在这里插入图片描述

4. 拦截并处理异常

在这里插入图片描述

5. 前端效果

在这里插入图片描述

拦截器

  1. 编写拦截器类实现 HandlerInterceptor 接口,并实现它的方法,用 @Component 注解将其加入 Spring 容器
    在这里插入图片描述
  2. 实现 addInterceptors方法,添加拦截的 Bean 与拦截路径

在这里插入图片描述
3. 开启注解扫描这两个类

在这里插入图片描述

注意:SpringMvcSupport 继承 WebMvcConfigurationSupport 与 @EnableWebMvc 同时使用会失效
在这里插入图片描述
其它方式解决

SpringMVCConfig 去实现WebMvcConfigure 接口的方法,这样就不用 SpringMvcSupport 继承 WebMvcConfigurationSupport,而且也不用扫描 config
在这里插入图片描述

Maven 相关

分模块开发

依赖传递

可选依赖与排除依赖

依赖冲突

在这里插入图片描述

聚合

继承

属性

配置文件加载属性

版本管理

多环境开发

跳过测试

私服

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

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

相关文章

AUTOSAR COM模块框架梳理

框架&#xff1a; COM的功能主要就是两个&#xff1a; 把IPDU内的signal提取出来提供给SWC使用&#xff0c;把SWC发送的signal拷贝到IPDU buffer内 所以&#xff0c;COM的关键字是 signal, signal group, IPDU, IPDU group Signal group 是为了保证 Complex Data Types 的数…

NodeMCU ESP8266开发流程详解(图文并茂)

文章目录 整体架构打开软件setuploop 连接开发板CP2102版本CH340版本 下载结论 整体架构 NodeMCU ESP8266基于Arduino IDE的开发相对来说还是比较容易上手的&#xff0c;我们基本需要以下几个东西&#xff1b; 一台安装好Arduino IDE的PC&#xff0c;并且已经部署环境&#x…

unity脚本_transform父子物体

运行 就没有父子关系了 当我们需要设置父物体时 通常我们用方式二 说明&#xff1a; 参数一&#xff1a;父物体 参数二&#xff1a;是否保留世界坐标的 位置 角度 缩放 信息 true 会保留 世界坐标系下的状态 和 父物体 进行计算 得到本地坐标系信息 false 不会保留 会直…

点餐小程序实战教程04-用户注册

我们上一篇讲解了自定义方法以及生命周期函数的概念&#xff0c;本节我们讲解一下数据源操作的方法。 1 查询单条数据 在我们的业务逻辑里&#xff0c;是要根据用户的登录信息来去数据源获取数据&#xff0c;根据返回结果来判断是否注册过。这里就涉及到要如何过滤数据的问题…

Qt扩展-Advanced-Docking 简介及配置

Advanced-Docking 简介及配置 一、概述二、项目结构三、安装配置四、代码测试 一、概述 Advanced-Docking 是类似QDockWidget 功能的多窗口停靠功能的库。很像visual stdio 的 停靠功能&#xff0c;这个库对于停靠使用的比较完善。很多的软件都使用了这个框架。 项目源地址&a…

基于知识蒸馏的两阶段去雨去雪去雾模型学习记录(二)之知识收集阶段

前面学习了模型的构建与训练过程&#xff0c;然而在实验过程中&#xff0c;博主依旧对数据集与模型之间的关系有些疑惑&#xff0c;首先是论文说这是一个混合数据集&#xff0c;但事实上博主在实验时是将三个数据集分开的&#xff0c;那么在数据读取时是如何混合的呢&#xff0…

【前端开发---Vue3】前段开发之详细的Vue3入门教程,特别适合小白系统学习,入门到熟练使用Vue看这一篇就够了!

前言&#xff1a; 这篇文章更加侧重的是Vue3不同于Vue2的知识点&#xff0c;如果学习Vue2请看下面这篇文章 Vue2详细系统入门教程 11.2 Vue3 声明&#xff1a;图片资源来自于黑马程序员公开学习资料 本人在学习当中&#xff0c;详细整理了笔记&#xff0c;供大家参考学习 1…

基于最近电平逼近的开环MMC逆变器Simulink仿真模型

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

重新认识AUTOSAR Interface

核心&#xff1a; S/R interface: data elementC/S interface: operation (with arguement)M/S interface: mode group &#xff08;macro&#xff09; 其实 data element&#xff0c;operation&#xff0c;mode group 才是核心&#xff0c;他们可以看作是用户自定义的变量类…

柯桥实用口语学习,韩语口头禅系列短句-恋爱篇

사랑해.我爱你。 너한테 미치겠어.我为你疯狂。 난 니거야.我是你的。 넌 내거야.你是我的。 너 잘 생겼어.你很帅。 네가 뽀뽀/키스 해도 돼? 我可以吻你吗?

基于虚拟阻抗的下垂控制——孤岛双机并联Simulink仿真

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

[Spring] Spring5——事务简介

目录 一、事务概述 1、什么是事务 2、事务的四个特性&#xff08;ACID&#xff09; 二、搭建事务操作环境 1、dao、service 两层结构 2、示例 3、模拟异常&#xff08;事务场景引入&#xff09; 三、Spring 事务管理 1、事务管理介绍 2、声明式事务管理——注解方式 …

c++ 学习 之 继承的基本语法

继承可以减少重复的代码 语法&#xff1a; class 子类 : 继承方式 父类子类 也称为 派生类 父类 也称为 基类 class BasePage { public:void header(){cout << "首页&#xff0c;公开课&#xff0c;登录&#xff0c;注册。。。&#xff08;公共头部&#xff09…

C/C++——内存管理

1.为什么存在动态内存分配 灵活性 静态内存分配是在编译时确定的&#xff0c;程序执行过程中无法改变所分配的内存大小&#xff1b;动态内存分配可以根本程序的运行环境来动态分配和释放空间&#xff0c;提供了更大的灵活性 动态数据结构 有些数据结构的大小和结构在编译时…

input输入多行文本:删除“首先 其次 此外 总的来说”

input允许多行输入 233.3表示停止输入input输入多行文本文本 &#xff08;空行&#xff09; &#xff08;空行&#xff09; &#xff08;空行&#xff09; 正文 &#xff08;空行&#xff09; &#xff08;空行&#xff09; &#xff08;空行&#xff09; 正文 &#xff08;空行…

国庆节:不仅仅是庆祝,更是成长与体验

目录 国庆节&#xff1a;不仅仅是庆祝&#xff0c;更是成长与体验引言第一部分&#xff1a;旅途风景目的地选择旅行亮点与国庆的联系 技术主题完成的博文国庆与技术 第三部分&#xff1a;回家的路为什么回家艰难险阻家与国庆 结论 国庆节&#xff1a;不仅仅是庆祝&#xff0c;更…

【Spring笔记02】Spring中的IOC容器和DI依赖注入介绍

这篇文章&#xff0c;主要介绍一下Spring中的IOC容器和DI依赖注入两个概念。 目录 一、IOC控制反转 1.1、什么是IOC 1.2、两种IOC容器 &#xff08;1&#xff09;基于BeanFactory的IOC容器 &#xff08;2&#xff09;基于ApplicationContext的IOC容器 二、DI依赖注入 2.…

Vue MVVM 模型

一、什么事MVVM 模型 MVVM 是 Model-View-ViewModel 的缩写&#xff0c;它是一种软件架构风格 Model&#xff1a;模型&#xff0c; 数据对象&#xff08;data 函数&#xff09;&#xff0c;如下图 View&#xff1a;视图&#xff0c;模板页面&#xff08;用于渲染数据&#xf…

掌握Mac菜单栏,尽在Bartender 5!菜单栏图标管理软件的终极推荐!

作为Mac用户&#xff0c;菜单栏是我们每天使用电脑时最常接触的区域之一。然而&#xff0c;随着我们安装越来越多的应用程序&#xff0c;菜单栏上的图标往往变得拥挤不堪&#xff0c;给我们的工作和生活带来了不便。 幸运的是&#xff0c;有了Bartender 5这款强大的菜单栏图标…

数据结构与算法(Python)

数据结构与算法 算法基础时间复杂度空间复杂度 递归实例&#xff1a;汉诺塔问题 查找顺序查找&#xff08;线性查找&#xff09;二分查找&#xff08;折半查找&#xff09;比较 排序冒泡排序选择排序插入排序快速排序快排和冒泡的时间比较 堆排序树堆堆的向下调整 堆排序过程时…