Spring简介IOCDI

news2024/11/22 12:53:42

文章目录

  • Spring简介
    • Spring课程介绍
      • 为什么要学
      • 学什么
      • 怎么学
    • 初识Spring
      • Spring家族
      • Spring发展史
    • Spring体系结构
    • Spring核心概念
      • 目前代码存在的问题
      • 核心概念
  • IOC和DI入门案例
    • IOC入门案例
      • 入门案例分析
      • 实现步骤
      • 实现代码
    • DI入门案例
      • DI入门案例分析
      • 实现步骤
      • 实现代码
      • 图解演示
  • Bean的基础配置
    • bean基础配置
      • id
      • class
    • bean别名配置
      • name
    • bean作用范围配置
      • scope
  • Bean的实例化
    • bean是如何创建的
    • 实例化bean的三种方式
      • 构造方法方式(重点)
      • 静态工厂方式(了解)
      • 实例工厂方式(了解)
      • 实现FactoryBean<T>方式(扩展,了解)
  • 依赖注入
    • 依赖注入方式
      • setter注入
      • 构造器注入(了解)
      • 方式选择
    • 依赖自动装配
    • 集合注入
  • Bean的生命周期
    • 生命周期相关概念介绍
    • bean的生命周期
      • 初始化容器
      • 使用bean
      • 关闭/销毁容器
    • 代码演示
      • bean生命周期演示
      • bean生命周期控制--接口控制(了解)
    • bean销毁时机

Spring简介

Spring课程介绍

为什么要学

  • Spring技术是JavaEE开发必备技能,企业开发技术选型命中率>=90%
  • 专业角度
    • 简化开发,降低企业级开发的复杂性
    • 框架整合,高效整合其他技术,提高企业级应用开发与运行效率

学什么

  • 简化开发
    • IOC
    • AOP(面向切面编程)
      • 事务处理

怎么学

  • 学习Spring框架设计思想
  • 学习基本操作,思考操作与思想间的联系
  • 学习案例,熟悉应用操作的同时,体会思想

初识Spring

Spring家族

  • 官网(中文):https://spring.p2hp.com/index.html
  • Spring发展到今天已经形成了一种开发的生态圈,Spring提供了若干个项目,每个项目用于完成特定的功能

image.png

Spring发展史

image.png

Spring体系结构

4.0
image.png

Spring核心概念

目前代码存在的问题

在不同的类中使用对象得先new对象,然后再进行使用
另外接口中要是实现类变量,等号右边也得改变
问题:这样耦合度偏高
解决方案:使用对象时,在程序中不要主动new对象,转换为由外部提供对象

核心概念

  • IOC(Inversion of Control)控制反转

使用对象时,由主动new产生对象转换为由外部提对 象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。

  • Spring对Ioc思想进行了实现
    • Spring提供了一个容器,称为IOC容器,用来充当Ioc思想中的"外部"
    • IOC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在Ioc容器中统称为Bean
  • DI(Dependency Injection)依赖注入
    • 在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入

image.png

  • 目标充分解耦
    • 使用Ioc容器管理bean
    • 在Ioc容器内将有依赖关系的bean进行关系绑定
  • 最终效果
    • 使用对象时不仅可以直接从Ioc容器中获取,并且获取到的bean已经绑定了所有的依赖关系

IOC和DI入门案例

IOC入门案例

入门案例分析

  1. 管理什么?(Service与Dao)
  2. 如何将被管理的对象告知IOC容器?(配置文件)
  3. 被管理的对象交给IOC容器,如何获取到IoC容器?(接口)
  4. IOC容器得到后,如何从容器中获取bean?(接口方法)
  5. 使用Spring导入哪些坐标?(pom.xml)

实现步骤

  1. 导入Spring坐标
  2. 定义Spring管理的类(接口)
  3. 创建Spring配置文件,配置对应类作为Spring管理的bean对象
  4. 初始化IOC容器(Spring核心容器/Spring容器),通过容器获取bean

实现代码

  1. 坐标
<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
  1. 定义接口
//接口
public interface BookService {

