SSM框架学习记录-Spring_day02

news2025/1/11 22:53:18

1.IOC/DI配置管理第三方bean

之前都是基于自己写的类,如果有需求去管理第三方Jar包中的类,该如何管理?


案例:数据源对象管理

使用SpringIOC容器来管理Druid连接池对象


思路分析

  1. 要使用第三方的技术,需要在pom.xml添加依赖

  2. 在配置文件中将第三方的类(指DruidDataSource)制作成一个bean,让IOC容器进行管理

  3. 数据库连接需要基础的四要素(驱动、连接、用户名和密码)如何注入到对应的bean中?setter注入(因为Druid源码中没有构造器方法能接受这四个参数)

  4. 四要素写死在配置文件中不利于后期为维护,该如何修改?将值提取到外部的properties配置文件,Spring再去读取

代码实现

参考Spring_09_dataSource


2.核心容器

简单理解就是ApplicationContext

代码参考Spring_10_container


容器的创建方式


// 1.加载类路径下的配置文件(常用)
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2.从文件系统下加载配置文件(需要写绝对路径)
ApplicationContext ctx = new FileSystemXmlApplicationContext("xxx\\applicationContext.xml");

Bean的三种获取方式


BookDao bookDao1 = (BookDao) ctx.getBean("bookDao");  // 每次获取的时候都需要进行类型转换
BookDao bookDao2 = ctx.getBean("bookDao",BookDao.class);  // 多加了一个参数
BookDao bookDao3 = ctx.getBean(BookDao.class);  // 必须要确保IOC容器中该类型对应的bean对象只能有一个

总结


  • 容器相关:

    • BeanFactoryIOC容器的顶层接口,初始化BeanFactory对象时,加载bean是延迟加载(即需要在代码中使用到bean才会去初始化)
    • ApplicationContext接口是Spring容器的核心接口,初始化时bean立即加载(不过有没使用到bean,只要加载了配置文件都会去初始化)
    • ApplicationContext接口提供基础的bean操作相关方法,通过其他接口扩展其功能
    • ApplicationContext接口常用初始化类:
      • ClassPathXmlApplicationContext(常用)
      • FileSystemXmlApplicationContext
  • bean相关:

在这里插入图片描述

  • 依赖注入相关:

在这里插入图片描述

3.IOC/DI注解开发


注解开发定义bean

使用配置文件定义bean时,需要写以下代码,使用注解开发时该如何定义bean

<bean id="bookDao" class="com.psj.dao.impl.BookDaoImpl"/>

代码参考Spring_11_annotation_bean


  • 删除原XML配置
  • BookDaoImpl类上添加@Component注解:
    • 不可添加在接口上,因为接口无法创建对象
    • 如果不起别名,会有以当前类名首字母小写为默认名称
    • 该注解还有三个衍射注解:
      • @Controller::用于定义表现层bean
      • @Service:用于定义业务层bean
      • @Repository:用于定义数据(Dao)层bean

在这里插入图片描述

  • 配置Spring的注解包扫描:为了让Spring框架能扫描到写在类上的注解,需要在配置文件上进行包扫描
<context:component-scan base-package="com.psj"/>

纯注解开发模式

上面代码中还是使用了配置文件用于对包进行扫描,纯注解开发模式则使用Java类替代配置文件,也就不需要applicationContext.xml

代码参考Spring_11_annotation_bean


  • 创建配置类SpringConfig

  • 标识SpringConfig为配置类:添加@Configuration注解

  • 用注解替换包扫描配置:添加包扫描注解@ComponentScan(需要添加多个扫描路径用数组格式)

  • 运行时使用AnnotationConfigApplicationContext

bean作用范围与生命周期管理

