Spring笔记1——XML配置核心容器
2023.02.16
spring是一大套技术集,包括:
- Spring Framework:举足轻重,底层框架,被其他所有技术所依赖。
- Spring Boot:加速开发。
- Spring Cloud:分布式开发。
spring5.0全面支持jdk8(想做spring开发,jdk必须在8以上)。
Spring Framework系统架构
系统架构图中上层依赖于下层
Data Integration:spring内部不仅提供了访问数据集的技术 而且允许spring技术与其他的技术整合使用 集成即包容其他技术
Transactions:spring在事务上做了很大突破 提供了一种效率很高的事务开发方案
AOP:和面向对象编程一样 也是一种编程思想 增强原始程序的功能
Core Container:容器用来装对象(spring是用来管对象的架构)
IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入
为什么要提出IoC和DI?
若要在业务层更换一套新的数据层实现(把dao类换成dao类2),则需要对业务层的代码进行改动(即将new BookDaoImpl换成new BookDaoImpl2)。
这就说明代码的耦合度较高,需要解耦。(解耦的结果其实就是用别的方法代替new语句)
使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。
Spring技术对IoC思想进行了实现
Spring提供了一个容器,称为IoC容器,用来充当ToC思想中的外部
IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为 在容器中建立bean与bean之间的依赖关系的整个过程,称为DI(Dependency Injection)依赖注入
目标:充分解耦
·使用IoC容器管理bean (IoC)
·在IoC容器内将有依赖关系的bean进行关系绑定(DI)
最终效果
·使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系
Ioc入门案例(XML版)
DI入门案例(XML版)
(这个setter方法是容器在执行)
Bean
bean基本配置
bean别名配置
bean的别名,可以在getBean()里被使用,也可以在ref里被使用。
bean作用范围
在一个容器里获取两次同一个bean,得到两个bookDao的地址相同,说明他们就是一个对象。即spring默认创造的bean是单例的。
若spring造出的bean不是非单例的,那么bean的数量会很多。spring管理的对象应该是可以复用的对象(所以就默认用单例模式创造)。
实例化bean的三种方法——构造方法(常用)
spring创造bean的时候调的是无参的构造方法(使用对象时传参会报错)。
看spring的报错:拉下去看最后一行,大概率能解决,不行就再看倒数第二个。
实例化bean的三种方法——静态工厂(了解)
实例化bean的三种方法——实例工厂(了解)
实例化bean的四种方法——FactoryBean
bean生命周期控制——两种方法
方法一:
方法二:
bean生命周期
bean销毁时机
我们写的程序是运行在Java虚拟机中的,虚拟机启动之后,IoC容器加载配置也启动,初始化bean,然后主程序拿到bean,然后执行了save方法,程序执行完之后虚拟机就退出了,也就没有给bean销毁的机会。故而系的destory方法不会被执行。
只有在程序中关闭bean才能使得destory方法被执行。
关闭钩子这个步骤放在容器被创建之后的任何地方都是可以的,因为它不是直接关闭容器,不需要特地放在容器内的bean被用完之后:
而相对地,.close是比较暴力的方法,直接关闭掉容器,所以要放到容器内的bean已经被用完之后。
依赖注入
四种注入方式
引用类型就是对象之类的,简单类型就是数字,字符串之类的。
setter注入——引用类型
可以在一个bean标签下面写多个property标签以注入多个引用类型对象。
setter注入——简单类型
引用数据类型用rel,基本数据类型用value。
构造器注入——引用类型(了解)
构造器注入——简单类型(了解)
构造器注入相比setter注入,只是方法从setter方法换成了构造方法,都是在这两种方法内传值。还有就是xml配置文件的标签与格式有所不同。
使用构造器注入时,标签<constructor-arg>中的属性name是对应类的构造函数中形参的名字,故而这种方法耦合度比较高。
构造器注入——参数适配(了解)
依赖注入方法选择
依赖自动装配
依赖自动装配方式
首先,要想启用自动装配,setter方法还是要用到,不能删(就说明自动装配其实就是自动执行了setter注入)。
其次,在配置文件里<bean>标签下设置属性:
要注意两个事:
1.自动装配的前提也是,配置文件中已经有了BookServiceImpl中提到的那个type的bean,也就是bookDao,若是没有也会失败。
2.若是配置文件中配置了两个同type的bean,那使用bytype的自动配置方法也会出错。
(我觉得其实这个时候,选择按类型自动装配的话,IoC和DI的思想已被实践,而其最终目的——解耦,也已经实现,因为此时若在service层中选择实现另一种dao类,已经不用再去修改service中的代码)
(但是由于有多个同type的bean自动装配bytype会报错,所以可能需要将原来的dao类移出项目)
(但是要移出项目的话,直接让新的dao类沿用老dao类的名字不就行了。。。即使dao类与server类之间有耦合度也不需要改service类中的代码了。。。)
集合注入
spring对外部数据源对象的管理
以druid的DataSource为例:
依赖注入的时候使用构造器方法还是setter方法?没得选,因为这个类不是自己写的,你得看作者给了你什么。查了DruidDataSource.class之后发现其构造方法都不满足依赖注入的使用。而可以找到相关参数的set方法。故而使用setter注入,即<property>标签内填入参数。
( 其实管理外部对象和自己创建的对象思路一致:告诉spring这个类在什么地方,以及实例化对象需要的参数。spring把它实例出来后,在主程序里用getbean拿出来用就行了。)
spring加载properties文件
在spring中开辟了一个新的命名空间context。(把beans改成context)
有个系统环境变量名也叫username,优先级高于properties里的username,所以properties里的命名为username时会出现错误。把context标签里的system-properties-mode设置成NEVER后就不会加载系统变量,也就不会出现这个问题。
最规范的格式:
表示可以读取多个properties文件,而且不仅可以从当前工程里读,还可以从jar包里读。
容器
创建容器
获取bean
容器类层次结构图
BeanFactory
BeanFactory是所有容器类的顶层接口
总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)