    void save();
}
//实现类
public class BookServiceImpl implements BookService{
    @Override
    public void save() {
        System.out.println("BookService save...");
    }
}

  1. 创建配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="bookService" class="org.example.service.BookServiceImpl"></bean>
</beans>

bean定义id属性在同一个上下文中(IOC容器中)不能重复

  1. 初始化ioc容器,通过容器获取bean对象
public class App {
    public static void main( String[] args ) {

        //1.创建IOC容器,加载Spring核心配置文件
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.从IOC容器中获取bean对象(BookService对象)
        BookService bookService = (BookService) ctx.getBean("bookService");
        //3.调用Bean对象(BookService)的方法
        bookService.save();
    }
}

DI入门案例

DI入门案例分析

  1. 基于IOC管理bean
  2. Service中使用new形式创建的Dao对象是否保留?(否)
  3. Service中需要的Dao对象如何进入到Service中?(提供set方法)
  4. Service与Dao间的关系如何描述?(配置)

实现步骤

  1. 删除使用new的形式创建对象的代码
  2. 提供依赖对象对应的setter方法
  3. 配置service与dao之间的关系

实现代码

  1. 先创建BookDao接口以及实现类
public interface BookDao {

    void save();
}

public class BookDaoImpl implements BookDao{
    @Override
    public void save() {
        System.out.println("BookDao save...");
    }
}

  1. 在BookService的接口和实现类中提供依赖对象对应的setter方法
public interface BookService {

    void save();

    void setBookDao(BookDao bookDao);
}

public class BookServiceImpl implements BookService{

    private BookDao bookDao;
    @Override
    public void save() {
        System.out.println("BookService save...");
    }

    @Override
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }

}

  1. 在配置文件中配置service和dao的关系
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="bookService" class="org.example.service.BookServiceImpl">
        <property name="bookDao" ref="bookDao"></property>
    </bean>

    <bean id="bookDao" class="org.example.dao.BookDaoImpl"></bean>
</beans>

图解演示

image.png

Bean的基础配置

bean基础配置

id

使用容器通过id值获取对应的bean,在一个容器中id值唯一

class

bean的类型,即配置bean的全路径类名(实体类)

bean别名配置

name

定义bean的别名,可定义多个,使用逗号,空格,分号隔开
在通过applicationContext获取bean时,也可以通过别名获取

bean作用范围配置

scope

定义bean的作用范围

  • singleton:单例(默认)
  • prototype:非单例

扩展:scope的取值不仅仅只有singleton和prototype,还有request、session、application、 websocket ,表示创建出的对象放置在web容器(tomcat)对应的位置。比如:request表示保存到request域中。

Bean的实例化

bean是如何创建的

bean本质上就是对象,创建bean使用构造方法完成

实例化bean的三种方式

构造方法方式(重点)

  1. BookDaoImpl实现类
public class BookDaoImpl implements BookDao{

    public BookDaoImpl(){
        System.out.println("bookDaoImpl 无参构造...");
    }
    @Override
    public void save() {
        System.out.println("BookDao save...");
    }
}

  1. 配置文件
    <bean id="bookDao" class="org.example.dao.BookDaoImpl"></bean>
  1. main方法
  //1.创建IOC容器,加载Spring核心配置文件
  ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  //2.从IOC容器中获取bean对象(BookService对象)
  BookDao bookDao = (BookDao) ctx.getBean("bookDao");
  //3.调用Bean对象(BookService)的方法
  bookDao.save();
  1. 运行结果

image.png
说明默认使用是无参构造方法
:无参构造方法如果不存在,会报错

静态工厂方式(了解)

  1. 删除BookDao实现类的无参构造方法
  2. 创建一个类书写静态工厂的代码
public class StaticFactory {

    public static BookDao getBookDao(){

        System.out.println("静态工厂...");
        return new BookDaoImpl();
    }
}

  1. 配置文件(将之前的注释掉或删掉)
   <bean id="staticFactory" class="org.example.factory.StaticFactory" factory-method="getBookDao"></bean>

实例工厂方式(了解)

  1. 创建一个类书写实例工厂的代码
  2. 配置文件(之前的注释掉)
    <bean id="InstanceDaoFactory" class="org.example.factory.InstanceFactory" ></bean>
    <bean id="bookDao"  factory-bean="InstanceDaoFactory" factory-method="getBookDao"></bean>

