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

news2024/11/19 5:27:50

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

因此,建议加前缀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1035780.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1990-2021年全国31个省人口相关统计面板数据

1990-2021年全国31个省人口相关统计面板数据 1、时间&#xff1a;1990-2021年 2、来源&#xff1a;各省统计年鉴 3、指标&#xff1a;省份代码、年份、省份名称、省份名称、常住人口数、年末常住人口 0-14岁人口数、15-64岁人口数、65岁及以上人口数、6岁及以上人口&#x…

【精品资源】Java毕业设计攻略:从选题到答辩,一站式指南

导读&#xff1a; Java毕业设计是计算机科学与技术专业学生展示其编程能力、问题解决能力和创新思维的重要环节。这篇博客将为您提供一站式的Java毕业设计攻略&#xff0c;帮助您从选题到答辩&#xff0c;顺利完成毕业设计。 一、选题阶段 寻找灵感&#xff1a; 探讨热门技术如…

【Linux】Linux环境基础开发工具使用

Linux安装软件: 源代码安装rpm安装-- Linux安装包yum安装–解决安装源&#xff0c;安装版本&#xff0c;安装依赖 目录 一、Linux 软件包管理器 yum1.查看安装包2.安装软件3.删除软件一些有趣的软件的安装&#x1f47b;1.sl 二、vim编辑器1.使用vim1.模式转换2.命令模式2.底行模…

软件设计模式系列之十三——享元模式

1 模式的定义 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它旨在减少内存占用或计算开销&#xff0c;通过共享大量细粒度对象来提高系统的性能。这种模式适用于存在大量相似对象实例&#xff0c;但它们的状态可以外部化&#xff08;e…

人工神经网络ANN:数学总结

一、内容 径向基函数&#xff08;Radial basis function&#xff0c;RBF&#xff09;&#xff1a;一个取值仅依赖于到原点距离的实值函数&#xff0c;即。此外&#xff0c;也可以按到某一中心点c的距离来定义&#xff0c;即。 可以用于许多向函基数的和来逼近某一给定的函数&a…

SpringBoot使用@Async异步注解

首先&#xff0c;想一想为什么使用异步线程? 举个例子: 当我们请求这个接口的时候,在接口调用了method这个方法 然而被调用的方法执行了一个线程睡眠三秒 因为method方法睡眠了三秒钟,所以这个接口响应的时间肯定是大于三秒。因为接口是从上往下执行的,首先会在控制台输出一…

微信小程序python+nodejs+php+springboot+vue 讲座预约系统

讲座预约管理系统的用户是系统最根本使用者&#xff0c;按需要分析系统包括用户&#xff1a;学生、管理员。 管理员通过后台的登录页面&#xff0c;选择管理员权限后进行登录&#xff0c;管理员的权限包括学生信息管理和文章公告管理。讲座公告管理&#xff0c;添加讲座公告信息…

Swift SwiftUI 隐藏键盘

如果仅支持 iOS 15 及更高版本&#xff0c;则可以通过聚焦和取消聚焦来激活和关闭文本字段的键盘。 在最简单的形式中&#xff0c;这是使用 FocusState 属性包装器和 focusable() 修饰符完成的-第一个存储一个布尔值&#xff0c;用于跟踪第二个当前是否被聚焦。 Code struct C…

洛谷P8815:逻辑表达式 ← CSP-J 2022 复赛第3题

【题目来源】https://www.luogu.com.cn/problem/P8815https://www.acwing.com/problem/content/4733/【题目描述】 逻辑表达式是计算机科学中的重要概念和工具&#xff0c;包含逻辑值、逻辑运算、逻辑运算优先级等内容。 在一个逻辑表达式中&#xff0c;元素的值只有两种可能&a…

JDBC MySQL任意文件读取分析

JDBC MySQL任意文件读取分析 文章首发于知识星球-赛博回忆录。给主管打个广告&#xff0c;嘿嘿。 在渗透测试中&#xff0c;有些发起mysql测试流程(或者说mysql探针)的地方&#xff0c;可能会存在漏洞。在连接测试的时候通过添加allowLoadLocalInfileInPath,allowLoadLocalInf…

分类预测 | MATLAB实现WOA-CNN-GRU-Attention数据分类预测

分类预测 | MATLAB实现WOA-CNN-GRU-Attention数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-GRU-Attention数据分类预测分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现WOA-CNN-GRU-Attention数据分类预测&#xff0c;运行环境Matlab2021b及以上&…

git学习使用

git使用 1、cmd #查看版本 git version2、初识 Git GUI: Git提供的图形界面工具 Git Bash: Git提供的命令行工具 1.打开Git Bash2.设置自己的用户名和邮箱地址git config --global user.name "xxx"git config --global user.email "123456789163.com"查…

zemaxMIF曲线图

调制传递函数&#xff08; Modulation Transfer Function&#xff0c;MTF &#xff09;是用来形容光学系统成像质量的重要指标。 通过对光学系统像空间进行傅里叶变换&#xff0c;可以得到一张分析图表&#xff0c;来描述像面上对比度和空间频率之间的对应关系。 对比度&…

DALL·E 3:大语言模型和文本生图模型的强强联合

1. 概要 就在不久之前&#xff0c;openAI官网发布了DALLE3相关内容&#xff0c;虽然现在还没有开放直接体验DALLE3的途径&#xff0c;但是我们可以先来一览DALLE3的牛逼之处。 相比之前的DALL.E2&#xff0c;DALL.E3对细节方面把握的更好。此外之前的文生图模型对prompt要求比…

Leetcode 2325.解密消息

给你字符串 key 和 message &#xff0c;分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下&#xff1a; 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。将替换表与普通英文字母表对齐&#xff0c;形成对照表。按照对照表 替换 messag…

golang学习笔记(一):基础入门

基础入门 菜鸟教程Go语言环境安装 GoLand开发工具下载 Gin web开发框架 Go 语言流行 ORM 框架 GORM 使用介绍 如何使用Go语言连接分布式MySQL数据库 Go语言依赖搜索网站&#xff0c;类似Maven 添加依赖&#xff1a; 基础知识 1.关键字 go 开启协程执行调用语句/方法。 def…

Spring面试题9:Spring的BeanFactory和FactoryBean的区别和联系

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring的BeanFactory和FactoryBean的区别和联系 区别:BeanFactory是一个工厂接口,主要负责管理和创建Bean实例。它是Spring提供的最底层的…

Centos7虚拟机硬盘扩容 + 修改Docker默认存储位置

文章目录 前言一、Centos7虚拟机硬盘扩容1.1 具体步骤二、修改Docker默认存储位置2.1 挂载目录2.2 修改路径 前言 Vmware 虚拟机开机时提示&#xff1a;虚拟机根目录系统内存不足&#xff0c;可能原因是 /var/lib/docker 目录占用的磁盘空间不够了。本文记录虚拟机磁盘扩容过程…

Doris数据库FE——SQL handleQuery

SQL解析在下文中指的是将一条sql语句经过一系列的解析最后生成一个完整的物理执行计划的过程。这个过程包括以下四个步骤&#xff1a;词法分析、语法分析、生成逻辑计划、生成物理计划。Doris SQL解析具体包括了六个步骤&#xff1a;词法分析&#xff0c;语法分析、语义分析&am…

文件系统详解

目录 文件系统&#xff08;1&#xff09; 第一节文件系统的基本概念 一、文件系统的任务 二、文件的存储介质及存储方式 三、文件的分类 第二节 文件的逻辑结构和物理结构 一、文件的逻辑结构 二、文件的物理结构 文件系统&#xff08;2&#xff09; 第三节 文件目…