Spring学习笔记3 Spring对IOC的实现

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默认去读到的是系统配置的

因此,建议加前缀

相关推荐
喜欢敲代码的程序员9 分钟前
Spring Boot中请求参数读取方式
java·spring boot·后端·spring
MUTA️41 分钟前
《Llama: The Llama 3 Herd of Models》预训练数据篇——论文精读笔记
人工智能·笔记·深度学习
andyguo1 小时前
语音识别的速度革命:从 Whisper 到 Whisper-CTranslate2,我经历了什么?
人工智能·学习·ai·whisper·语音识别·xcode·ai测评
灰小猿1 小时前
多级@JsonTypeInfo和@JsonSubTypes注解使用详解及场景分析
java·后端·mysql·spring·spring cloud
罚时大师月色2 小时前
ssm学习笔记day05
笔记·学习
NE_STOP2 小时前
SpringBoot--Profile你用对了吗
java·spring
fengye2071612 小时前
板凳-------Mysql cookbook学习 (十一--------9)
android·学习·mysql
麟城Lincoln3 小时前
【Linux-云原生-笔记】Apache相关
linux·笔记·云原生·apache·webserver
wu27903 小时前
MYSQL笔记2
数据库·笔记·mysql
小关会打代码4 小时前
每天学习一个Python库之正则表达式库(re)
python·学习·re