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

因此,建议加前缀

相关推荐
咖啡八杯2 小时前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
Flittly1 天前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
咖啡八杯2 天前
GoF设计模式——中介者模式
java·后端·spring·设计模式
Flittly4 天前
【AgentScope Java新手村系列】(14)人机交互
java·spring boot·spring
RainCity4 天前
Java Swing 自定义组件库分享(十二)
java·笔记·后端
唐青枫8 天前
Java Spring WebFlux 实战指南:用 Mono、Flux 和 WebClient 写响应式接口
java·spring
咖啡八杯9 天前
GoF设计模式——策略模式
java·后端·spring·设计模式
Flittly10 天前
【AgentScope Java新手村系列】(11)中断与恢复
java·spring boot·spring
dunky11 天前
Spring 的三级缓存与循环依赖
后端·spring
LinXunFeng11 天前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github