实现FactoryBean方式(扩展,了解)

实例化工厂的一种方式

  1. 书写类实现FactoryBean
public class BookDaoFactory implements FactoryBean {
    @Override
    //代替原始实例工厂中创建对象的方法
    public Object getObject() throws Exception {

        System.out.println("FactoryBean ...");
        return new BookDaoImpl();
    }

    @Override
    public Class<?> getObjectType() {
        return BookDao.class;
    }
}

  1. 配置文件
 <bean id="bookDao" class="org.example.factory.BookDaoFactory"></bean>

依赖注入

依赖注入方式

setter注入

要先提供对应的set方法

  1. 引用类型

配置文件中property标签ref属性注入引用类型对象

  1. 简单类型

配置文件中property标签value属性注入引用类型对象

构造器注入(了解)

要先书写对应的构造方法

  1. 引用类型

配置文件中constructor-arg标签ref属性注入引用类型对象

  1. 简单类型

配置文件中constructor-arg标签value属性注入引用类型对象

  1. 参数适配

也可以使用constructor-arg标签中type属性按形参类型注入或index属性按形参位置注入

方式选择

自己开发的模块推荐使用setter方式注入,如果受控对象没有提供setter方法就必须使用构造器注入

依赖自动装配

配置中使用bean标签的autowire属性设置自动装配的类型
使用按类型装配,必须保障容器中相同类型的bean唯一

  <bean id="bookService" class="org.example.service.BookServiceImpl" autowire="byType">
<!--        <property name="bookDao" ref="bookDao"></property>-->
    </bean>

    <bean id="bookDao" class="org.example.dao.BookDaoImpl"></bean>

集合注入

注入数据类型,List类型,Set类型,Map类型,Properties类型

<property name="array">
    <array>
        <value>100</value>
        <value>200</value>
        <value>300</value>
    </array>
</property>

说明:property标签标识setter注入,构造方式注入constructor-arg标签内部也可以写<array>、<list>、<set>、<map>、<props>标签

Bean的生命周期

生命周期相关概念介绍

  • 生命周期:从创建到消亡的完整过程
  • bean生命周期:bean从创建到销毁的整体过程
  • bean生命周期控制:在bean创建后到销毁前做一些事情

bean的生命周期

初始化容器

  1. 创建对象
  2. 执行构造方法
  3. 执行属性注入(set注入)
  4. 执行bean初始化方法

使用bean

  1. 执行业务操作

关闭/销毁容器

  1. 执行bean销毁方法

代码演示

bean生命周期演示

  • 提供生命周期控制方法
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
    //表示bean初始化对应的操作
    public void init(){
        System.out.println("init...");
    }
    //表示bean销毁前对应的操作
    public void destory(){
        System.out.println("destory...");
    }
}
  • 配置文件
<!--init-method:设置bean初始化生命周期回调函数,此处填写init方法名-->
<!--destroy-method:设置bean销毁生命周期回调函数,仅适用于单例对象,此处填写destory方法名-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
  • 测试类
public class AppForLifeCycle {
    public static void main( String[] args ) {
        //此处需要使用实现类类型,接口类型没有close方法
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
        //关闭容器,执行销毁的方法
        ctx.close();
    }
}

bean生命周期控制–接口控制(了解)

  • 实现InitializingBean, DisposableBean接口
public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
    private BookDao bookDao;
    public void setBookDao(BookDao bookDao) {
        System.out.println("set .....");
        this.bookDao = bookDao;
    }
    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
    public void destroy() throws Exception {
        System.out.println("service destroy");
    }
    public void afterPropertiesSet() throws Exception {
        System.out.println("service init");
    }
}
  • 不需要在配置文件中bean标签中写init-method属性和destory-method属性

bean销毁时机

  • 容器关闭前触发bean的销毁
  • 关闭容器的方式
    • 手工关闭容器

ConfigurableApplicationContext接口**close()**操作

  • 注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机

ConfigurableApplicationContext接口**registerShutdownHook()**操作


