Spring简介IOCDI

文章目录

  • 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{@Overridepublic 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{@Overridepublic 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;@Overridepublic void save() {System.out.println("BookService save...");}@Overridepublic 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 无参构造...");}@Overridepublic 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="bookDao" 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();}@Overridepublic 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标签内部也可以写、、、标签

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.hqwc.cn/news/695598.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue多选功能

废话不多说&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; <template><div class"duo-xuan-page"><liv-for"(item, index) in list":key"index"click"toggleSelection(item)":class"{ active: sel…

山西教育杂志山西教育杂志社山西教育编辑部2024年第4期目录

课题研究 小学语文随堂小练笔策略研究 陈立固; 3-4 儿童戏剧工作坊载体下小学语文戏剧课堂的建构 郭黎明; 5-6《山西教育》投稿&#xff1a;cn7kantougao163.com 文化生态视域下小学英语教学的传统文化融入 周慧娟; 7-8 基于“主题语境”的初中英语课堂教学研究…

未来已来!这三款数字孪生产品你不能错过

随着科技的不断进步&#xff0c;数字孪生技术已经逐渐渗透到我们生活的各个领域。数字孪生&#xff0c;简而言之&#xff0c;就是在虚拟世界中构建一个与物理世界相对应的数字模型&#xff0c;通过实时数据采集和分析&#xff0c;为各种行业和领域提供更高效、更精确的决策支持…

微信小程序之转盘抽奖

1. 实现效果 2. 实现过程 话不多说&#xff0c;直接上代码 /**index.wxml */ <view class"title">旋转大转盘</view> <view class"rote-box fcc"><view class"box fcc"><image class"bg" src"/stat…

VTK图形算法API:vtkSphereSource,球几何数据

大家好&#xff0c;我是先锋&#xff0c;专注于AI领域和编程技术分享&#xff0c;在这里定期分享计算机编程知识&#xff0c;AI应用知识&#xff0c;职场经验&#xff1b; 本系列介绍VTK图像算法API&#xff0c;后续会介绍VTK项目实践应用&#xff0c;关注我&#xff0c;不错过…

信息量、熵、KL散度、交叉熵概念理解

信息量、熵、KL散度、交叉熵概念理解 (1) 信息量 信息量是对事件的不确定性的度量。 假设我们听到了两件事&#xff0c;分别如下&#xff1a;事件A&#xff1a;巴西队进入了世界杯决赛圈。 事件B&#xff1a;中国队进入了世界杯决赛圈。仅凭直觉来说&#xff0c;显而易见事件…

【Shell】正则表达式的操作实例

正则表达式是一个描述一组字符串的模式 是由普通字符和元字符组成的字符集&#xff0c;而这个字符集匹配&#xff08;或指定&#xff09;一个模式。 正则表达式的操作实例 &#xff08;一&#xff09;概述1.定义2.作用3.类型 &#xff08;二&#xff09;字符串匹配实例&#xf…

光伏EPC管理软件都有哪些功能和作用?

光伏EPC管理软件是用于光伏工程项目管理的综合性工具&#xff0c;它涵盖了从项目策划、设计、采购、施工到运维的各个环节。 1、项目总览 管理所有项目计划&#xff0c;包括项目类型、项目容量等。 调整和优化项目计划&#xff0c;以应对不可预见的情况。 2、施工管理 制定…

上传到 PyPI

将软件包上传到 PyPI&#xff08;Python Package Index&#xff09;&#xff0c;您需要遵循以下步骤&#xff1a; 准备软件包&#xff1a;确保您的软件包满足以下要求&#xff1a; 包含一个 setup.py 文件&#xff0c;用于描述软件包的元数据和依赖项。包含软件包的源代码和必要…

QT的创建,发现编译器有一个黄色三角形感叹号,提示说Cmake配置错误,该怎么办?

确保你安装了Cmake 2.如果你电脑之前已经装了Cmake&#xff0c;那么在qt安装中&#xff0c;即便你选择了Cmake版本&#xff0c;但依旧不会修改电脑的Cmake版本。这时候就会出现黄色箭头。在勾勾的地方会有一个黄色感叹符号&#xff08;我已经解决了&#xff0c;所以没有显示&a…

持续集成-Git

重要步骤命令 git init (初始化一个仓库) git add [文件名] (添加新的文件) git commit -m [关于本次提交的相关说明] (提交) git status (查看文件状态) git diff (如果文件改变&#xff0c;比较两个文件内容) git add[文件名] || git commit -a -m [关于本次提交的相关说…

【SpringBoot记录】从基本使用案例入手了解SpringBoot-数据访问-更改DataSource(2)

前言 通过上一个数据访问基本案例成功可以发现&#xff0c;SpringBoot在数据访问案例中也做了许多自动配置&#xff0c;上节只分析了其中的Properties。 而在自动配置包的jdbc下 还有其他配置文件。 根据名称可以大致了解他们的作用&#xff1a; DataSourceAutoConfiguration…