代码参考Spring_12_annotation_bean_manager


  • Bean的作用范围:比如要将BookDaoImpl变成非单例,只需要在其类上添加@scope注解(默认值singleton,可选值prototype)

  • Bean的生命周期:

    • BookDaoImpl中添加两个方法,方法名可以任意
    • 在对应的方法上添加@PostConstruct@PreDestroy注解即可(注意要在pom文件中添加javax.annotation的依赖,因为JDK9移除了)

注解开发依赖注入

Spring为了使用注解简化开发,没有提供构造函数注入、setter注入对应的注解,只提供了自动装配(自动装配基于反射设计创建对象并通过暴力反射为私有属性进行设值,所以无需setter方法)的注解实现

代码参考Spring_13_annotation_bean_manager


  • 按照类型注入:@Autowired默认按照类型自动装配,如果IOC容器中同类的Bean找到多个,就按照变量名和Bean的名称匹配
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;
    ...
}
  • 按照名称注入:
    • @Qualifier注解后的值就是需要注入的Bean的名称
    • @Qualifier不能独立使用,必须和@Autowired一起使用
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    @Qualifier("bookDao1")
    private BookDao bookDao;
    ...
}
  • 简单数据类型注入:使用@Value注解

    • 将值直接写入注解的参数
    @Repository("bookDao")
    public class BookDaoImpl implements BookDao {
        @Value("psj")
        private String name;
    	...
    }
    
    • 读取配置文件:
      • @PropertySource属性可用数组形式指定多个
      • @PropertySource属性中不支持使用通配符*
      • @PropertySource属性中可以把classpath:加上,代表从当前项目的根路径找文件
    // ①使用注解加载properties配置文件
    @Configuration
    @ComponentScan("com.psj")
    @PropertySource("jdbc.properties")
    public class SpringConfig {
    }
    // ②读取配置文件
    @Repository("bookDao")
    public class BookDaoImpl implements BookDao {
        @Value("${name}")
        private String name;
    }
    

4.IOC/DI注解开发管理第三方bean

前面定义bean时候是在自己开发的类上面写注解,如果是第三方的类则没有办法在类上面添加注解,该怎么办?

代码参考Spring_14_annotation_third_bean_manager


管理第三方bean


  • 新建JdbcConfig配置类:该类代码可以直接写在SpringConfig类中,但是不利于区分和管理

  • 把数据源配置到该类下,并在方法上添加@Bean注解,表示将方法的返回值制作为Spring管理的bean对象:

public class JdbcConfig {
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ...
        return ds;
    }
}
  • SpringConfig使用@Import引入JdbcConfig配置类:
@Configuration
@Import({JdbcConfig.class})  
public class SpringConfig {}

第三方bean注入资源*

在使用@Bean创建bean对象时,如果方法在创建的过程中需要其他资源该怎么办?


  • 注入简单类型:
    • 类中提供四个属性
    • 使用@Value注解引入值
public class JdbcConfig {
    @Value("com.mysql.jdbc.Driver")
    private String driver;
    @Value("jdbc:mysql://localhost:3306/xxxx")
    private String url;
    @Value("xxxx")
    private String userName;
    @Value("xxxx")
    private String password;
    
    @Bean
    public DataSource dataSource(){
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ...
        return ds;
    }
}
  • 注入引用类型:只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象
@Bean
public DataSource dataSource(BookDao bookDao){
    System.out.println(bookDao);  // 前提是要扫描到该bean
    DruidDataSource ds = new DruidDataSource();
    ds.setDriverClassName(driver);
    ...
    return ds;
}

5.注解开发总结


在这里插入图片描述

6.Spring整合

使用Spring整合其他框架其实就是将其他框架需要的配置文件中的信息以bean的形式注入到Spring的容器中管理


整合Mybatis

代码参考Spring_15_spring_mybatis

未整合前,Mybatis的核心文件为App.javaproperties配置文件,其中哪些对象可交给Spring来管理?

  • SqlSessionFactory(SqlSession对象在SqlSessionFactory中已经造出来了,并不属于核心对象):
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
  • Mapper接口和Mapper映射文件(如果使用注解就没有映射文件),这个是在获取到SqlSession后执行具体操作时用:
<mappers>
    <package name="com.psj.dao"></package>
</mappers>

  • Spring管理MyBatis中的SqlSessionFactory
public class MybatisConfig {
    // 定义bean,SqlSessionFactoryBean,用于产生SqlSessionFactory对象
    // SqlSessionFactoryBean中将SqlSessionFactory的创建进行了封装,简化对象的创建,
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){  // dataSource在JdbcConfig中已经注入到Spring中
        SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
        // 下面两句分别是对SqlMapConfig.xml配置文件中typeAliases和environments的替换
        ssfb.setTypeAliasesPackage("com.psj.domain");
        ssfb.setDataSource(dataSource);
        return ssfb;
    }
}
  • Spring要管理Mapper接口的扫描:
// 定义bean,返回MapperScannerConfigurer对象
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
    // MapperScannerConfigurer用来处理原始配置文件中的mappers相关配置,加载数据层的Mapper接口类
    MapperScannerConfigurer msc = new MapperScannerConfigurer();
    // 对SqlMapConfig.xml配置文件中mappers的替换
    msc.setBasePackage("com.psj.dao");
    return msc;
}

Spring整合Junit

代码参考Spring_16_spring_junit

重点在于添加相应的依赖以及在测试类中完成相关配置


参考


https://www.bilibili.com/video/BV1Fi4y1S7ix?p=17-30

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

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

相关文章

CloudKit教程之如何从 CloudKit 获取图像资源到 SwiftUI 应用程序

最近,我研究了 CloudKit API 文档,并尝试将数据库和资产集成到我的应用程序中。这是我的一些发现,希望对您有所帮助…… 想要从 iCloud 公共数据库获取图像资产到他们的 SwiftUI 应用程序的 Apple 开发人员而写的。 将 Sign in with Apple 集成到 CloudKit 新建 Xcode 项…

CSRF漏洞利用与防御

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是CSRF漏洞利用与防御。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权设…

Spring更简单的存储和读取Bean

⭐️前言⭐️ 在上一篇文章【Spring的创建与使用】中&#xff0c;我们已经了解了Spring中bean对象的基本的创建和使用方法&#xff0c;这篇文章通过注解的方法&#xff0c;使得存储和读取对象更加简单。 &#x1f349;博客主页&#xff1a; &#x1f341;【如风暖阳】&#x1…

[附源码]计算机毕业设计JAVA疫情背景下社区公共卫生服务系统

[附源码]计算机毕业设计JAVA疫情背景下社区公共卫生服务系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a…

分布式事务最终一致性的方案

最终一致性的方案 知识储备 分布式系统中不可避免存在分布式事务带来的一致性问题。为了解决这个问题&#xff0c;需要熟悉业界相关的理论&#xff1a; ACID CAP BASE 2PC 3PC TCC 对于一致性的处理&#xff0c;分为强一致和最终一致性。强一致&#xff0c;对系统的吞吐…

cox回归RCS阈值效应函数cut.tab1.3发布

写在前面的话&#xff0c;本次只发布了cox回归RCS阈值函数&#xff0c;请看清楚再购买&#xff0c;觉得贵的可以等一等&#xff0c;这个函数最终会放在ggrcs包上面&#xff0c;免费供大家使用&#xff0c;急用的可以先看看。 接下来聊聊cox回归RCS阈值函数是干什么用的&#xf…

[附源码]Python计算机毕业设计SSM江西婺源旅游文化推广系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Python入门 函数 基础入门篇

一、什么是函数 函数是最基本的一种代码抽象的方式&#xff0c;是组织好的可重复使用的&#xff0c;用来实现单一或相关联功能的代码段。 函数是对做相似的事情或相似的动作进行封装&#xff0c;它能提高应用的模块性和代码的重复利用率。我们要封装好一个函数&#xff0c;首…