public class AppForLifeCycle {
    public static void main( String[] args ) {
        //此处需要使用实现类类型,接口类型没有close方法
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
        //注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器
        ctx.registerShutdownHook();
        //关闭容器
        //ctx.close();
    }
}

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

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

相关文章

【超详细】跑通YOLOv8之深度学习环境配置3-YOLOv8安装

环境配置3下载安装内容如下&#xff1a; 1、配置清华等镜像源 2、创建环境 3、下载安装Pytorch 4、下载安装YOLOv8运行环境 版本&#xff1a;Python3.8&#xff08;要求>3.8&#xff09;&#xff0c;torch1.12.0cu113&#xff08;要求>1.8&#xff09; 1、配置清华等镜…

用Arm CCA解锁数据的力量

安全之安全(security)博客目录导读 目录 CCA将如何改变Arm架构呢? 在实践中部署CCA 释放数据和人工智能的全部力量和潜力 早期计算中最大的挑战之一是管理计算资源&#xff0c;以最大化计算效率同时提供给不同程序或用户分配资源的分离。这导致了我们今天大多数使用的时间…

Windows环境下代码文档生成工具Doxygen使用详细教程

背景 最近研究aom源码&#xff0c;发现编译需要依赖Doxygen工具&#xff0c;故此篇博客详细记录下Doxygen的安装和使用。 Doxygen Doxygen 是一个强大的源代码文档生成工具&#xff0c;它支持多种编程语言&#xff0c;能够直接从源代码中的注释提取文档&#xff0c;并生成多…

基于SpringBoot设计模式之创建型设计模式·抽象工厂模式

文章目录 介绍开始架构图&#xff08;以穿搭举例&#xff09;样例一&#xff08;html关于列表和表格的应用&#xff09;定义抽象工厂&#xff08;html&#xff09;定义抽象工厂需要制作抽象产物&#xff08;托盘&#xff09;定义具体工厂&#xff08;列表、表格&#xff09;定义…

Mamba:4 魔幻矩阵A

若在阅读过程中有些知识点存在盲区&#xff0c;可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果构建生成级别的AI架构则可以关注AI架构设计。技术宅麻烦死磕LLM背后的基础模型。 ​Mamba自从出道就一直被拿来和Transformer对比…

HIVE卡口流量需求分析

HIVE卡口流量需求分析 目录 HIVE卡口流量需求分析 1.创建表格 插入数据 2.需求 3.总结&#xff1a; 1.创建表格 插入数据 CREATE TABLE learn3.veh_pass( id STRING COMMENT "卡口编号", pass_time STRING COMMENT "进过时间", pass_num int COMMENT …

懒人网址导航源码v3.9

测试环境 宝塔Nginx -Tengine2.2.3的PHP5.6 MySQL5.6.44 为防止调试错误&#xff0c;建议使用测试环境运行的php与mysql版本 首先用phpMyAdmin导入数据库文件db/db.sql 如果导入不行&#xff0c;请直接复制数据库内容运行sql语句也可以 再修改config.php来进行数据库配置…

AI智能体|我把Kimi接入了个人微信

大家好&#xff0c;我是无界生长。 最近加入AI学习交流群的小伙伴越来越多&#xff0c;我打算在微信群接入一个聊天机器人&#xff0c;让它协助管理微信群&#xff0c;同时也帮忙给群友解答一些问题。普通的群聊机器人肯定是不能满足需求的&#xff0c;得上AI大模型&#xff0c…

EPS软件标注点坐标值

1、如下&#xff0c;点击右侧&#xff08;尺寸标注&#xff09;按钮&#xff1a; 2、弹出一个对话框&#xff0c;如下&#xff1a; 3、在上图对话框中设置好箭头样式和小数位数&#xff0c;然后点击图上一点&#xff0c;右击结束再鼠标指定位置&#xff0c;如下&#xff1a; 如…

同城预约上门服务家政小程序

基于Thinkphp和原生微信小程序开发的一款同城预约、上门服务、到店核销家政系统&#xff0c;用户端、服务端、门店端各端相互依赖又相互独立&#xff0c;支持选择项目、选择服务人员、选择门店多种下单方式&#xff0c;支持上门服务和到店核销两种服务方式&#xff0c;支持自营…

树莓派|连接CSI接口摄像头+opencv

CSI&#xff08;Camera Serial Interface&#xff09;接口摄像头是一种常见的嵌入式系统或移动设备中使用的摄像头接口。它通常用于与处理器或图像传感器进行直接连接&#xff0c;实现高速的图像数据传输。 CSI接口摄像头具有以下特点&#xff1a; 高速传输&#xff1a;CSI接口…

仓库管理流程详解(附作业流程图)

仓库管理流程在企业的日常运营中至关重要。它不仅是物资流转的核心环节&#xff0c;更关乎着企业的运营效率、成本控制和客户服务水平。一个高效、规范的仓库管理流程能够确保货物从入库到出库的各个环节有序进行&#xff0c;减少资源浪费和时间成本&#xff0c;同时帮助企业实…

pdf怎么标注红色方框?五种PDF标注红色方框方法

pdf怎么标注红色方框&#xff1f;在当今数字化时代&#xff0c;PDF文档已成为我们日常工作和学习中不可或缺的一部分。然而&#xff0c;如何在海量的PDF文件中快速、准确地标注出重要信息&#xff0c;让内容更加醒目呢&#xff1f;今天&#xff0c;我将向大家介绍五种PDF标注红…

锁和MVCC如何实现mysql的隔离级别

概述 MVCC解决读的隔离性&#xff0c;加锁解决写的隔离性。 读未提交 读未提交&#xff0c;更新数据大概率使用的是独享锁吧。 读已提交 在 Read Committed&#xff08;读已提交&#xff09;隔离级别下&#xff0c;每次执行读操作时都会生成一个新的 read view。这是因为在读…

【数据结构】-- 相交链表-环形链表

交叉链表 . - 力扣&#xff08;LeetCode&#xff09; 如果链表的两条链的长度一样&#xff0c;链表两端对齐&#xff0c;解决这个问题将会变得非常简单&#xff0c;直接分别遍历两个链表&#xff0c;想等时的节点即为所求。我们想办法让链表对齐--分别从a和b遍历链表&#xff…

VRRP虚拟路由器冗余协议

VRRP概述 VRRP是什么 VRRP&#xff1a;虚拟路由器冗余协议过把几台路由设备联合组成一台虚拟的路由设备&#xff0c;将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信当网关设备发生故障时&#xff0c;VRRP能够选举新的网关设备承担数据流量&#xff0c;从而保障…

2024年最新青龙面板跑脚本教程(一)持续更新中

文章目录 步骤 1: 安装青龙面板步骤 2: 访问青龙面板步骤 3: 上传或创建JavaScript脚本步骤 4: 添加定时任务步骤 5: 查看日志示例脚本步骤 6: 管理依赖和环境变量通用依赖如下&#xff0c;可手动增加。 要在青龙面板上运行JavaScript脚本&#xff0c;首先需要确保你已经成功安…

QCC---Aptx Lossless验证

因为aptx Lossless属于高通骁龙声音的一部分&#xff0c;一般支持高通骁龙声音的设备会支持到&#xff0c;比如说手机&#xff0c;而且还要支持最新的aptx adaptive协议R2.2版本。但是如果手上没有这样的手机的话&#xff0c;有source芯片也可以去做测试验证。在最新的784.1版本…

netcat工具无法使用 -e 参数

当在linux中使用netcat进行反向连接时&#xff0c; nc -e /bin/sh 攻击者的IP 端口 有时会报这种错误&#xff1a; 这说明此netcat不支持 -e 参数。 此时可以做如下更改&#xff1a; 使用mkfifo或mknod命令创建一个命名管道&#xff0c;然后使用cat命令读取管道中的内容&…

重发布与路由决策

单点重发布 将A协议--->B协议 [r2-rip-1]import-route ospf 1 将静态---->B协议 [r2-rip-1]import-route static 将直连---->B协议 [r2-rip-1]import-route direct 双点重发布 路由回馈&#xff1a;指的是从某协议传出的路由信息又被传回该协议中。可以引起选路…