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是所有容器类的顶层接口

总结

 

 

 

 

 

posted @   ban_boi  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示