[附源码]计算机毕业设计设备运维平台出入库模块APPSpringboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【STM32学习(3)】STM32——简述中断的基础知识

中断一、中断的定义二、中断的作用三、中断源&#xff08;中断触发的硬件&#xff09;四、中断类型五、中断优先级六、中断服务函数一、中断的定义 中断&#xff0c;即CPU在正常执行程序的过程中&#xff0c;遇到外部&#xff08;IO引脚中断&#xff09;/内部&#xff08;定时…

Maven技术

目录 传统项目管理分析&#xff08;导入jar包形式&#xff09; maven组成部分 maven项目构建命令 maven高级 项目的聚合与继承 maven子父工程 需求&#xff1a;使用maven子父工程完成登录并跳转到首页列表 创建父工程 在父工程中以module的形式创建子模块 在父工程中以…

RocketMQ 5.0 可观测能力升级:Metrics 指标分析

作者&#xff1a;玄珏 从消息的生命周期看可观测能力 在进入主题之前先来看一下 RocketMQ 生产者、消费者和服务端交互的流程&#xff1a; message produce and consume process RocketMQ 的消息是按照队列的方式分区有序储存的&#xff0c;这种队列模型使得生产者、消费者和…

Matlab论文插图绘制模板第67期—三角网格图(Trimesh)

在之前的文章中&#xff0c;分享了Matlab网格曲面图的绘制模板&#xff1a; 以及一些特殊形式的网格曲面图&#xff1a; 这一次&#xff0c;再来分享一种特殊的网格曲面图&#xff1a;三角网格图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板…

为初学者介绍轻量级目录访问协议——LDAP

如果您是刚接触Active Directory (AD)的初学者&#xff0c;那么当您发现LDAP这个术语时可能会感到十分迷茫。今天就让我们来您熟悉 LDAP&#xff0c;让您更加坚定学习AD域管理的信心。 LDAP 首先&#xff0c;让我们直面主题&#xff01;什么是 LDAP&#xff1f; LDAP 是一种标…

[矩阵论] Unit 3. 矩阵的分解 - 知识点整理

注: 以下内容均由个人整理, 不保证完全准确, 如有纰漏, 欢迎交流讨论参考: 杨明, 刘先忠. 矩阵论(第二版)[M]. 武汉: 华中科技大学出版社, 2005 3 矩阵的分解 3.1 常见的矩阵标准形与分解 常见标准形 等价标准形: P,QP, QP,Q 可逆 AmnPmm[Ir000]QnnA_{m\times n}P_{m\times…

[附源码]Python计算机毕业设计SSM教师职称资料管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

软件测试流程图!转行互联网职场必备!

今天给大家分享的是&#xff0c;在软件测试日常工作过程中&#xff0c;比较常见的几种测试流程图&#xff1a; 1.【测试立项】流程图 2.【测试计划】流程图 3.【单元测试】流程图 4.【整合测试】流程图 5.【系统测试】流程图 6.【性能测试】流程图 7.【验收测试】…

QTextStream(文本流)

QTextStream QTextStream 类为读取和写入文本提供了一个方便的接口可以在QIODevice、QBateArray、和QString中使用&#xff0c;QTextStream使用的是流运算符&#xff08;>> <<&#xff09;&#xff0c;可以更方便的读/写数据&#xff0c;QTextStream也支持对字段进…

使用 Echarts 插件完成中国地图

目录前言&#xff1a;什么是 Echarts 插件中国地图成品展示步骤&#xff1a;完成中国地图代码总结&#xff1a;前言&#xff1a; 大家都知道&#xff0c;一般情况下&#xff0c;想要使用前端设置一个 中国地图 需要使用 canvas 画布进行编写&#xff0c;不仅代码多&#xff0c…

【滤波器】基于Matlab设计巴斯 切比雪夫 椭圆 低通高通带通带阻数字滤波器附GUI界面

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …