Spring学习笔记2 Spring的入门程序_biubiubiu0706的博客-CSDN博客
控制反转是一种思想
控制反转是为了降低程序耦合度,提高程序扩展力,达到OCP(开闭原则)原则,达到DIP(依赖倒置原则)原则
控制反转,反转的是什么?
1.将对象的创建权力交出去,交给第三方容器负责
2.对象与对象之间关系的维护权交出去,交给第三方容器负责
控制反转这种思想如何实现---->DI依赖注入
一句话:通过DI依赖注入实现IOC控制反转 控制反转是思想,依赖注入是实现
依赖注入常见方式2种
1.Set注入
2.构造注入
新建模块时候报错,看样子IDEA也要更新了
引入依赖
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.0.10</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <!--Log4j2依赖--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.19.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.19.0</version> </dependency> </dependencies>
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <loggers> <!-- level指定⽇志级别,从低到⾼的优先级: ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF --> <root level="DEBUG"> <appender-ref ref="spring6log"/> </root> </loggers> <appenders> <!--输出⽇志信息到控制台--> <console name="spring6log" target="SYSTEM_OUT"> <!--控制⽇志输出的格式--> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/> </console> </appenders> </configuration>
Spring配置文件
<?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"> </beans>
1.Set注入,基于set方法实现,底层会通过反射机制调用属性对应的set方法然后给属性赋值.这种方式要求属性必须对外提供set方法
使用IDEA生成的set方法
搞清楚 Set注入本质
找不到setvipdao的方法
原因是Set注入 name是set方法名,取掉set首字母转小写才行
依赖注入之构造方法注入
set注入,先要有对象,对象执行set方法
而构造注入是创建对象的同时,给属性赋值 注入的时机不一样
业务层新建一个类 新建一个beans2.xml演示构造方法注入
测试
上面用下标指定参数,也可以用name 参数名字指定 还可以不指定下标,也不指定参数名,让Spring自己做类型匹配
构造注入和Set注入,一般set注入相对较多
set注入专题:(必须提供set方法)
1.注入外部Bean和注入内部bean
新建个Spring配置文件 取名set-di.xml专配用于set注入
新建个OrderDao
新建个OrderService
此种方式就是外部bean ref引入
日志太多可以
调整下
演示内部bean
在property标签中使用嵌套bean就叫内部bean
测试
2.set注入,注入简单类型
原先通过set方法注入的是OrderDao 引入类型
下面看下 简单类型的注入
新建一个类 提供set方法 和toString方法
在Spring配置文件 set-di里配置
测试
那么所谓的简单类型包括什么呢,哪些是简单类型
Spring中有个工具类 双击SHIFT 或者 CTRL+N
搜索 BeansUtils
按ALT+7 可以看到这个类里所有方法
查看isSimpleValueType这个方法 这个方法就是Spring判定是否是简单类型的方法
测试几个简单类型 定义个枚举
测试new Date()的输出格式 Sat Sep 23 00:41:46 CST 2023
都提供相应的set方法 提供toString方便输出看值
在set-di.xml里配置
测试
set注入简单类型的经典应用
举例:数据源,DataSource
测试
set注入之级联属性赋值
创建两个类测试
配置
测试
上面并不是所谓的级联属性赋值
set方法注入数组(数组里面可能是简单类型,也可能不是简单类型)
先演示数组里面是简单类型
演示数组里面不是简单类型
新建类
Person添加属性并重写set方法 toString只为输出时候看的方便
测试
set注入List和Set集合
set注入List集合
新建类
测试
Set注入Map集合
注意:如果Map的key value不是简单类型的配置
Map还有一个特殊的类Properties 继承Hashtable
set注入 注入null和空字符串
set注入 注入特殊字符
xml中有5个特殊符号,分别是: 大于号 > 小于号 < 单引号 ' 双引号 " 与 &
实体符号代替特殊符号 对照表
set注入 p命名空间注入也是基于set方法
注意:P空间注入底层还是set注入,只不过P命名空间注入可以让Spring配置变得更简单
新建类
新建配置文件spring-p.xml
C命名空间注入 是为了简化构造注入
新建类
新建配置文件 可以用简单注入 也可以用ref
util命名空间让配置复用
使用util命名空间可以让配置复用
使用util命名空间的前提是:在Spring配置文件头部添加配置信息.
所谓的配置复用 新建两个类
原先的配置方式 但是重复
用util命名空间让配置复用
简写后
测试
基于XML的自动装配(无论是byName还是byType都是基于set方法的)
Spring还可以完成自动化注入,自动化注入又称为自动装配,它可以根据名字进行自动装配,也可以根据类型进行自动装配
根据名称自动装配
以OrderDao和OrderService演示
新建个配置文件 spring-autowire.xml
原先的写法
测试
自动装配 byName测试 如果是Idea工具自动生成set方法,那么就是和变量名相同(关键严格记住set方法名去掉set首字母小写)
被注入的对象,被注入的对象
基于XML自动装配 byType
下面用Customer演示 添加无参构造 和set方法
注意 byType的话 如果类型有两个 会报错
比如
引入外部属性配置文件
比如现在有个类,类里属性来自于属性配置文件
创建jdbc.properties
新建个配置文件 spring-properties
引入外部文件写法
为什么出现这种情况原因: ${user} Spring默认去读到的是系统配置的
因此,建议加前缀